容器网络
一、Docker网络模型
二、如何与外界通信
Docker使用iptables实现网络通信
1. 外部访问容器
- 外界地址经过DNAT转换成能到达docker0的容器地址
[root@localhost ~]# iptables -t nat -vnL DOCKER
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
2 104 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.3:8080
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 to:172.17.0.4:3306
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379 to:172.17.0.5:6379
[root@localhost ~]# ip route
default via 192.168.2.1 dev ens33 proto static metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.2.0/24 dev ens33 proto kernel scope link src 192.168.2.62 metric 100
- 通过对应的veth pair把数据流向隔离的容器网络
[root@localhost ~]# docker exec -it 8477d8fd9c51 bash
root@8477d8fd9c51:/usr/local/tomcat# cat /sys/class/net/eth0/iflink
17
[root@localhost ~]# ip addr|grep "17:"
17: veth74baa09@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
2.容器访问外部
- 容器地址(172.17.0.3)通过eth0到达docker0(veth pair解决网络隔离),172.17.0.3经SDNT转换成宿主机地址(可通过eth0流到外部)
[root@localhost ~]# iptables -t nat -vnL POSTROUTING|grep 8080
0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:8080