Networking 如何使docker容器宿主不可知
我想要此配置:Networking 如何使docker容器宿主不可知,networking,docker,Networking,Docker,我想要此配置: webcontainer1 / / haproxy_container \ \ webcontainer2 这三个组件都是docker容器。 是的,我可以链接它们,并将容器名称放入haproxy配置,只要所有3个都在同一台主机上,一切都可以正常工作 但是,我希望
webcontainer1
/
/
haproxy_container
\
\
webcontainer2
这三个组件都是docker容器。
是的,我可以链接它们,并将容器名称放入haproxy配置,只要所有3个都在同一台主机上,一切都可以正常工作
但是,我希望能够根据需要将我的WebContainer移动到其他主机,而不必更改haproxy的配置
换句话说,我希望我的配置与我的web容器运行的位置无关:不管是否是同一个主机,我希望它们可以简单地通过名称ping
怎么做
另外,我知道如何将端口从一个容器转发到另一个主机,并且我知道我可以将我的WebContainer的名称替换为我要将其移动到的主机的名称—这不符合回答的条件
我们的目标是在不更改任何配置的情况下自由移动设备。我使用下一种方法运行与自己的静态IP绑定的大多数停靠服务:
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地址
作为映射到ip别名的每个容器的必要端口,我不需要知道关于容器的任何其他信息,我只是使用ip:port(或name:port)来处理它。其他好处-我有多个容器映射同一主机中的暴露端口80-我不需要使用代理或不同的端口:并且正在工作-因为它们有不同的ip地址(这是别名,我可能有很多)。还有另一种方法,将主机容器视为子网。如果我理解正确,您希望至少有两个子网。您需要一种连接这些子网的方法,这意味着您必须更改默认设备docker0的子网。这就是我所尝试并成功的:
- 主机1:
服务停靠站
- 主机2:
服务停靠站
- 主机1:
iptables-t nat-F后路由
- 主机2:
iptables-t nat-F后路由
- 主机1:
ip链接设置dev docker0关闭和ip地址删除172.17.42.1/16 dev docker0
- 主机2:
ip链接设置dev docker0关闭和ip地址删除172.17.42.1/16 dev docker0
- 主机1:
ip地址添加192.168.3.1/24 dev docker0和&ip链接设置dev docker0向上和&ip地址显示docker0
- 主机2:
ip地址添加192.168.4.1/24 dev docker0和&ip链接设置dev docker0向上和&ip地址显示docker0
- 主机1:
service docker start
- 主机2:
service docker start
- 主机1:
iptables-tnat-L-n
- 主机2:
iptables-tnat-L-n
- 主机1:
ip路由通过192.168.1.2 dev eth0添加192.168.3.0/24
- 主机2:
ip路由通过192.168.1.3 dev eth0添加192.168.4.0/24
- 主机1:
农奴代理人
- webcontainer1:
serf代理-h=webcontainer1
- 主机2:
农奴代理人
- webcontainer2:
serf代理-h=webcontainer2
- haproxy1:
serf-agent-h=haproxy1
#/bin/bash
updatehosts()
{
sed-i's/\+#serf/'/etc/hosts
serf成员| sed's/:.\+$//g'| grep-v`hostname`| awk'{print$2”“$1'#serf'}>>/etc/hosts
}
中的案例“${SERF_EVENT}”
成员(加入)
更新主机
;;
会员假期)
更新主机
;;
成员(失败)
更新主机
;;
以撒
我看到的最后配置主机而不是容器的唯一部分是子网部分,但您也可以在具有适当权限的容器中进行配置
我希望这能有所帮助我需要澄清一下这一点。1) 您显示的ip似乎表示主机接口,而不是分配给容器的ip,如果我的读取正确的话2)我看不出您的容器如何可以通过容器主机名ping,因为您甚至没有使用--host 3)将主机名分配给您的容器,“我创建ip别名”是什么意思-我不太明白this@dmitry-z、 修改答案,因为回复太长,无法评论。谢谢。您能否演示如何创建IP别名,特别是如何选择IP号码?这取决于您的网络。如果我们谈论的是非公共地址-它们应该与机箱的主ip位于同一子网中(因此不需要对其他机箱进行额外配置),但不在dhcp范围内,以避免冲突。在上面的示例中,子网是172.16,专门用于docker容器的子网是172.16.177。如果您的子网是192.160.0.*,那么别名也应该从192.160.0开始,因此您可以在主机A上的/etc/sysconfig/network scripts/(如果是RHEL etc)中添加IP别名