欢迎光临范阳布衣的运维博客
分享工作和学习中的知识、技术

docker-网络管理

网络模式

Docker支持5种网络模式

Ø  bridge
– 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中

Ø  host
– 容器不会获得一个独立的network namespace,而是与宿主机共用一个。

Ø  none
– 获取独立的network namespace,但不为容器进行任何网络配置。

Ø  container
– 与指定的容器使用同一个network namespace,网卡配置也是相同的。

Ø  自定义
– 自定义网桥,默认与bridge网络一样。

容器网络访问原理

Linux IP信息包过滤原理:

Docker主要通过netfilter/iptables实现网络通信。
iptablesnetfilteriptables组成,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
未经允许不得转载:范阳布衣 » docker-网络管理