In Windows 10 Professional, use multiple Laravel Sail environments and set your desired domain name
1. Install Nginx Proxy Manager, open the Windows Terminal command line, and follow the instructions below to enter the Ubuntu system. as shown in Figure 1
2. Enter the user root directory, create a new directory: proxy-manager, enter the directory: proxy-manager, create a file: docker-compose.yml. as shown in Figure 2
wangqiang@desktop-qlpk8qm:/mnt/c/users/lenovo$ cd ~ wangqiang@desktop-qlpk8qm:~$ mkdir proxy-manager wangqiang@desktop-qlpk8qm:~$ls proxy-manager wangqiang@desktop-qlpk8qm:~$ cd proxy-manager/ wangqiang@desktop-qlpk8qm:~/proxy-manager$ nano docker-compose.yml
3. Edit the file: docker-compose.yml, save and exit the nano, press Ctrl+O, and then press Enter. Press Ctrl+X again. HTTP & HTTPS all use preset values. POST 81 is used for the admin page, so that we can set up the Proxy of Laravel SSIL. If you have a small number of projects, it is enough to use sqlite. I generally disable IPv6 for development environment. Save and then start the container. as shown in Figure 3
version:3 Services: app: image:jc21/nginx-proxy-manager:latest Restart: always ports: # public http port: -80:80 # public https port: -443:443 # admin web port: -81:81 environment: # these are the settings to access your DB db_sqlite_file:/data/database.sqlite # uncomment this if ipv6 is not enabled on your host disable_ipv6:true volumes: -./data:/data -./letsencrypt:/etc/letsencrypt
4. Run the command: docker-compose up -d , report an error: error: yaml.scanner.ScannerError. The final decision is to re-edit and save using VI. as shown in Figure 4
wangqiang@desktop-qlpk8qm:~/proxy-manager$ docker-compose up -d Error: yaml.scanner.ScannerError: while scanning for the next token found character\tThat cannot start any token in "./docker-compose.yml", line 5, column 1 wangqiang@desktop-qlpk8qm:~/proxy-manager$ vi docker-compose.yml wangqiang@desktop-qlpk8qm:~/proxy-manager$ docker-compose up -d Creating network "proxy-manager_default" with the default driver pulling app (JC21/NGINX-proxy-manager:latest)... Latest: pulling from jc21/nginx-proxy-manager 72a69066d2fe: pull complete 6aacc5ddb486: pull complete E7C90551CEA0: pull complete f3fbe2c2c4ff: pull complete 4437e5607361: pull complete AC0AF67384BA: pull complete 70e9cf3ce040: pull complete 20ca9bfa0d5d: pull complete 3d5ed869606f: pull complete 3d8d02d01e35: pull complete EB6A6398E23F: pull complete 44ce8be92956: pull complete df1a765de03: pull complete a59ede055db9: pull complete 536e2fa9b52d: pull complete a83af78253da: pull complete 75E669CB8E7A: pull complete 1DCB53004E40: pull complete d96b3a386f37: pull complete 59E305E29011: pull complete 3bbeaee21d7f: pull complete b65ab8da1424: pull complete FAC215856462: pull complete 6aaf9d409d6a: pull complete 09b699c9559f: pull complete 0d0f50cd276a: pull complete Digest: SHA256:09316A7C425270F62600552D3115A2A98EA55397E26B43BDFD4B138F9A2AC2 Status: downloaded newer image for JC21/NGINX-proxy-manager:latest Creating proxy-manager_app_1 ... done wangqiang@desktop-qlpk8qm:~/proxy-manager$
5. Seeing the last prompt is green, indicating that the container was created successfully. Now open the URL: http://localhost:81 . Email: admin@example.com Password: changeme . Login is successful, as shown in Figure 5
6. Create a Laravel Sail project 1, execute the command: curl -s https://laravel.build/sail-project-1 | bash
wangqiang@desktop-qlpk8qm:/mnt$ cd e wangqiang@desktop-qlpk8qm:/mnt/e$ cd wwwroot/ wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot$ curl -s https://laravel.build/sail-project-1 | bash _ | | | | | | | __ _ _ __ __ ___ _____ | | | / _` |__/ _` \ / / _ \ | | |___| (_| | | | (_| |\v / __/ | |_____\__,_|_| \__,_| \_/ \___|_| warning: tty mode requires /dev/tty to be read/writable. Creating a "Laravel/Laravel" project at "./sail-project-1" Installing Laravel/Laravel (v8.6.9) - Download Laravel/Laravel (v8.6.9) - Installing Laravel/Laravel (v8.6.9): Extracting Archive Created project in /opt/sail-project-1 > @php -r "file_exists(.env) || copy(.env.example,.env);" Loading composer repositories with package information Updating dependencies lock file operations: 110 installs, 0 updates, 0 removals - Locking ASM89/Stack-Cors (v2.0.3) - locking brick/math (0.9.3) - locking dflydev/dot-access-data (v3.0.1) - Locking Doctrine/Inflector (2.0.4) - Locking Doctrine/Instantiator (1.4.0) - Locking doctrine/lexer (1.2.1) - locking dragonmantank/cron-expression (v3.1.0) - Locking egulias/email-validator (2.1.25) - locking facade/flare-client-php (1.9.1) - Locking Facade/Ignition (2.17.2) - locking facade/ignition-contracts (1.0.2) - Locking FakerPHP/Faker (v1.17.0) - Locking filp/whoops (2.14.4) - Locking fruitcake/Laravel-cors (v2.0.4) - Locking Graham-Campbell/Result-Type (v1.0.4) - Locking guzzlehttp/guzzle (7.4.1) - Locking guzzlehttp/promises (1.5.1) - Locking GuzzleHTTP/PSR7 (2.1.0) - Locking Hamcrest/Hamcrest-php (v2.0.1) - Locking Laravel/Framework (v8.77.1) - Locking Laravel/Sail (v1.12.12) - Locking Laravel/Sanctum (v2.13.0) - locking laravel/serializable-closure (v1.0.5) - Locking Laravel/Tinker (v2.6.3) - Locking League/CommonMark (2.1.0) - Locking League/Config (v1.1.1) - Locking League/FlySystem (1.1.9) - Locking League/MIME-Type-detection (1.9.0) - Locking Mockery/Mockery (1.4.4) - locking monolog/monolog (2.3.5) - locking mylabs/deep-copy (1.10.2) - Locking Nesbot/Carbon (2.55.2) - Locking nette/schema (v1.2.2) - Locking nette/utils (v3.2.6) - Locking Nikic/PHP-Parser (v4.13.2) - Locking Nunomaduro/Collision (v5.10.0) - Locking OPIS/Closure (3.6.2) - Locking Phar-io/Manifest (2.0.3) - Locking Phar-io/Version (3.1.0) - locking phpDocumentor/reflection-common (2.2.0) - locking phpDocumentor/reflection-docblock (5.3.0) - Locking phpDocumentor/type-resolver (1.5.1) - locking phpooption/phpooption (1.8.1) - Locking phpsspec/prophecy (v1.15.0) - locking phpunit/php-code-coverage (9.2.10) - locking phpunit/php-file-iterator (3.0.6) - locking phpunit/php-invoker (3.1.1) - locking phpunit/php-text-template (2.0.4) - locking phpunit/php-timer (5.0.3) - locking phpunit/phpunit (9.5.10) - Locking PSR/Container (1.1.2) - Locking PSR/Event-Dispatcher (1.0.0) - Locking PSR/HTTP-Client (1.0.1) - Locking PSR/HTTP-Factory (1.0.1) - Locking PSR/HTTP-Message (1.0.1) - locking PSR/log (2.0.0) - Locking PSR/Simple-Cache (1.0.1) - Locking PSY/PSYSH (v0.10.12) - Locking Ralouchie/GetAllHeaders (3.0.3) - Locking Ramsey/Collection (1.2.2) - Locking Ramsey/UUID (4.2.3) - locking sebastian/cli-parser (1.0.1) - locking sebastian/code-unit (1.0.8) - locking sebastian/code-unit-reverse-lookup (2.0.3) - Locking Sebastian/Comparator (4.0.6) - Locking Sebastian/Complexity (2.0.2) - Locking Sebastian/Diff (4.0.4) - Locking Sebastian/Environment (5.1.3) - Locking Sebastian/Exporter (4.0.4) - Locking Sebastian/Global-State (5.0.3) - locking sebastian/lines-of-code (1.0.3) - locking sebastian/object-enumerator (4.0.4) - locking sebastian/object-reflector (2.0.4) - locking sebastian/recursion-context (4.0.4) - locking sebastian/resource-operations (3.0.3) - Locking Sebastian/Type (2.3.4) - Locking Sebastian/Version (3.0.2) - Locking Swiftmailer/SwiftMailer (v6.3.0) - locking symfony/console (v5.4.1) - Locking symfony/CSS-selector (v6.0.1) - locking symfony/deprecation-contracts (v3.0.0) - locking symfony/error-handler (v5.4.1) - locking symfony/event-dispatcher (v6.0.1) - locking symfony/event-dispatcher-contracts (v3.0.0) - locking symfony/finder (v5.4.0) - locking symfony/http-foundation (v5.4.1) - locking symfony/http-kernel (v5.4.1) - Locking Symfony/MIME (v5.4.0) - locking symfony/polyfill-ctype (v1.23.0) - locking symfony/polyfill-iconv (v1.23.0) - locking symfony/polyfill-intl-graphe (v1.23.1) - locking symfony/polyfill-intl-idn (v1.23.0) - locking symfony/polyfill-intl-normalizer (v1.23.0) - locking symfony/polyfill-mbstring (v1.23.1) - locking symfony/polyfill-php72 (v1.23.0) - Locking symfony/polyfill-php73 (v1.23.0) - locking symfony/polyfill-php80 (v1.23.1) - locking symfony/polyfill-php81 (v1.23.0) - locking symfony/process (v5.4.0) - locking symfony/routing (v5.4.0) - locking symfony/service-contracts (v2.4.1) - locking symfony/string (v6.0.1) - locking symfony/translation (v6.0.1) - locking symfony/translation-contracts (v3.0.0) - locking symfony/var-dumper (v5.4.1) - Locking theseer/tokenizer (1.2.1) - locking tijsverkoyen/css-to-inline-styles (2.2.4) - Locking vlucas/phpdotenv (v5.4.1) - Locking Voku/Portable-ASCII (1.5.6) - Locking WebMozart/Assert (1.10.0) Writing lock file Installing dependencies from lock file (inclusion require-dev) Package operations: 110 installs, 0 updates, 0 removals - Downloading Doctrine/Inflector (2.0.4) - downloading doctrine/lexer (1.2.1) - downloading dragonmantank/cron-expression (v3.1.0) - downloading symfony/var-dumper (v5.4.1) - downloading symfony/string (v6.0.1) - downloading PSR/Container (1.1.2) - downloading symfony/service-contracts (v2.4.1) - downloading symfony/console (v5.4.1) - downloading PSR/log (2.0.0) - downloading monolog/monolog (2.3.5) - downloading voku/portable-ascii (1.5.6) - downloading phpooption/phpoption (1.8.1) - downloading graham-campbell/result-type (v1.0.4) - downloading vlucas/phpdotenv (v5.4.1) - downloading symfony/CSS-selector (v6.0.1) - downloading tijsverkoyen/css-to-inline-styles (2.2.4) - downloading symfony/routing (v5.4.0) - downloading symfony/polyfill-php72 (v1.23.0) - downloading symfony/polyfill-intl-idn (v1.23.0) - downloading symfony/mime (v5.4.0) - downloading symfony/http-foundation (v5.4.1) - Download PSR/Event-Dispatcher (1.0.0) - downloading symfony/event-dispatcher-contracts (v3.0.0) - downloading symfony/event-dispatcher (v6.0.1) - downloading symfony/error-handler (v5.4.1) - downloading symfony/http-kernel (v5.4.1) - downloading symfony/finder (v5.4.0) - downloading symfony/polyfill-iconv (v1.23.0) - downloading egulias/email-validator (2.1.25) - Downloading SwiftMailer/SwiftMailer (v6.3.0) - downloading symfony/polyfill-php81 (v1.23.0) - Downloading Ramsey/Collection (1.2.2) - downloading brick/math (0.9.3) - downloading ramsey/uuid (4.2.3) - downloading PSR/simple-cache (1.0.1) - downloading opis/closure (3.6.2) - downloading symfony/translation-contracts (v3.0.0) - downloading symfony/translation (v6.0.1) - Download Nesbot/Carbon (2.55.2) - Downloading League/MIME-Type-detection (1.9.0) - Downloading League/FlySystem (1.1.9) - Downloading nette/utils (v3.2.6) - Downloading nette/schema (v1.2.2) - downloading dflydev/dot-access-data (v3.0.1) - Downloading League/Config (v1.1.1) - Downloading League/CommonMark (2.1.0) - Download Laravel/Serializable-Closure (v1.0.5) - Download Laravel/Framework (v8.77.1) - Download Facade/Ignition-Contracts (1.0.2) - downloading facade/flare-client-php (1.9.1) - Download Facade/Ignition (2.17.2) - downloading fakerphp/faker (v1.17.0) - Download ASM89/Stack-Cors (v2.0.3) - downloading fruitcake/Laravel-cors (v2.0.4) - downloading PSR/Http-message (1.0.1) - Download PSR/HTTP-Client (1.0.1) - Download raluphie/GetAllHeaders (3.0.3) - downloading PSR/HTTP-factory (1.0.1) - downloading guzzlehttp/psr7 (2.1.0) - downloading guzzlehttp/promises (1.5.1) - downloading guzzlehttp/guzzle (7.4.1) - Download Laravel/Sail (v1.12.12) - Download Laravel/Sanctum (v2.13.0) - downloading nikic/php-parser (v4.13.2) - Downloading PSY/PSYSH (v0.10.12) - Download Laravel/Tinker (v2.6.3) - downloading hamcrest/hamcrest-php (v2.0.1) - downloading mockery/mockery (1.4.4) - downloading filp/whoops (2.14.4) - downloading nunomaduro/collision (v5.10.0) - downloading phpunit/php-file-iterator (3.0.6) - downloading phpunit/php-code-coverage (9.2.10) - downloading phpspec/prophecy (v1.15.0) - Installing Doctrine/Inflector (2.0.4): Extracting Archive - Installing Doctrine/Lexer (1.2.1): Extracting Archive - Installing symfony/polyfill-ctype (v1.23.0): Extracting Archive - Installing WebMozart/Assert (1.10.0): Extracting Archive - Installing DragonMantank/cron-expression (v3.1.0): Extracting Archive - Installing symfony/polyfill-php80 (v1.23.1): Extracting Archive - Installing symfony/polyfill-mbstring (v1.23.1): Extracting Archive - Installing symfony/var-dumper (v5.4.1): Extracting Archive - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting Archive - Installing symfony/polyfill-intl-graphe (v1.23.1): Extracting Archive - Installing symfony/string (v6.0.1): Extracting Archive - Installing PSR/Container (1.1.2): Extracting Archive - Installing symfony/service-contracts (v2.4.1): extracting archives - Installing symfony/polyfill-php73 (v1.23.0): Extracting Archive - Installing symfony/deprecation-contracts (v3.0.0): Extracting Archive - Installing symfony/console (v5.4.1): Extracting Archive - Installing PSR/Log (2.0.0): Extracting Archive - Installing monolog/monolog (2.3.5): Extracting Archive - Installing voku/portable-ascii (1.5.6): Extracting Archive - Installing phpooption/phpoption (1.8.1): Extracting Archive - Installing grad-campbell/result-type (v1.0.4): extracting archive - Installing vlucas/phpdotenv (v5.4.1): Extracting Archive - Installing symfony/CSS-selector (v6.0.1): Extracting Archive -Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting Archive - Installing Symfony/Routing (v5.4.0): Extracting Archive - Installing Symfony/Process (v5.4.0): Extracting Archive - Installing symfony/polyfill-php72 (v1.23.0): extracting archive - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting Archive - Installing symfony/MIME (v5.4.0): Extracting Archive - Installing symfony/http-foundation (v5.4.1): Extracting Archive - Installing PSR/Event-Dispatcher (1.0.0): Extracting Archive - Installing Symfony/Event-Dispatcher-Contracts (v3.0.0): Extracting Archive - Installing Symfony/Event-Dispatcher (v6.0.1): Extracting Archive - Installing symfony/error-handler (v5.4.1): Extracting Archive - Installing symfony/http-kernel (v5.4.1): Extracting Archive - Installing symfony/finder (v5.4.0): Extracting Archive - Installing symfony/polyfill-iconv (v1.23.0): Extracting Archive - Installing egulias/email-validator (2.1.25): Extracting Archive - Installing SwiftMailer/SwiftMailer (v6.3.0): Extracting Archive - Installing symfony/polyfill-php81 (v1.23.0): Extracting Archive - Installing Ramsey/Collection (1.2.2): Extracting Archive - Installing Brick/Math (0.9.3): Extracting Archive - Installing Ramsey/UUID (4.2.3): Extracting Archive - Installing PSR/simple-cache (1.0.1): Extracting Archive - Installing OPIS/Closure (3.6.2): Extracting Archive - Installing symfony/translation-contracts (v3.0.0): extracting archives - Installing symfony/translation (v6.0.1): Extracting Archive - Installing Nesbot/Carbon (2.55.2): Extracting Archive - Installing League/MIME-Type-detection (1.9.0): Extracting Archive - Installing League/FlySystem (1.1.9): Extracting Archive - Installing nette/utils (v3.2.6): Extracting Archive - Installing nette/schema (v1.2.2): Extracting Archive - Installing dflydev/dot-access-data (v3.0.1): extracting archive - Installing League/Config (v1.1.1): Extracting Archive - Installing League/CommonMark (2.1.0): Extracting Archive - Installing Laravel/Serializable-Closure (v1.0.5): Extracting Archive - Installing Laravel/Framework (v8.77.1): Extracting Archive - Installing Facade/Ignition-Contracts (1.0.2): Extracting Archive - Installing facade/flare-client-php (1.9.1): extracting archive - Installing Facade/Ignition (2.17.2): Extracting Archive - Installing FakerPHP/Faker (v1.17.0): Extracting Archive - Installing ASM89/Stack-Cors (v2.0.3): Extracting Archive - Installing fruitcake/Laravel-cors (v2.0.4): Extracting Archive - Installing PSR/Http-Message (1.0.1): Extracting Archive - Installing PSR/Http-Client (1.0.1): Extracting Archive - Installing Ralouchie/GetAllHeaders (3.0.3): Extracting Archive - Installing PSR/Http-factory (1.0.1): Extracting Archive - Installing GuzzleHttp/PSR7 (2.1.0): Extracting Archive - Installing GuzzleHttp/Promises (1.5.1): Extracting Archive - Installing GuzzleHttp/Guzzle (7.4.1): Extracting Archive - Installing Laravel/Sail (v1.12.12): Extracting Archive - Installing Laravel/Sanctum (v2.13.0): Extracting Archive - Installing Nikic/PHP-Parser (v4.13.2): Extracting Archive - Installing PSY/PSYSH (v0.10.12): Extracting Archive - Installing Laravel/Tinker (v2.6.3): Extracting Archive - Installing Hamcrest/Hamcrest-php (v2.0.1): Extracting Archive - Installing mockery/mockery (1.4.4): Extracting Archive - Installing FILP/WHOOPS (2.14.4): Extracting Archive - Installing Nunomaduro/Collision (v5.10.0): Extracting Archive - Installing phpDocumentor/reflecting-common (2.2.0): extracting archive - Installing phpDocumentor/type-resolver (1.5.1): extracting archive - Installing phpDocumentor/reflection-docblock (5.3.0): extracting archive - Installing Sebastian/Version (3.0.2): Extracting Archive - Installing Sebastian/Type (2.3.4): Extracting Archive - Installing Sebastian/Resource-Operations (3.0.3): Extracting Archive - Installing Sebastian/Recursion-Context (4.0.4): Extracting Archive - Installing Sebastian/Object-Reflector (2.0.4): Extracting Archive - Installing Sebastian/Object-Enumerator (4.0.4): Extracting Archive - Installing Sebastian/Global-State (5.0.3): Extracting Archive - Installing Sebastian/Exporter (4.0.4): Extracting Archive - Installing Sebastian/Environment (5.1.3): Extracting Archive - Installing Sebastian/Diff (4.0.4): Extracting Archive - Installing Sebastian/Comparator (4.0.6): Extracting Archive - Installing Sebastian/Code-Unit (1.0.8): Extracting Archive - Installing sebastian/cli-parser (1.0.1): Extracting Archive - Installing phpunit/php-timer (5.0.3): Extracting Archive -Installing phpunit/php-text-template (2.0.4): extracting archive - Installing phpunit/php-invoker (3.1.1): Extracting Archive - Installing phpunit/php-file-iterator (3.0.6): extracting archive - Installing theseer/Tokenizer (1.2.1): Extracting Archive - Installing Sebastian/Lines-of-Code (1.0.3): Extracting Archive - Installing Sebastian/Complexity (2.0.2): Extracting Archive - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting Archive - Installing phpunit/php-code-coverage (9.2.10): extracting archive - Installing Doctrine/Instantiator (1.4.0): Extracting Archive - Installing PHPSPEC/prophecy (v1.15.0): Extracting Archive - Installing Phar-io/Version (3.1.0): Extracting Archive - Installing Phar-io/Manifest (2.0.3): Extracting Archive - Installing mylabs/deep-copy (1.10.2): Extracting Archive - Installing phpunit/phpunit (9.5.10): Extracting Archive 76 Package suggests were added by new dependencies, use `Composer suggest` to see details. Package SwiftMailer/SwiftMailer is bandoned, you should avoid using it. Use symfony/mailer instead. GENERATING OPTIMIZED AUTOLOAD FILES > Illuminate\Foundation\ComposerScripts::PostAutoLoadDump > @php artisan package:discover --ansi Discovered Package: Facade/Ignition Discovered Package: Fruitcake/Laravel-Cors Discovered Package: Laravel/Sail Discovered Package: Laravel/Sanctum Discovered Package: Laravel/Tinker Discovered Package: Nesbot/Carbon Discovered Package: NUNOMADURO/COLLISION Package manifested successfully. 77 packages you are using are looking for funding. Use the `Composer Fund` command to find out more! > @php artisan vendor:publish --tag=laravel-assets --ansi --force No Publishable Resources for Tag[laravel-assets]. publishing complete. > @php artisan key:generate --ansi Application key set successfully. Application Ready! Build Something Amazing. Sail Scaffolding Installed Successfully. Please provide your password so we can make some final adjustments to your applications permissions. [sudo]Password for wangqiang: Thank you! We hope you build something incredible. Dive in with: cd sail-project-1 &∓ ./vendor/bin/sail up wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot$
7. Open the editor, edit the .env file, and add the following configuration items. These are all Sail’s preset services, and their ports cannot be repeated and cannot be repeated with other containers. Generally speaking, ports 49152 to 65535 are idle and can be used. as shown in Figure 6
app_port=48080 forward_db_port=43306 forward_redis_port=46379 FOWARD_MEILISEARCH_PORT=47700 FOWARD_MAILHOG_PORT=41025 FOWARD_MAILHOG_DASHBOARD_PORT=48025
8. Enter the directory: Sail-Project-1, execute the command: Sail up -d. as shown in Figure 7
wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot$ cd Sail-project-1/ wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-1$ ls README.md bootstrap config package.json resources storage webpack.mix.js app composer.json database phpunit.xml routes tests Artisan composer.lock docker-compose.yml public server.php vendor wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-1$ wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-1$ wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-1$ alias Sail=bash vendor/bin/sail wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-1$ Sail up -D Creating network "sail-project-1_sail" with driver "bridge" Creating volume "sail-project-1_sailmysql" with local driver Creating volume "sail-project-1_sailredis" with local driver Creating volume "sail-project-1_sailmeilisearch" with local driver Creating Sail-Project-1_MeiliSearch_1 ... done Creating sail-project-1_selenium_1 ... done Creating sail-project-1_mysql_1 ... done Creating sail-project-1_mailhog_1 ... done Creating sail-project-1_redis_1 ... done Creating Sail-Project-1_Laravel.test_1 ... done wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-1$
9. The start of the first Sail project is completed. as shown in Figure 8
10. Then start the second Sail project and execute the command: curl -s https://laravel.build/sail-project-2 | bash. The steps are the same, except that the content of the .env file is different. All port numbers are added by 1, and no port conflict error is reported. as shown in Figure 9
app_port=48081 forward_db_port=43307 forward_redis_port=46380 FOWARD_MEILISEARCH_PORT=47701 FOWARD_MAILHOG_PORT=41026 FOWARD_MAILHOG_DASHBOARD_PORT=48026
wangqiang@desktop-qlpk8qm:/mnt/e/wwwroot/sail-project-2$ Sail up -d Creating network "sail-project-2_sail" with driver "bridge" Creating sail-project-2_redis_1 ... done Creating sail-project-2_mailhog_1 ... done Creating Sail-Project-2_MeiliSearch_1 ... Done Creating sail-project-2_selenium_1 ... done Creating sail-project-2_mysql_1 ... done Creating sail-project-2_laravel.test_1 ... done
11. In both projects, edit the view file to make no distinction. http://localhost:48080/ , http://localhost:48081/ . As shown in Figure 10
12 Now set the domain names of the two projects respectively. Edit the C:/Windows/System32/Drivers/etc/hosts file to specify the mapping relationship between IP and domain name.
127.0.0.1 Sail-Project-1.Test 127.0.0.1 Sail-Project-2.Test
13. Open Nginx Proxy Manager, hosts – proxy hosts – add proxy host. as shown in Figure 11
14. Added
15. Open them separately: http://sail-project-1.test , http://sail-project-2.test , as shown in Figure 12
16. To connect to the MySQL database from the local host, you can directly connect to the MySQL database container through ports 127.0.0.1 and 43306. as shown in Figure 13












