网络模式
Docker支持5种网络模式
Ø bridge
– 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中
Ø host
– 容器不会获得一个独立的network namespace,而是与宿主机共用一个。
Ø none
– 获取独立的network namespace,但不为容器进行任何网络配置。
Ø container
– 与指定的容器使用同一个network namespace,网卡配置也是相同的。
Ø 自定义
– 自定义网桥,默认与bridge网络一样。
容器网络访问原理
Linux IP信息包过滤原理:
Docker主要通过netfilter/iptables
实现网络通信。
iptables
由netfilter
和iptables
组成,netfilter
组件是Linux
内核集成的信息包过滤系统,它维护一个信息包过滤表,这个表用于控制信息包过滤处理的规则集。而iptables
只是一个在用户空间的工具,用于增删改查这个过滤表的规则。
表 | 链 |
---|---|
filter(过滤) | INPUT OUTPUT FORWARD |
nat(地址转换) | PREROUTING POSTROUTING OUTPUT |
mangle(拆包、修改、封装) | INPUT OUTPUT PREROUTING POSTROUTING OUTPUT |
raw(数据包状态跟踪) | PREROUTING OUTPUT |
容器访问外部
# iptables -t nat -nL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
外部访问容器
# iptables -t nat -nL
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:88 to:172.18.0.2:80
桥接宿主机网络与配置固定IP地址
桥接宿主机网络
配置固定IP地址
C_ID=$(docker run -itd --net=none ubuntu)
C_PID=$(docker inspect -f '{{.State.Pid}}' $C_ID)
创建network namespace 目录并将容器的network namespace软连接到此目录,以便ip netns命令读取
mkdir -p /var/run/netns
ln -s /proc/$C_PID/ns/net /var/run/netns/$C_PID
添加虚拟网卡veth+容器PID,类型是veth pair,名称是vp+容器PID
ip link add veth$C_PID type veth peer name vp$C_PID
添加虚拟网卡到br0网桥
brctl addif br0 veth$C_PID
激活虚拟网卡
ip link set veth$C_PID up
设置容器网络信息
IP='192.168.0.123/24'
GW='192.168.0.1'
给进程配置一个network namespace
ip link set vp$C_PID netns $C_PID
在容器进程里面设置网卡信息
ip netns exec $C_PID ip link set dev vp$C_PID name eth0
ip netns exec $C_PID ip link set eth0 up
ip netns exec $C_PID ip addr add $IP dev eth0
ip netns exec $C_PID ip route add default via 192.168.1.1
pipework工具配置容器固定IP
git clone https://github.com/jpetazzo/pipework.git
cp pipework/pipework /usr/local/bin/
docker run -itd --net=none --name test01 ubuntu
pipework br0 test01 192.168.0.123/24@192.168.0.1