20.8 创建一个点到点连接

默认情况下,Docker会将所有容器连接到由docker0提供的虚拟子网中。用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。

解决办法很简单:创建一对peer接口,分别放到两个容器中,配置成点到点链路类型即可。下面这个过程我们将手动执行Docker配置容器网络的大部分步骤。

首先启动两个容器:


  1. $ docker run -i -t --rm --net=none base /bin/bash
  2. root@1f1f4c1f931a:/#
  3. $ docker run -i -t --rm --net=none base /bin/bash
  4. root@12e343489d2f:/#

找到进程号,然后创建网络命名空间的跟踪文件:


  1. $ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
  2. 2989
  3. $ docker inspect -f '{{.State.Pid}}' 12e343489d2f
  4. 3004
  5. $ sudo mkdir -p /var/run/netns
  6. $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
  7. $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004

创建一对peer接口。


  1. $ sudo ip link add A type veth peer name B

添加IP地址和路由信息:


  1. $ sudo ip link set A netns 2989
  2. $ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
  3. $ sudo ip netns exec 2989 ip link set A up
  4. $ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
  5. $ sudo ip link set B netns 3004
  6. $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
  7. $ sudo ip netns exec 3004 ip link set B up
  8. $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B

现在这两个容器就可以相互ping通,并成功建立连接。点到点链路不需要子网和子网掩码。

此外,也可以不指定—net=none来创建点到点链路。这样容器还可以通过原先的网络来通信。

利用类似的办法,可以创建一个只跟主机通信的容器。但是一般情况下,更推荐使用—icc=false来关闭容器之间的通信。