使用Nginx反向代理运行多个docker-compose文件

时间:2019-04-01 00:37:07

标签: apache docker nginx

我问了一个问题here,并解决了部分问题,但我被建议创建另一个问题,因为它开始在评论中有些冗长。

我正在尝试使用docker在Mac上运行多个基于PHP,MySQL和Apache的应用程序,所有这些应用程序都将使用不同的docker-compose.yml文件(我链接的文章中有更多详细信息)。我有很多存储库,其中一些可以相互通信,但并非所有存储库都是相同的PHP版本。因此,我认为将20多个单独的存储库塞入一个docker-compose.yml文件并不明智。我希望每个存储库都有单独的docker-compose.yml文件,并且我希望能够为每个应用程序使用一个/etc/hosts条目,这样我就不必指定端口。例如:我将访问2个不同的存储库,例如http://dockertest.comhttp://dockertest2.com(使用/etc/hosts条目),而不必像http://dockertest.com:8080http://dockertest.com:8081这样指定端口

使用另一篇文章中的公认答案,我能够一次运行一个应用程序(一个docker-compose.yml文件),但是如果我尝试使用docker-compose up -d启动另一个应用程序,则会导致错误因为端口80已被占用。我该如何同时运行多个docker应用程序,每个应用程序都有自己的docker-compose.yml文件,而不必在url中指定端口?

这是我制作的应用程序的docker-compose.yml文件。在我的/etc/hosts中,我有127.0.0.1 dockertest.com

version: "3.3"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./public_html/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    volumes:
      - ./public_html/:/var/www/html/
    environment:
      - VIRTUAL_HOST=dockertest.com
  mysql:
    image: mysql:5.6.40
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
  nginx-proxy:
    image: jwilder/nginx-proxy
    networks:
      - backend
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  frontend:
  backend:

1 个答案:

答案 0 :(得分:1)

我建议将nginx-proxy提取到单独的docker-compose.yml并使用以下内容为“反向代理”配置创建存储库:

具有额外内容的文件可添加到/etc/hosts

127.0.0.1 dockertest.com
127.0.0.1 anothertest.com
127.0.0.1 third-domain.net

还有一个docker-compose.yml,它将仅具有反向代理

version: "3.3"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

接下来,正如您已经提到的,为充当Web终结点的每个存储库创建一个docker-compose.yml。您需要向服务您的应用程序的服务(例如Apache)中添加VIRTUAL_HOST env var。

nginx-proxy容器占用空间小,因此可以在“永久模式”下运行。这样,每当您使用VIRTUAL_HOST env var启动新容器时,nginx-proxy的配置都会自动更新以包括新的本地域。 (您仍然必须使用新条目更新/etc/hosts)。


如果您决定使用网络,则您的Web终结点容器必须与nginx-proxy位于同一网络中,因此必须像下面这样修改docker-compose文件:

# nginx-proxy/docker-compose.yml
version: "3.3"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    networks:
      - reverse-proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  reverse-proxy:
# service1/docker-compose.yml

version: "3.3"
services:
  php1:
    ...
    networks:
      - backend1
  apache1:
    ...
    networks:
      - nginx-proxy_reverse-proxy
      - backend1
    environment:
      - VIRTUAL_HOST=dockertest.com
  mysql1:
    ...
    networks:
      - backend1
networks:
  backend1:
  nginx-proxy_reverse-proxy:
    external: true
# service2/docker-compose.yml

version: "3.3"
services:
  php2:
    ...
    networks:
      - backend2
  apache2:
    ...
    networks:
      - nginx-proxy_reverse-proxy
      - backend2
    environment:
      - VIRTUAL_HOST=anothertest.com
  mysql2:
    ...
    networks:
      - backend2
networks:
  backend2:
  nginx-proxy_reverse-proxy:
    external: true

在其他码头工人组成文件中,在reverse-proxy中创建的nginx-proxy/docker-compose.yml网络被称为nginx-proxy_reverse-proxy,因为每当您定义网络时,其最终名称将为{{1} }


如果您想看看依靠浏览器代理扩展而不是{{folder name}}_{{network name}}的解决方案,请查看mitm-proxy-nginx-companion