如何使用 jwilder/whoami 在 Docker 中显示 laravel 主页
How to show laravel home page in Docker using jwilder/whoami
我在 Docker 中创建了一个新的 Laravel 项目,并且正在为我的项目创建一个 VirtualHost 域名。
我的 docker-compose.yml 看起来像这样。
version: '3'
networks:
laravel:
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- laravel
webserver:
image: jwilder/whoami
environment:
VIRTUAL_HOST: my-app.localhost
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
mysql:
image: mysql:5.7.29
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- laravel
php:
build:
context: .
dockerfile: php.dockerfile
container_name: php
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
networks:
- laravel
composer:
image: composer:latest
container_name: composer
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
depends_on:
- php
networks:
- laravel
npm:
image: node:13.7
container_name: npm
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['npm']
artisan:
build:
context: .
dockerfile: php.dockerfile
container_name: artisan
volumes:
- ./src:/var/www/html
depends_on:
- mysql
working_dir: /var/www/html
entrypoint: ['php', '/var/www/html/artisan']
networks:
- laravel
当我去我的-app.localhost 我得到
i'm e12cf052rrf0
当我转到 localhost:8080 时,我会看到 Laravel 主页
如何让我的-app.localhost立即显示我的laravel主页?
您正在使用 docker 服务“nginx”为您的 Laravel 网页提供服务。服务暴露8080端口,绑定到容器内部的80端口。
这就是为什么当您访问 localhost:8080 时您会看到您的 Laravel 主页,而当您加载 my-app.localhost 时您实际上会看到服务“网络服务器”。
要允许 jwilder 反向代理将您的流量路由到您的 laravel 主页,您应该使用以下内容重写您的 nginx 服务:
version: '3'
networks:
laravel:
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
environment:
VIRTUAL_HOST: my-app.localhost
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- laravel
webserver:
image: jwilder/whoami
environment:
VIRTUAL_HOST: whoami.localhost
networks:
- laravel
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- laravel
mysql:
image: mysql:5.7.29
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- laravel
php:
build:
context: .
dockerfile: php.dockerfile
container_name: php
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
networks:
- laravel
composer:
image: composer:latest
container_name: composer
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
depends_on:
- php
networks:
- laravel
npm:
image: node:13.7
container_name: npm
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['npm']
artisan:
build:
context: .
dockerfile: php.dockerfile
container_name: artisan
volumes:
- ./src:/var/www/html
depends_on:
- mysql
working_dir: /var/www/html
entrypoint: ['php', '/var/www/html/artisan']
networks:
- laravel
现在您的应用程序可在 my-app.localhost 上使用,您的 whoami 服务可在 whoami.localhost.
上使用
在这种情况下,环境变量“VIRTUAL_HOST”决定了 url 您的服务将由 reverse-proxy
更新:
我没有意识到您为 laravel 相关服务和反向代理使用了不同的网络。
反向代理和您要公开的服务必须侦听同一个 Docker Network
在您的情况下,jwilder reverse-proxy 正在侦听由 docker-compose 创建的默认网络,但 nginx 服务器正在侦听另一个名为 'laravel' 的网络。 Docker compose 将始终为您创建一个网络,除非您另有说明。在同一网络上侦听的所有服务将可以相互访问。
要解决这个问题,您必须在laravel网络上注册reverse-proxy。您可以通过在服务声明中添加网络标记来完成此操作,如下所示:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- laravel
webserver:
image: jwilder/whoami
environment:
VIRTUAL_HOST: whoami.localhost
networks:
- laravel
现在反向代理后面的两个服务都可以访问了。
我在 Docker 中创建了一个新的 Laravel 项目,并且正在为我的项目创建一个 VirtualHost 域名。 我的 docker-compose.yml 看起来像这样。
version: '3'
networks:
laravel:
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- laravel
webserver:
image: jwilder/whoami
environment:
VIRTUAL_HOST: my-app.localhost
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
mysql:
image: mysql:5.7.29
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- laravel
php:
build:
context: .
dockerfile: php.dockerfile
container_name: php
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
networks:
- laravel
composer:
image: composer:latest
container_name: composer
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
depends_on:
- php
networks:
- laravel
npm:
image: node:13.7
container_name: npm
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['npm']
artisan:
build:
context: .
dockerfile: php.dockerfile
container_name: artisan
volumes:
- ./src:/var/www/html
depends_on:
- mysql
working_dir: /var/www/html
entrypoint: ['php', '/var/www/html/artisan']
networks:
- laravel
当我去我的-app.localhost 我得到
i'm e12cf052rrf0
当我转到 localhost:8080 时,我会看到 Laravel 主页
如何让我的-app.localhost立即显示我的laravel主页?
您正在使用 docker 服务“nginx”为您的 Laravel 网页提供服务。服务暴露8080端口,绑定到容器内部的80端口。
这就是为什么当您访问 localhost:8080 时您会看到您的 Laravel 主页,而当您加载 my-app.localhost 时您实际上会看到服务“网络服务器”。
要允许 jwilder 反向代理将您的流量路由到您的 laravel 主页,您应该使用以下内容重写您的 nginx 服务:
version: '3'
networks:
laravel:
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
environment:
VIRTUAL_HOST: my-app.localhost
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- laravel
webserver:
image: jwilder/whoami
environment:
VIRTUAL_HOST: whoami.localhost
networks:
- laravel
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- laravel
mysql:
image: mysql:5.7.29
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- laravel
php:
build:
context: .
dockerfile: php.dockerfile
container_name: php
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
networks:
- laravel
composer:
image: composer:latest
container_name: composer
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
depends_on:
- php
networks:
- laravel
npm:
image: node:13.7
container_name: npm
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['npm']
artisan:
build:
context: .
dockerfile: php.dockerfile
container_name: artisan
volumes:
- ./src:/var/www/html
depends_on:
- mysql
working_dir: /var/www/html
entrypoint: ['php', '/var/www/html/artisan']
networks:
- laravel
现在您的应用程序可在 my-app.localhost 上使用,您的 whoami 服务可在 whoami.localhost.
上使用在这种情况下,环境变量“VIRTUAL_HOST”决定了 url 您的服务将由 reverse-proxy
更新:
我没有意识到您为 laravel 相关服务和反向代理使用了不同的网络。
反向代理和您要公开的服务必须侦听同一个 Docker Network
在您的情况下,jwilder reverse-proxy 正在侦听由 docker-compose 创建的默认网络,但 nginx 服务器正在侦听另一个名为 'laravel' 的网络。 Docker compose 将始终为您创建一个网络,除非您另有说明。在同一网络上侦听的所有服务将可以相互访问。
要解决这个问题,您必须在laravel网络上注册reverse-proxy。您可以通过在服务声明中添加网络标记来完成此操作,如下所示:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- laravel
webserver:
image: jwilder/whoami
environment:
VIRTUAL_HOST: whoami.localhost
networks:
- laravel
现在反向代理后面的两个服务都可以访问了。