我们启动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就没了,加载一大堆容器这种方法会受不了。