反向代理docker容器到另外两个docker容器,如何在一台计算机上拥有多个实例

问题描述 投票:0回答:2

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

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

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>

泊坞窗,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
2个回答
1
投票

Docker提供an internal DNS service来解析容器名称作为主机名,Docker Compose provides a network for you。你应该做两个改变:

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

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


0
投票

默认情况下,容器继承Docker守护程序的DNS设置,包括/ etc / hosts和/etc/resolv.conf

https://docs.docker.com/config/containers/container-networking/

这意味着您可以使用配置文件中的其他服务名称,并且它们将被解析为所需容器,因为它们位于同一子网中。

© www.soinside.com 2019 - 2024. All rights reserved.