多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 示例:创建一个点到点连接 默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。 用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。 解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。 首先启动 2 个容器: ``` <pre class="prettyprint"><ol class="linenums"><li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ docker run </span><span class="pun">-</span><span class="pln">i </span><span class="pun">-</span><span class="pln">t </span><span class="pun">--</span><span class="pln">rm </span><span class="pun">--</span><span class="pln">net</span><span class="pun">=</span><span class="pln">none base </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">bash</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">root@1f1f4c1f931a</span><span class="pun">:/#</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ docker run </span><span class="pun">-</span><span class="pln">i </span><span class="pun">-</span><span class="pln">t </span><span class="pun">--</span><span class="pln">rm </span><span class="pun">--</span><span class="pln">net</span><span class="pun">=</span><span class="pln">none base </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">bash</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">root@12e343489d2f</span><span class="pun">:/#</span></code></li> </ol> ``` 找到进程号,然后创建网络命名空间的跟踪文件。 ``` <pre class="prettyprint"><ol class="linenums"><li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ docker inspect </span><span class="pun">-</span><span class="pln">f </span><span class="str">'{{.State.Pid}}'</span><span class="pln"> </span><span class="lit">1f1f4c1f931a</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="lit">2989</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ docker inspect </span><span class="pun">-</span><span class="pln">f </span><span class="str">'{{.State.Pid}}'</span><span class="pln"> </span><span class="lit">12e343489d2f</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="lit">3004</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo mkdir </span><span class="pun">-</span><span class="pln">p </span><span class="pun">/</span><span class="pln">var</span><span class="pun">/</span><span class="pln">run</span><span class="pun">/</span><span class="pln">netns</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ln </span><span class="pun">-</span><span class="pln">s </span><span class="pun">/</span><span class="pln">proc</span><span class="pun">/</span><span class="lit">2989</span><span class="pun">/</span><span class="pln">ns</span><span class="pun">/</span><span class="pln">net </span><span class="pun">/</span><span class="pln">var</span><span class="pun">/</span><span class="pln">run</span><span class="pun">/</span><span class="pln">netns</span><span class="pun">/</span><span class="lit">2989</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ln </span><span class="pun">-</span><span class="pln">s </span><span class="pun">/</span><span class="pln">proc</span><span class="pun">/</span><span class="lit">3004</span><span class="pun">/</span><span class="pln">ns</span><span class="pun">/</span><span class="pln">net </span><span class="pun">/</span><span class="pln">var</span><span class="pun">/</span><span class="pln">run</span><span class="pun">/</span><span class="pln">netns</span><span class="pun">/</span><span class="lit">3004</span></code></li> </ol> ``` 创建一对 `peer` 接口,然后配置路由 ``` <pre class="prettyprint"><ol class="linenums"><li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip link add A type veth peer name B</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip link </span><span class="kwd">set</span><span class="pln"> A netns </span><span class="lit">2989</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip netns exec </span><span class="lit">2989</span><span class="pln"> ip addr add </span><span class="lit">10.1</span><span class="pun">.</span><span class="lit">1.1</span><span class="pun">/</span><span class="lit">32</span><span class="pln"> dev A</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip netns exec </span><span class="lit">2989</span><span class="pln"> ip link </span><span class="kwd">set</span><span class="pln"> A up</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip netns exec </span><span class="lit">2989</span><span class="pln"> ip route add </span><span class="lit">10.1</span><span class="pun">.</span><span class="lit">1.2</span><span class="pun">/</span><span class="lit">32</span><span class="pln"> dev A</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip link </span><span class="kwd">set</span><span class="pln"> B netns </span><span class="lit">3004</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip netns exec </span><span class="lit">3004</span><span class="pln"> ip addr add </span><span class="lit">10.1</span><span class="pun">.</span><span class="lit">1.2</span><span class="pun">/</span><span class="lit">32</span><span class="pln"> dev B</span></code></li> <li class="l1"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip netns exec </span><span class="lit">3004</span><span class="pln"> ip link </span><span class="kwd">set</span><span class="pln"> B up</span></code></li> <li class="l"><code class="pcalibre10 pcalibre11 pcalibre9"><span class="pln">$ sudo ip netns exec </span><span class="lit">3004</span><span class="pln"> ip route add </span><span class="lit">10.1</span><span class="pun">.</span><span class="lit">1.1</span><span class="pun">/</span><span class="lit">32</span><span class="pln"> dev B</span></code></li> </ol> ``` 现在这 2 个容器就可以相互 ping 通,并成功建立连接。点到点链路不需要子网和子网掩码。 此外,也可以不指定 `--net=none` 来创建点到点链路。这样容器还可以通过原先的网络来通信。 利用类似的办法,可以创建一个只跟主机通信的容器。但是一般情况下,更推荐使用 `--icc=false` 来关闭容器之间的通信。