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

use*_*854 6 apache nginx docker

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

我正在尝试使用 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:8080和一样指定端口http://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:
Run Code Online (Sandbox Code Playgroud)

Art*_*kov 11

我建议将其提取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
Run Code Online (Sandbox Code Playgroud)

而 adocker-compose.yml将只有反向代理

version: "3.3"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
Run Code Online (Sandbox Code Playgroud)

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

nginx-proxy容器可在“永久模式”运行,因为它具有占地面积小。这样,每当您使用VIRTUAL_HOSTenv 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:
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

reverse-proxy其中创建的网络在其他 docker-compose 文件中nginx-proxy/docker-compose.yml被引用,nginx-proxy_reverse-proxy因为每当您定义网络时 - 它的最终名称将是{{folder name}}_{{network name}}


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