目录
0.Pipework安装
$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp pipework/pipework /usr/local/bin/
1.实验环境
虚拟机centos:7.3 系统
IP: 192.168.159.5
网关: 192.168.159.2
网卡: ens33
2.docker原生拓扑图
3.Pipework拓扑图(配置和主机在一个网段)
4.使用ip命令配置Docker容器固定IP
4.1配置固定IP不和主机在同一网段
4.2主要流程
1.创建两个network namespace(相当于两个容器)
2.创建网桥
3.创建两对 veth-pair虚拟设备
4.把两对veth-pair中的其中一个分别放到network namespace中,并设置ip
5.验证
4.3实验过程
创建两个容器test1和test2
docker run -itd --name=test1 busybox sh
docker run -itd --name=test2 busybox sh
ip netns list命令在/var/run/netns目录下查找network namespace。由于Docker创建的network namespace并不在此目录下。所以我们需要把Docker创建的network namesapce的文件链接到/var/run/netns目录下,就可以使用ip netns命令操作了,步骤方法如下:
查看容器的Pid
docker inspect --format '{{.State.Pid}}' test1
1979
docker inspect --format '{{.State.Pid}}' test2
2029
创建软连接
ln -s /proc/1979/ns/net /var/run/netns/test1
ln -s /proc/2029/ns/net /var/run/netns/test2
查看两个network namespace
[root@localhost ~]# ip netns list
test2 (id: 1)
test1 (id: 0)
创建网桥br0并启动br0
ip link aadd br0 type bridge
ip link set br0 up
然后创建两对 veth-pair,分别放到两个ns中
ip link add veth0 type veth peer name br-veth0
ip link add veth1 type veth peer name br-veth1
分别将两对 veth-pair 加入两个 ns 和 br0
ip link set veth0 netns test1
ip link set br-veth0 master br0
ip link set br-veth0 up
ip link set veth1 netns test2
ip link set br-veth1 master br0
ip link set br-veth1 up
给两个 ns 中的 veth 配置 IP 并启用
ip netns exec test1 ip addr add 10.1.1.2/24 dev veth0
ip netns exec test1 ip link set veth0 up
ip netns exec test2 ip addr add 10.1.1.3/24 dev veth1
ip netns exec test2 ip link set veth1 up
验证
[root@localhost ~]# ip netns exec test1 ping 10.1.1.3
PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data.
64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from 10.1.1.3: icmp_seq=3 ttl=64 time=0.063 ms
64 bytes from 10.1.1.3: icmp_seq=4 ttl=64 time=0.064 ms
64 bytes from 10.1.1.3: icmp_seq=5 ttl=64 time=0.057 ms
64 bytes from 10.1.1.3: icmp_seq=6 ttl=64 time=0.052 ms
64 bytes from 10.1.1.3: icmp_seq=7 ttl=64 time=0.057 ms
--- 10.1.1.3 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6001ms
rtt min/avg/max/mdev = 0.052/0.065/0.105/0.016 ms
进入容器test1中,可以看到配置的网卡:
4.1 配置固定IP和主机在同一网段
和上面不一样的就是网桥的配置:我们需要将主机eth0桥接到br0上,并把eth0的IP配置在br0上。
备份自己的网卡: /etc/sysconfig/network-scripts/ifcfg-ens33 (根据自己的情况修改)
修改网卡 ifcfg-ens33
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
BRIDGE=br0
新建ifcfg-br0 (根据自己的情况修改)
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
USERCTL=no
DELAY=0
IPADDR=192.168.159.6
PREFIX=24
GATEWAY=192.168.159.2
NETMASK=255.255.255.0
DNS1=8.8.8.8
重启网卡
可以修改默认生成容器的网络类型
$ echo 'DOCKER_NETWORK_OPTIONS="-b=none"' > /etc/sysconfig/docker-network
其余的和上面一致。
验证
[root@localhost ~]# docker exec -it test1 ping 192.168.159.11
PING 192.168.159.11 (192.168.159.11): 56 data bytes
64 bytes from 192.168.159.11: seq=0 ttl=64 time=0.119 ms
64 bytes from 192.168.159.11: seq=1 ttl=64 time=0.067 ms
64 bytes from 192.168.159.11: seq=2 ttl=64 time=0.078 ms
--- 192.168.159.11 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.067/0.088/0.119 ms
5.通过pipework实现上面的功能
5.1配置固定IP不和主机在同一网段
#主机A上创建两个容器test1、test2
docker run -itd --name test1 --net=none ubuntu:14.04 bash
docker run -itd --name test2 --net=none ubuntu:14.04 bash
#使用pipework建立网桥br0,为容器con1和con2添加新的网卡,并将它们连接到br0上
pipework br0 test1 10.0.0.2/24
pipework br0 test2 10.0.0.3/24
#在容器con1和con2内部可以看到有一个网卡地址分别如上,可以ping通
5.2配置固定IP主机在同一网段
1.#按照上面的布置配置br0网桥
2.启动两个容器
docker run -itd --name=test1 busybox sh
docker run -itd --name=test2 busybox sh
3.pipework为添加新的网卡,并将它们连接到br0上
pipework br0 test1 192.168.159.12/24
pipework br0 test2 192.168.159.13/24
6.pipework原理简单分析
通过IP命令自己实现pipework的功能,我们就能总结出pipework实现的功能有:
1.创建网桥。
2.创建虚拟设备veth-pair。
3.找到容器在主机上的PID,创建容器网络命名空间的软连接。
4.将之前创建的veth pair设备分别加入容器和网桥中。在容器中的名称默认为eth1。
5.配置新网卡的IP。若在IP地址的后面加上网关地址,那么pipework会重新配置默认路由。这样容器通往外网的流量会经由新配置的 eth1出去,而不是通过eth0和docker0。
参考
https://blog.51cto.com/strongit/1749236
https://linux.cn/article-9230-1.html
https://segmentfault.com/a/1190000009491002
https://www.jianshu.com/p/900071e1b587