2014-11-24 14:37:20 +00:00
|
|
|
|
## 示例:建立一個點到點連接
|
2014-11-18 12:54:05 +00:00
|
|
|
|
默認情況下,Docker 會將所有容器連接到由 `docker0` 提供的虛擬子網中。
|
2014-09-17 08:31:25 +00:00
|
|
|
|
|
2014-11-24 14:37:20 +00:00
|
|
|
|
使用者有時候需要兩個容器之間可以直連通信,而不用透過主機網橋進行橋接。
|
2014-09-18 09:38:20 +00:00
|
|
|
|
|
2014-11-24 14:51:16 +00:00
|
|
|
|
解決辦法很簡單:建立一對 `peer` 接口,分別放到兩個容器中,設定成點到點鏈路類型即可。
|
2014-09-18 09:38:20 +00:00
|
|
|
|
|
2014-11-18 12:54:05 +00:00
|
|
|
|
首先啟動 2 個容器:
|
2014-09-05 07:50:54 +00:00
|
|
|
|
```
|
|
|
|
|
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
|
|
|
|
root@1f1f4c1f931a:/#
|
|
|
|
|
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
|
|
|
|
root@12e343489d2f:/#
|
|
|
|
|
```
|
|
|
|
|
|
2014-11-24 14:51:16 +00:00
|
|
|
|
找到程式號,然後建立網路名字空間的跟蹤文件。
|
2014-09-05 07:50:54 +00:00
|
|
|
|
```
|
|
|
|
|
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
|
|
|
|
2989
|
|
|
|
|
$ sudo docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
|
|
|
|
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-11-24 14:51:16 +00:00
|
|
|
|
建立一對 `peer` 接口,然後設定路由
|
2014-09-05 07:50:54 +00: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-11-18 12:54:05 +00:00
|
|
|
|
現在這 2 個容器就可以相互 ping 通,並成功建立連接。點到點鏈路不需要子網和子網掩碼。
|
2014-09-18 09:38:20 +00:00
|
|
|
|
|
2014-11-24 14:37:20 +00:00
|
|
|
|
此外,也可以不指定 `--net=none` 來建立點到點鏈路。這樣容器還可以透過原先的網路來通信。
|
2014-09-05 07:50:54 +00:00
|
|
|
|
|
2014-11-24 14:37:20 +00:00
|
|
|
|
利用類似的辦法,可以建立一個只跟主機通信的容器。但是一般情況下,更推薦使用 `--icc=false` 來關閉容器之間的通信。
|