问题描述:
Docker网络模式分为四种,一般我们不设置时默认为bridge单桥模式,容器使用独立的network Namespace,并连接到docker0虚拟网卡中。通过docker0网桥以及Iptables nat表配置与宿主机通信。
1.在宿主机上,可以通过iptables -t nat -L -n,查到一条DNAT规则
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.0.0/24 0.0.0.0/0
MASQUERADE tcp -- 192.168.0.3 192.168.0.3 tcp dpt:8080
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000 to:192.168.0.3:8080
2.列出当前主机网桥
brctl show
bridge name bridge id STP enabled interfaces
br0 8000.5aa0eef737ca no veth8b22673
vethef570d9
docker0 8000.000000000000 no
3.查看容器网络信息
docker inspect c5217f7bd44c|grep IPAddress
4.重建网桥
1.在使用指令yum install bridge-utils安装工具后,利用brctl show查看网桥
2.利用docker network create [网桥名]指令新建网桥发现其生成的bridge id还是8000.0000000000,在新网桥上创建容器,再次查看并没有什么变化,说明很可能是网桥的问题。
再次测试,此时网桥ip为172.17.0.1,容器ip为172.0.0.2,发现宿主机能ping通网桥,但是无法连接容器,而容器无法连接网桥,无法连接宿主机,更别谈外网了,所以这里可以肯定是网桥出了问题。
3.添加网桥:brctl addbr br0
4.添加ip字段:ip addr add 172.16.0.1/24 dev br0
5.重启网桥br0:ip link set dev br0 up
6.修改docker默认网桥:vim /etc/docker/daemon.json;在后面添加:
"bridge":"br0"
7.重启docker
systemctl start docker
8.查看网桥:brctl show
9.启动容器后再查看网桥,就会发现网桥变化了。这个时候容器就可以ping通宿主机了。