我们启动docker容器后,如果要固定容器的IP,可能会用到pipwork这个脚本,下面简单说一下过程:

网络环境如下,物理机的eth0口接上端交换机,本地起br0网桥连接到eth0:

运行docker,用pipwork固定ip:

docker run -d -name=container_name container_image  
pipework br0 container_name ip/prefix_len@gateway  

其实pipework是建立了一个netns,然后手动生成了一块虚拟网卡,然后在netns空间内设置IP,具体如下:

先起个随机名字、不重复的一块网卡:

GUEST_IFNAME=ph$NSPID$eth1  

把这块网卡挂接到系统的Bridge br0上,并且指定netns命名空间

ip link add link br0 dev $GUEST_IFNAME type macvlan mode bridge  
ip link set br0  up  
ip link set $GUEST_IFNAME netns $NSPID  

在netns命名空间内将透过来的随机网卡命名为eth0,并指定ip和路由:

ip netns exec $NSPID ip link set $GUEST_IFNAME name eth0  
ip netns exec $NSPID ip addr add $IPADDR dev eth0  
ip netns exec $NSPID ip route delete default  
ip netns exec $NSPID ip link set eth0 up  
ip netns exec $NSPID ip route replace default via $GATEWAY  

最后,别忘记更新arp缓存:

ip netns exec $NSPID arping -c 1 -A -I eth0 $IPADDR  

如果在实体机上查看网卡,会看到一堆乱七八糟名字的网卡:

#  brctl show
......                      veth02W0M0
                            veth0AGL4D
                            veth0FMDCD
                            veth1AOJ7X
                            veth1SKDX0
                            veth3PPCKC
                            veth4DUMNB
                            veth4QNDAN
                            veth4V63XP
                            veth5I92DN
                            veth5XUCSK
                            veth6R66OT
                            veth7676L0
......

如果进入docker,就会看到eth0这一块网卡。

netns的功能无比强大,只不过重启后ip就没了,加载一大堆容器这种方法会受不了的。

comments powered by Disqus