对多个 Docker 容器使用域而不是端口
Use domains instead of ports for multiple Docker containers
我正在为多个网站创建 Docker 环境。我决定为每个域使用多个容器的单独 docker-compose.yml
文件。目前我有这样的东西:
web:
image: nginx:latest
volumes:
- /c/Users/marcin/dock-test/html/test-laravel-project-2/:/usr/share/nginx/html/test-laravel-project-2/
- /c/Users/marcin/dock-test/nginx-conf/conf.d2/:/etc/nginx/conf.d
- /c/Users/marcin/dock-test/nginx-log/:/var/log/nginx
ports:
- "8088:80"
working_dir: /usr/share/nginx/html/test-laravel-project-2/
links:
- php
- db
container_name: lara.web
environment:
- VIRTUAL_HOST='l2.app'
- VIRTUAL_NETWORK='nginx-proxy'
expose:
- 8088
php:
build: ../dockerfiles/
dockerfile: Dockerfile-php7-fpm
volumes:
- /c/Users/marcin/dock-test/html/test-laravel-project-2/:/usr/share/nginx/html/test-laravel-project-2/
- /c/Users/marcin/dock-test/php-config/:/usr/local/etc/php/
working_dir: /usr/share/nginx/html/
links:
- db
container_name: lara.php
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
MYSQL_USER:
MYSQL_PASSWORD:
expose:
- 3306
volumes:
- /c/Users/marcin/dock-test/mysql2/:/var/lib/mysql/
- /c/Users/marcin/dock-test/mysql-log2/:/var/log/mysql/
ports:
- "33062:3306"
container_name: lara.db
这工作正常,但我想为此使用域,因为目前我需要像这样使用 8088 端口:http://192.168.99.100:8088
。显然,我可以在上面的配置中使用 80:80
映射,但假设我想使用 8088 端口(因为对于多个站点,我需要为每个网站使用不同的端口)。
现在的问题是 - 如何使用域而不是带端口的 IP?我已经添加到我的 Windows(我将 Windows 用作 OS)l2.app
并映射到 192.168.99.100
,但我仍然需要像这样使用它这个:http://l2.app:8088
.
我也试过 nginx-proxy
这样的:
docker pull jwilder/nginx-proxy
docker-compose up -d
docker run -d -p 80:8088 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
但是当我尝试使用 http://l2.app
访问网站时,我得到 503
并且显然当我使用 http://l2.app:8088
时一切正常。
我想我可能错误地配置了 nginx-proxy
的端口映射,但不知道映射在哪里不正确。你能给我一些建议吗?
这比我想象的要容易。以下是通过命令行的步骤,但您应该能够基于此创建相应的 docker-compose.yml
文件。如果应用程序容器默认运行在 80 端口,则不需要为应用程序容器映射端口(代理将知道如何将流量转发到每个容器的 80 端口,因此您不需要映射它们!)
- 编辑您的 Windows 主机文件,将域指向 192.168.99.100
在 Windows 2000/XP/Vista/7/8/10,文件位置是 C:\Windows\System32\drivers\etc\hosts
。添加以下行
192.168.99.100 myapp1.com
192.168.99.100 myapp2.com
- 首先启动
nginx-proxy
容器
注意var
前的双斜线。根据您使用的终端,您可能只需要一个斜杠。自己试试。
docker run -d -p 80:80 -v //var/run/docker/sock:/tmp/docker.sock:ro jwilder/nginx-proxy
- 启动您的
app1
或 app2
容器
您可以使用相同的命令启动更多容器,只需更改域名和镜像名称
docker run -d -e VIRTUAL_HOST=myapp1.com myapp1
docker run -d -e VIRTUAL_HOST=myapp2.com myapp2
- 在您的网络浏览器中,打开
http://myapp1.com
或 http://myapp2.com
我正在为多个网站创建 Docker 环境。我决定为每个域使用多个容器的单独 docker-compose.yml
文件。目前我有这样的东西:
web:
image: nginx:latest
volumes:
- /c/Users/marcin/dock-test/html/test-laravel-project-2/:/usr/share/nginx/html/test-laravel-project-2/
- /c/Users/marcin/dock-test/nginx-conf/conf.d2/:/etc/nginx/conf.d
- /c/Users/marcin/dock-test/nginx-log/:/var/log/nginx
ports:
- "8088:80"
working_dir: /usr/share/nginx/html/test-laravel-project-2/
links:
- php
- db
container_name: lara.web
environment:
- VIRTUAL_HOST='l2.app'
- VIRTUAL_NETWORK='nginx-proxy'
expose:
- 8088
php:
build: ../dockerfiles/
dockerfile: Dockerfile-php7-fpm
volumes:
- /c/Users/marcin/dock-test/html/test-laravel-project-2/:/usr/share/nginx/html/test-laravel-project-2/
- /c/Users/marcin/dock-test/php-config/:/usr/local/etc/php/
working_dir: /usr/share/nginx/html/
links:
- db
container_name: lara.php
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
MYSQL_USER:
MYSQL_PASSWORD:
expose:
- 3306
volumes:
- /c/Users/marcin/dock-test/mysql2/:/var/lib/mysql/
- /c/Users/marcin/dock-test/mysql-log2/:/var/log/mysql/
ports:
- "33062:3306"
container_name: lara.db
这工作正常,但我想为此使用域,因为目前我需要像这样使用 8088 端口:http://192.168.99.100:8088
。显然,我可以在上面的配置中使用 80:80
映射,但假设我想使用 8088 端口(因为对于多个站点,我需要为每个网站使用不同的端口)。
现在的问题是 - 如何使用域而不是带端口的 IP?我已经添加到我的 Windows(我将 Windows 用作 OS)l2.app
并映射到 192.168.99.100
,但我仍然需要像这样使用它这个:http://l2.app:8088
.
我也试过 nginx-proxy
这样的:
docker pull jwilder/nginx-proxy
docker-compose up -d
docker run -d -p 80:8088 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
但是当我尝试使用 http://l2.app
访问网站时,我得到 503
并且显然当我使用 http://l2.app:8088
时一切正常。
我想我可能错误地配置了 nginx-proxy
的端口映射,但不知道映射在哪里不正确。你能给我一些建议吗?
这比我想象的要容易。以下是通过命令行的步骤,但您应该能够基于此创建相应的 docker-compose.yml
文件。如果应用程序容器默认运行在 80 端口,则不需要为应用程序容器映射端口(代理将知道如何将流量转发到每个容器的 80 端口,因此您不需要映射它们!)
- 编辑您的 Windows 主机文件,将域指向 192.168.99.100
在 Windows 2000/XP/Vista/7/8/10,文件位置是 C:\Windows\System32\drivers\etc\hosts
。添加以下行
192.168.99.100 myapp1.com
192.168.99.100 myapp2.com
- 首先启动
nginx-proxy
容器
注意var
前的双斜线。根据您使用的终端,您可能只需要一个斜杠。自己试试。
docker run -d -p 80:80 -v //var/run/docker/sock:/tmp/docker.sock:ro jwilder/nginx-proxy
- 启动您的
app1
或app2
容器
您可以使用相同的命令启动更多容器,只需更改域名和镜像名称
docker run -d -e VIRTUAL_HOST=myapp1.com myapp1
docker run -d -e VIRTUAL_HOST=myapp2.com myapp2
- 在您的网络浏览器中,打开
http://myapp1.com
或http://myapp2.com