我想要这个配置:
webcontainer1
/
/
haproxy_container
\
\
webcontainer2
这三个组件都是 docker 容器。
是的,我可以 --link 它们,并将容器名称放入 haproxy 配置中,一切正常,前提是所有 3 个都在同一主机上。
但是,我希望能够根据需要将我的 web 容器移动到其他主机,而无需更改 haproxy 的配置。
换句话说,我希望我的配置与我的 Web 容器的运行位置无关:是否相同的主机,我希望它们可以通过名称简单地 ping。
怎么做?
附言我知道如何将端口从容器转发到主机,并且我知道我可以将我的网络容器的名称替换为我将它们移动到的主机的名称——这不符合答案的条件。
目标是在不更改任何配置的情况下自由移动事物。
最佳答案
我使用下一种方法运行与自己的静态 ips 绑定(bind)的大部分 dockerized 服务:
现在我可以将容器(使用 ip 别名)移动到任何其他 docker 主机,所有其他容器将继续使用它 - 无需触摸它们。
样本:
docker run --name dns --restart=always -d -p 172.16.177.20:53:53/udp dns
docker run --name registry --restart=always -d -p 172.16.177.12:80:5000 registry
docker run --name cache --restart=always -d -p 172.16.177.13:80:3142 -v /data/cache:/var/cache/apt-cacher-ng cache
docker run --name mirror --restart=always -d -p 172.16.177.19:80:80 -v /data/mirror:/usr/share/nginx/html:ro mirror
...
回复评论(因为评论太长了):
1) 正确 - 我什至不需要知道容器的 IP - 我正在使用静态 IP 地址来处理容器中的服务
2)是的,容器不可ping通,只有必要的端口暴露在那里
3) ip aliases是单个接口(interface)的附加 IP 地址。
作为映射到 ip 别名的每个容器的必要端口 - 我不需要了解有关容器的任何其他信息,我只是使用 ip:port(或 name:port)来处理它。额外的好处 - 我有多个容器映射在同一主机中公开端口 80 - 我不需要使用代理或不同的端口:http://service1和 http://service2正在工作 - 因为它们有不同的 IP 地址(它们是别名,我可以有很多)。
关于networking - 如何使 docker 容器与主机无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29314423/