【问题标题】:Running multiple docker-compose files with nginx reverse proxy使用 nginx 反向代理运行多个 docker-compose 文件
【发布时间】:2019-08-22 03:01:49
【问题描述】:

我问了一个问题here 并解决了我的部分问题,但我被建议创建另一个问题,因为它在 cmets 中开始变得有点冗长。

我正在尝试使用 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:

【问题讨论】:

    标签: apache docker nginx


    【解决方案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。您需要将 VIRTUAL_HOST env var 添加到为您的应用程序提供服务的服务(例如 Apache)。

    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
    

    nginx-proxy/docker-compose.yml 中创建的 reverse-proxy 网络在其他 docker-compose 文件中称为 nginx-proxy_reverse-proxy,因为无论何时定义网络 - 其最终名称都是 {{folder name}}_{{network name}}


    如果您想查看依赖浏览器代理扩展而不是 /etc/hosts 的解决方案,请查看 mitm-proxy-nginx-companion

    【讨论】:

    • 太棒了,这太容易了!非常感谢您的帮助,与我当前的本地开发环境相比,我无法相信设置和运行是多么快速和容易。
    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多