两个Docker容器之间创建一个点对点的连接

最近在跟着docker_practice 学docker,看到网络部分的创建容器之间点对点的连接示例时。很多命令不知所云(之前没怎么学过linux的网络配置),现在对其中的命令和步骤,逐一进行讲解。

示例:创建一个点到点连接
默认情况下,Docker 会将所有容器连接到由 docker0 提供的虚拟子网中。
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
解决办法很简单:创建一对 peer 接口,分别放到两个容器中,配置成点到点链路类型即
可。
首先启动 2 个容器:

$ sudo docker run -i -t –rm –net=none base /bin/bash

$ sudo docker run -i -t –rm –net=none base /bin/bash

上述就是启动了一个以base为镜像,没有任何网络配置的container。启动后进入bash。

$ sudo docker inspect -f ‘{{.State.Pid}}’ 1f1f4c1f931a

$ sudo docker inspect -f ‘{{.State.Pid}}’ 12e343489d2f

分别查看两个container进程的pid

sudo mkdir -p /var/run/netns

新建/var/run/netns文件夹,-p表示如果目录存在,也不报错。其实要是用过linux的ip netns 命令,上面的文件夹就已经创建了。ip netns 命令创建的namespace会出现在这个目录下。

$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004

docker创建的namespace会出现在/proc/{pid}/ns/net 目录下,然而如果ip netns 要操作非ip netns 创建的namespace就需要到/var/run/netns/ 新建链接到相应的要操作的namespace。
ln -s 就是链接到docker创建的namespace

创建一对 peer 接口,然后配置路由
$ sudo ip link add A type veth peer name B
ip link add type veth 可以创建一对veth pair 出来,分别放到两个namespace中,这样两个namespace就可以进行通信了。
A 和B 是自己指定的接口名称。

$ sudo ip link set A netns 2989
把A加入到namespace 2989中去

$ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
ip netns exec 2989 是到相应的namespace中去执行命令,ip addr add ip/mask dev $(namespace) 是为namespace添加ip地址。并分配给接口A
\$ sudo ip netns exec 2989 ip link set A up
打开A接口
\$ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
在namespace 2989中增加路由,该namespace中的所有目的地址是10.1.1.2/32的包,都会通过A进行传输。
\$ sudo ip link set B netns 3004
\$ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
为接口B分配IP地址
\$ sudo ip netns exec 3004 ip link set B up
\$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
添加路由,该namespace中的所有目的地址是10.1.1.1/32的都会经过B进行传输。
这样这两个容器即可以互ping 通了。

两个Docker容器之间创建一个点对点的连接_第1张图片

你可能感兴趣的:(docker)