Nginx 对多个Docker容器使用域而不是端口

Nginx 对多个Docker容器使用域而不是端口,nginx,docker,docker-compose,Nginx,Docker,Docker Compose,我正在为多个网站创建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/

我正在为多个网站创建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
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
这很好,但我想使用domain来实现这一点,因为目前我需要像这样使用8088端口:
http://192.168.99.100:8088
。显然,我可以在上面的配置中使用
80:80
映射,但假设我想要使用8088端口(因为对于多个站点,我需要为每个站点使用不同的端口)

现在的问题是,如何使用域而不是带有端口的IP?我已经将映射到
192.168.99.100
l2.app添加到我的Windows(我使用Windows作为操作系统)
l2.app
,但我仍然需要这样使用它:
http://l2.app:8088

我也尝试过像这样的
nginx proxy

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
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代理
    container
  • 请注意,
    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
    
  • 在web浏览器中,打开
    http://myapp1.com
    http://myapp2.com

  • 这比我想象的要容易。下面是通过命令行执行的步骤,但是您应该能够基于此创建相应的
    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代理
    container
  • 请注意,
    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
    
  • 在web浏览器中,打开
    http://myapp1.com
    http://myapp2.com

  • 我认为您需要首先启动
    nginx代理
    容器,然后启动
    docker组合
    。此外,
    nginx proxy
    的端口映射应为80:80。虽然我认为Windows上的此设置可能存在进一步的问题,因为Docker在Windows上的VM中运行,所以现在您将
    l2.app
    指向192.168.99.100,但是
    nginx proxy
    l2.app
    指向VM中容器的内部ip。我还没有测试过这个,但我认为它可能不起作用。@warmoverflow我几乎可以肯定我也在尝试你写的东西,但我会在拿到我的电脑后再试一次around@warmoverflow我做到了,但没有成功。我还尝试将
    expose
    更改为
    80
    ,但也没有任何帮助。我认为您需要先启动
    nginx proxy
    容器,然后启动
    docker compose
    。此外,
    nginx proxy
    的端口映射应为80:80。虽然我认为Windows上的此设置可能存在进一步的问题,因为Docker在Windows上的VM中运行,所以现在您将
    l2.app
    指向192.168.99.100,但是
    nginx proxy
    l2.app
    指向VM中容器的内部ip。我还没有测试过这个,但我认为它可能不起作用。@warmoverflow我几乎可以肯定我也在尝试你写的东西,但我会在拿到我的电脑后再试一次around@warmoverflow我做到了,但没有成功。我也尝试过将
    expose
    更改为
    80
    ,但也没有任何帮助。谢谢你的回复,我还没有尝试过,但我正在使用
    docker compose.yml
    运行容器,就像这样
    docker compose-d
    并且你展示了
    docker run
    的方法。我应该使用哪个图像,以及如何在不使用
    docker compose
    的情况下链接它们?我相信,如果您先以80:80运行nginx proxy,然后再运行您的compose file(但删除用于web的端口映射和公开命令),它将正常工作。如果没有,请尝试删除虚拟网络。恐怕它无法工作。没有
    myapp1
    图像,因为我在
    docker compose.yml
    中有我的容器名称,除了删除yml文件的
    web
    容器部分中的
    端口和
    expose
    部分之外,无需进行任何更改。首先运行
    nginx proxy
    ,然后在运行
    docker compose up
    时,由于您在compose文件中定义了
    VIRTUAL\u HOST
    ,代理将知道如何转发
    l2.app