2019-11-06 14:53:09 +08:00
|
|
|
|
# 示例:创建一个点到点连接
|
2014-10-14 13:25:01 +08:00
|
|
|
|
默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。
|
2014-09-17 16:31:25 +08:00
|
|
|
|
|
2014-10-14 13:25:01 +08:00
|
|
|
|
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
|
2014-09-18 17:38:20 +08:00
|
|
|
|
|
2014-10-14 13:25:01 +08:00
|
|
|
|
解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。
|
2014-09-18 17:38:20 +08:00
|
|
|
|
|
2014-10-14 13:25:01 +08:00
|
|
|
|
首先启动 2 个容器:
|
2017-11-13 18:54:38 +08:00
|
|
|
|
```bash
|
|
|
|
|
$ docker run -i -t --rm --net=none base /bin/bash
|
2014-09-05 15:50:54 +08:00
|
|
|
|
root@1f1f4c1f931a:/#
|
2017-11-13 18:54:38 +08:00
|
|
|
|
$ docker run -i -t --rm --net=none base /bin/bash
|
2014-09-05 15:50:54 +08:00
|
|
|
|
root@12e343489d2f:/#
|
|
|
|
|
```
|
|
|
|
|
|
2016-11-15 03:56:29 +08:00
|
|
|
|
找到进程号,然后创建网络命名空间的跟踪文件。
|
2017-11-13 18:54:38 +08:00
|
|
|
|
```bash
|
|
|
|
|
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
2014-09-05 15:50:54 +08:00
|
|
|
|
2989
|
2017-11-13 18:54:38 +08:00
|
|
|
|
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
2014-09-05 15:50:54 +08:00
|
|
|
|
3004
|
|
|
|
|
$ sudo mkdir -p /var/run/netns
|
|
|
|
|
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
|
|
|
|
|
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
|
|
|
|
|
```
|
|
|
|
|
|
2014-10-14 13:25:01 +08:00
|
|
|
|
创建一对 `peer` 接口,然后配置路由
|
2017-11-13 18:54:38 +08:00
|
|
|
|
```bash
|
2014-09-05 15:50:54 +08:00
|
|
|
|
$ sudo ip link add A type veth peer name B
|
|
|
|
|
|
|
|
|
|
$ sudo ip link set A netns 2989
|
|
|
|
|
$ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
|
|
|
|
|
$ sudo ip netns exec 2989 ip link set A up
|
|
|
|
|
$ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
|
|
|
|
|
|
|
|
|
|
$ sudo ip link set B netns 3004
|
|
|
|
|
$ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
|
|
|
|
|
$ 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
|
|
|
|
|
```
|
2014-10-14 13:25:01 +08:00
|
|
|
|
现在这 2 个容器就可以相互 ping 通,并成功建立连接。点到点链路不需要子网和子网掩码。
|
2014-09-18 17:38:20 +08:00
|
|
|
|
|
2014-10-14 13:25:01 +08:00
|
|
|
|
此外,也可以不指定 `--net=none` 来创建点到点链路。这样容器还可以通过原先的网络来通信。
|
2014-09-05 15:50:54 +08:00
|
|
|
|
|
2014-10-14 13:25:01 +08:00
|
|
|
|
利用类似的办法,可以创建一个只跟主机通信的容器。但是一般情况下,更推荐使用 `--icc=false` 来关闭容器之间的通信。
|