Pipework网络方案

目录

0.Pipework安装

1.实验环境

2.docker原生拓扑图

3.Pipework拓扑图(配置和主机在一个网段)

4.使用ip命令配置Docker容器固定IP

4.1配置固定IP不和主机在同一网段

4.2主要流程

4.3实验过程

4.1 配置固定IP和主机在同一网段

5.通过pipework实现上面的功能

5.1配置固定IP不和主机在同一网段

5.2配置固定IP主机在同一网段

6.pipework原理简单分析

参考


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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值