【问题标题】:reverse proxy docker container to another two docker containers, how to have multiple instances on a single computer将docker容器反向代理到另外两个docker容器,如何在一台计算机上拥有多个实例
【发布时间】:2019-03-29 12:13:23
【问题描述】:

在这个项目中,我有一个 apache docker 容器(称为负载均衡器),它指向两个 apache docker 容器中的任何一个。如果路径是“/support*”,那么它会转到支持容器,否则会转到 webapp。目前为了实现这一点,我已经硬编码了我的 docker compose networks 子网和每个容器的 ipv4 地址。然后一个 apache conf 文件只指向那些硬编码的 ips。这非常适合本地开发环境。

但是,它不适用于需要托管多个项目实例的临时服务器。由于硬编码的子网/ipv4 地址,我无法启动此 docker-compose 网络的多个实例。如何在不对子网进行硬编码的情况下实现此负载均衡器设置,以便拥有多个实例。或者是否有更好的解决方案来实现将多个副本托管在单个服务器上的预期效果,例如 apache 容器中的许多虚拟主机。你有什么建议?因为我不知道这里的最佳做法是什么。

loadbalancer.conf

<VirtualHost *:80>
    TimeOut -1

    ProxyPass "/support" "http://172.20.0.5/support"
    ProxyPassReverse "/support" "http://172.20.0.5/support"
    ProxyPass "/" "http://172.20.0.2/"
    ProxyPassReverse "/" "http://172.20.0.2/"

    ProxyPreserveHost On
    TimeOut -1
</VirtualHost>

docker-compose.yml

version: '3.7'

networks:
  pi-net:
    ipam:
      config:
      - subnet: 172.20.0.0/24

services:
    cli:
        container_name: cli
        build: ./docker/cli
        networks:
          pi-net:
            ipv4_address: 172.20.0.3
        volumes:
        - type: bind
          source: .
          target: /srv/www
        - type: bind
          source: $HOME/.gitconfig
          target: /home/developer/.gitconfig
        extra_hosts:
        - "pi.docker:172.20.0.2"
        user: developer
        stdin_open: true
        tty: true
        environment:
          GIT_PAGER: cat

    webapp:
        container_name: webapp
        build:
          context: ./docker/web-server
          args:
            - vhostsFileName=webapp.conf
        networks:
          pi-net:
            ipv4_address: 172.20.0.2
        ports:
        - 80
        volumes:
        - type: bind
          source: .
          target: /srv/www
        # depends on cli because cli entrypoint.sh is creating var/ files needed by httpd
        depends_on:
          - "cli"

    support:
        container_name: support
        build:
          context: ./docker/web-server
          args:
            - vhostsFileName=support.conf
        networks:
          pi-net:
            ipv4_address: 172.20.0.5
        ports:
          - 80
        volumes:
          - type: bind
            source: .
            target: /srv/www
        # depends on cli because cli entrypoint.sh is creating var/ files needed by httpd
        depends_on:
          - "cli"

    loadbalancer:
        container_name: loadbalancer
        build:
          context: ./docker/web-server
          args:
            - vhostsFileName=loadbalancer.conf
        networks:
          pi-net:
            ipv4_address: 172.20.0.6
        ports:
          - 80:80

    db:
        container_name: db
        build: ./docker/mysql
        networks:
          pi-net:
            ipv4_address: 172.20.0.4
        ports:
        - 3306:3306
        volumes:
        - db:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: pi
            MYSQL_USER: root
            MYSQL_PASSWORD: root
        restart: always

volumes:
    db:
        driver: local

【问题讨论】:

标签: apache docker docker-compose reverse-proxy


【解决方案1】:

Docker 提供an internal DNS service 将容器名称解析为主机名,Docker Compose 提供provides a network for you。您应该进行两项更改:

  1. 在您的 Apache 配置中,将显式 IP 地址替换为 docker-compose.yml 中相应服务块的名称:例如,http://support/support
  2. 删除docker-compose.yml 中的所有networks:container_name: 设置,因为它们是多余的并且会限制文件的重复使用。 (Docker 会为您分配 IP 地址,Docker Compose 会选择容器名称,但这些默认值并没有错。)

(此表单的许多问题也使用过时的links: 功能;删除所有links: 块也是安全的。)

【讨论】:

  • 谢谢,我稍后会对此进行一些测试。不知道为什么考虑到我的数据库连接详细信息我没有早点想到这一点
  • 回答了我原来的问题,所以我将其标记为已接受,但是由于我使用了 extra_hosts:它没有成功,因为我无法成功地将 IP 使用更改为“loadbalancer”
  • 为 external_links 更改了 extra_hosts 并且出于某种原因它也可以正常工作。希望这可以帮助某人
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
相关资源
最近更新 更多