在这个项目中,我有一个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
Docker提供an internal DNS service来解析容器名称作为主机名,Docker Compose provides a network for you。你应该做两个改变:
docker-compose.yml
:http://support/support
中相应服务块的名称。networks:
中的所有container_name:
和docker-compose.yml
设置,因为它们是冗余的并且限制文件的重用。 (Docker将为您分配IP地址,Docker Compose将选择容器名称,但这些默认值没有任何问题。)(此形式的许多问题也使用过时的links:
功能;删除所有links:
块也是安全的。)
默认情况下,容器继承Docker守护程序的DNS设置,包括/ etc / hosts和/etc/resolv.conf
https://docs.docker.com/config/containers/container-networking/
这意味着您可以使用配置文件中的其他服务名称,并且它们将被解析为所需容器,因为它们位于同一子网中。