容器的网络互联
一、 设置容器的网络模式
模式 | 配置选项–net= | 说明 |
---|---|---|
bridge模 式 | bridge或不写 | 默认模式,使用本地的Docker0的网络提供 |
host模式 | host | 与宿主机共用network namespace,没有自己的ip和网卡,而是使用宿主机的ip和端口,但是文件系统和进程还是单独隔离的 |
container模式 | container:NAMEorID | 与一个存在的容器共享network namespace,没有自己的ip和网卡,与指定容器共享,但是文件系统和进程还是单独隔离 |
none模式 | none | 容器具备自己的network namespace,但是没有网卡和ip,需要单独设置 |
1、 Bridge模式
docker run -itd ---net=bridge --name c1 -h c1 centos:7 /bin/bash
2、 Host模式
docker run -it --net=host --name c2 -h c2 centos:7 /bin/bash
3、 Container模式
#创建新容器关联到上面的容器
docker run -itd --net=container:c1 --name c3 centos:7 /bin/bash
#注意 不要指定主机名,-h和Container的网络模式冲突,会报错
#docker: Error response from daemon: conflicting options: hostname and the network mode.
#进入新容器c3发现主机名为c1。ip也和c1相同。
4、 None模式
docker run -it --net=none --name=c4 -h c4 centos:7 /bin/bash
二、 使用link实现容器互联
先删除前面实验的c1、c2
docker rm -f c1 c2
1、 创建容器c1,网络畅通
docker run -itd --name c1 centos:7 /bin/bash
2、 创建容器c2,连接到c1
#--link <name or id>:alias
#其中,name或id是源容器的name或id,alias是源容器在link下的别名。二者可以相同。
#与之通讯靠别名
docker run -itd --name c2 --link c1:c1 centos:7 /bin/bash
测试一下 是可以ping通“c1”的,并且hosts中有一条c1的记录
三、 容器跨主机互联
实验准备
docker1关机,完整克隆虚拟机docker2
主机名 | 主机地址 | Docker0 | 实验容器 |
---|---|---|---|
docker1 | 192.168.200.200 | 172.17.0.1/24 | d1 |
docker2 | 192.168.200.201 | 172.17.1.1/24 | d2 |
因此要重新设置docker1上的网桥Docker0地址,docker2上的主机名、IP、网桥Docker0地址
docker1上
修改Docker0地址(docker0默认是172.17.0.1/16)
在/etc/docker/daemon.json
文件的{}中添加,注意 前一项后面加逗号,
"bip":"172.17.0.1/24"
docker2上
修改主机名
hostnamectl set-hostname docker2
修改IP(如果用DHCP,不需要改
sed -i 's/IPADDR=.*/IPADDR=192.168.200.201/' /etc/sysconfig/network-scripts/ifcfg-eth0
修改Docker0地址
在/etc/docker/daemon.json
文件的{}中添加,注意 前一项后面加逗号,
"bip":"172.17.1.1/24"
重启docker
systemctl daemon-reload
systemctl restart docker
分别在两台物理机docker1、docker2上创建容器d1、d2(网络模式bridge默认使用Docker0
[root@docker1 ~]# docker run -itd --name d1 centos:7 /bin/bash
[root@docker1 ~]# docker inspect -f '{{.NetworkSettings.IPAddress}}' d1
172.17.0.3
[root@docker2 ~]# docker run -itd --name d2 centos:7 /bin/bash
[root@docker2 ~]# docker inspect -f '{{.NetworkSettings.IPAddress}}' d2
172.17.1.3
可以看到二者不在同一网络,现在是ping不通的
1、 添加路由,实现Docker1物理机上的容器和Docker2物理机上的容器互通
#找不到route命令则yum install net-tools
#查看路由表 route -n
#写错需要删除的话route del -net 172.17.0.0/24
[root@docker1 ~]# route add -net 172.17.1.0/24 gw 192.168.200.201
#告诉电脑 要去172.17.1.0/24网段,就先找192.168.200.201
[root@docker2 ~]# route add -net 172.17.0.0/24 gw 192.168.200.200
一般情况下,到这里后就可以ping通了
如果两个容器还无法ping通,就设置如下防火墙规则
2、 设置防火墙规则
docker1上
#清空防火墙nat表的其他规则
iptables -t nat -F POSTROUTING
#从172.17.0.0/24发往其他网段(非172.17.0.0/16)时做地址转换 。!取反
iptables -t nat -A POSTROUTING -s 172.17.0.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
#允许Docker2主机上的容器访问我
iptables -A FORWARD -s 172.17.1.0/24 -d 172.17.0.0/24 -j ACCEPT
docker2上配置同理
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.0.0/16 -j MASQUERADE iptables -A FORWARD -s 172.17.0.0/24 -d 172.17.1.0/24 -j ACCEPT