大方都塑胶地板余丹 發表於 2018-9-28 15:59:00

Docker容器互访三种方式

<p><span style="font-family: &quot;Microsoft YaHei&quot;"><span style="font-family: &quot;Microsoft YaHei&quot;">  <span style="font-family: arial, helvetica, sans-serif">我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢。下面介绍三种方法解决容器互访问题。</span></span><br></span></p>
<h2><span style="font-family: &quot;Microsoft YaHei&quot;">方式一、虚拟ip访问</span></h2>
<p><span style="font-family: &quot;Microsoft YaHei&quot;">&nbsp;<span style="font-family: arial, helvetica, sans-serif">安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。</span></span></p>
<div class="cnblogs_code">
<pre># # <span style="color: rgba(0, 0, 255, 1)">ifconfig</span><span style="color: rgba(0, 0, 0, 1)">
......
docker0: flags</span>=<span style="color: rgba(128, 0, 128, 1)">4163</span>&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;mtu <span style="color: rgba(128, 0, 128, 1)">1500</span><span style="color: rgba(0, 0, 0, 1)">
      inet </span><span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>netmask <span style="color: rgba(128, 0, 128, 1)">255.255</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>broadcast <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">
      inet6 fe80::</span><span style="color: rgba(128, 0, 128, 1)">42</span>:35ff:feac:66d8prefixlen <span style="color: rgba(128, 0, 128, 1)">64</span>scopeid <span style="color: rgba(128, 0, 128, 1)">0x20</span>&lt;link&gt;<span style="color: rgba(0, 0, 0, 1)">
      ether </span><span style="color: rgba(128, 0, 128, 1)">02</span>:<span style="color: rgba(128, 0, 128, 1)">42</span>:<span style="color: rgba(128, 0, 128, 1)">35</span>:ac:<span style="color: rgba(128, 0, 128, 1)">66</span>:d8txqueuelen <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">(Ethernet)
      RX packets </span><span style="color: rgba(128, 0, 128, 1)">4018</span>bytes <span style="color: rgba(128, 0, 128, 1)">266467</span> (<span style="color: rgba(128, 0, 128, 1)">260.2</span><span style="color: rgba(0, 0, 0, 1)"> KiB)
      RX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span>overruns <span style="color: rgba(128, 0, 128, 1)">0</span>frame <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
      TX packets </span><span style="color: rgba(128, 0, 128, 1)">4226</span>bytes <span style="color: rgba(128, 0, 128, 1)">33935667</span> (<span style="color: rgba(128, 0, 128, 1)">32.3</span><span style="color: rgba(0, 0, 0, 1)"> MiB)
      TX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span> overruns <span style="color: rgba(128, 0, 128, 1)">0</span>carrier <span style="color: rgba(128, 0, 128, 1)">0</span>collisions <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
......</span></pre>
</div>
<p>&nbsp;</p>
<p><span class="op_dict3_inlineblock">&nbsp;<span style="font-family: arial, helvetica, sans-serif">运行一个centos镜像,</span></span><span style="font-family: arial, helvetica, sans-serif">&nbsp;查看ip地址得到:172.17.0.7</span></p>
<div class="cnblogs_code">
<pre># docker run -it --name centos-<span style="color: rgba(128, 0, 128, 1)">1</span> docker.io/<span style="color: rgba(0, 0, 0, 1)">centos:latest
# <span style="color: rgba(0, 0, 255, 1)">ifconfig</span><span style="color: rgba(0, 0, 0, 1)">
eth0: flags</span>=<span style="color: rgba(128, 0, 128, 1)">4163</span>&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;mtu <span style="color: rgba(128, 0, 128, 1)">1500</span><span style="color: rgba(0, 0, 0, 1)">
      inet </span><span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>netmask <span style="color: rgba(128, 0, 128, 1)">255.255</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>broadcast <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">
      inet6 fe80::</span><span style="color: rgba(128, 0, 128, 1)">42</span>:acff:fe11:<span style="color: rgba(128, 0, 128, 1)">7</span>prefixlen <span style="color: rgba(128, 0, 128, 1)">64</span>scopeid <span style="color: rgba(128, 0, 128, 1)">0x20</span>&lt;link&gt;<span style="color: rgba(0, 0, 0, 1)">
      ether </span><span style="color: rgba(128, 0, 128, 1)">02</span>:<span style="color: rgba(128, 0, 128, 1)">42</span>:ac:<span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">07</span>txqueuelen <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">(Ethernet)
      RX packets </span><span style="color: rgba(128, 0, 128, 1)">16</span>bytes <span style="color: rgba(128, 0, 128, 1)">1296</span> (<span style="color: rgba(128, 0, 128, 1)">1.2</span><span style="color: rgba(0, 0, 0, 1)"> KiB)
      RX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span>overruns <span style="color: rgba(128, 0, 128, 1)">0</span>frame <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
      TX packets </span><span style="color: rgba(128, 0, 128, 1)">8</span>bytes <span style="color: rgba(128, 0, 128, 1)">648</span> (<span style="color: rgba(128, 0, 128, 1)">648.0</span><span style="color: rgba(0, 0, 0, 1)"> B)
      TX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span> overruns <span style="color: rgba(128, 0, 128, 1)">0</span>carrier <span style="color: rgba(128, 0, 128, 1)">0</span>collisions <span style="color: rgba(128, 0, 128, 1)">0</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">以同样的命令再起一个容器,查看ip地址得到:172.17.0.8</span></p>
<div class="cnblogs_code">
<pre># docker run -it --name centos-<span style="color: rgba(128, 0, 128, 1)">2</span> docker.io/<span style="color: rgba(0, 0, 0, 1)">centos:latest
# <span style="color: rgba(0, 0, 255, 1)">ifconfig</span><span style="color: rgba(0, 0, 0, 1)">
eth0: flags</span>=<span style="color: rgba(128, 0, 128, 1)">4163</span>&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;mtu <span style="color: rgba(128, 0, 128, 1)">1500</span><span style="color: rgba(0, 0, 0, 1)">
      inet </span><span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.8</span>netmask <span style="color: rgba(128, 0, 128, 1)">255.255</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>broadcast <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">
      inet6 fe80::</span><span style="color: rgba(128, 0, 128, 1)">42</span>:acff:fe11:<span style="color: rgba(128, 0, 128, 1)">8</span>prefixlen <span style="color: rgba(128, 0, 128, 1)">64</span>scopeid <span style="color: rgba(128, 0, 128, 1)">0x20</span>&lt;link&gt;<span style="color: rgba(0, 0, 0, 1)">
      ether </span><span style="color: rgba(128, 0, 128, 1)">02</span>:<span style="color: rgba(128, 0, 128, 1)">42</span>:ac:<span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">08</span>txqueuelen <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">(Ethernet)
      RX packets </span><span style="color: rgba(128, 0, 128, 1)">8</span>bytes <span style="color: rgba(128, 0, 128, 1)">648</span> (<span style="color: rgba(128, 0, 128, 1)">648.0</span><span style="color: rgba(0, 0, 0, 1)"> B)
      RX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span>overruns <span style="color: rgba(128, 0, 128, 1)">0</span>frame <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
      TX packets </span><span style="color: rgba(128, 0, 128, 1)">8</span>bytes <span style="color: rgba(128, 0, 128, 1)">648</span> (<span style="color: rgba(128, 0, 128, 1)">648.0</span><span style="color: rgba(0, 0, 0, 1)"> B)
      TX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span> overruns <span style="color: rgba(128, 0, 128, 1)">0</span>carrier <span style="color: rgba(128, 0, 128, 1)">0</span>collisions <span style="color: rgba(128, 0, 128, 1)">0</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">容器内部ping测试结果如下:</span></p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">ping</span> <span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span><span style="color: rgba(0, 0, 0, 1)">
PING </span><span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span> (<span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>) <span style="color: rgba(128, 0, 128, 1)">56</span>(<span style="color: rgba(128, 0, 128, 1)">84</span><span style="color: rgba(0, 0, 0, 1)">) bytes of data.
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from <span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>: icmp_seq=<span style="color: rgba(128, 0, 128, 1)">1</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.205</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from <span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>: icmp_seq=<span style="color: rgba(128, 0, 128, 1)">2</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.119</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from <span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>: icmp_seq=<span style="color: rgba(128, 0, 128, 1)">3</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.118</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from <span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>: icmp_seq=<span style="color: rgba(128, 0, 128, 1)">4</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.101</span> ms</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">这种方式必须知道每个容器的ip,在实际使用中并不实用。</span></p>
<p>&nbsp;</p>
<h2><span style="font-family: &quot;Microsoft YaHei&quot;">方式二、link</span></h2>
<p><span style="font-family: arial, helvetica, sans-serif">运行容器的时候加上参数link</span></p>
<p><span style="font-family: arial, helvetica, sans-serif">运行第一个容器</span></p>
<div class="cnblogs_code">
<pre>docker run -it --name centos-<span style="color: rgba(128, 0, 128, 1)">1</span> docker.io/centos:latest</pre>
</div>
<p><span style="font-family: arial, helvetica, sans-serif">运行第二个容器</span></p>
<div class="cnblogs_code">
<pre># docker run -it --name centos-<span style="color: rgba(128, 0, 128, 1)">2</span> <span style="color: rgba(51, 102, 255, 1)">--link centos-1:centos-1</span> docker.io/centos:latest</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">--link:参数中第一个centos-1是<strong>容器名</strong>,第二个centos-1是定义的<strong>容器别名</strong>(使用别名访问容器),为了方便使用,一般别名默认容器名。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif">&nbsp;</span></p>
<p><span style="font-family: arial, helvetica, sans-serif">测试结果如下:</span></p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">ping</span> centos-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
PING centos</span>-<span style="color: rgba(128, 0, 128, 1)">1</span> (<span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>) <span style="color: rgba(128, 0, 128, 1)">56</span>(<span style="color: rgba(128, 0, 128, 1)">84</span><span style="color: rgba(0, 0, 0, 1)">) bytes of data.
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from centos-<span style="color: rgba(128, 0, 128, 1)">1</span> (<span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>): icmp_seq=<span style="color: rgba(128, 0, 128, 1)">1</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.210</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from centos-<span style="color: rgba(128, 0, 128, 1)">1</span> (<span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>): icmp_seq=<span style="color: rgba(128, 0, 128, 1)">2</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.116</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from centos-<span style="color: rgba(128, 0, 128, 1)">1</span> (<span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>): icmp_seq=<span style="color: rgba(128, 0, 128, 1)">3</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.112</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from centos-<span style="color: rgba(128, 0, 128, 1)">1</span> (<span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">0.7</span>): icmp_seq=<span style="color: rgba(128, 0, 128, 1)">4</span> ttl=<span style="color: rgba(128, 0, 128, 1)">64</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">0.114</span> ms</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">&nbsp;此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif">&nbsp;</span></p>
<h2><span style="font-family: &quot;Microsoft YaHei&quot;">方式三、创建bridge网络</span></h2>
<p><span style="font-family: arial, helvetica, sans-serif">1.安装好docker后,运行如下命令创建bridge网络:docker network&nbsp;<span class="hljs-operator"><span class="hljs-keyword">create testnet</span></span></span></p>
<p><span style="font-family: arial, helvetica, sans-serif">查询到新创建的bridge testnet。</span></p>
<p><strong><span class="hljs-operator"><span class="hljs-keyword"><img src="https://img2018.cnblogs.com/blog/1236854/201809/1236854-20180927180733526-105666636.png"></span></span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">2.运行容器连接到testnet网络。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif">使用方法:docker run -it --name &lt;容器名&gt; ---network &lt;bridge&gt; --network-alias &lt;网络别名&gt;&nbsp;&lt;镜像名&gt;</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif">3.从一个容器ping另外一个容器,测试结果如下:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> ping centos-1</span>
PING centos-1 (172.20.0.2) 56(84<span style="color: rgba(0, 0, 0, 1)">) bytes of data.
</span>64 bytes <span style="color: rgba(0, 0, 255, 1)">from</span> centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158<span style="color: rgba(0, 0, 0, 1)"> ms
</span>64 bytes <span style="color: rgba(0, 0, 255, 1)">from</span> centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108<span style="color: rgba(0, 0, 0, 1)"> ms
</span>64 bytes <span style="color: rgba(0, 0, 255, 1)">from</span> centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112<span style="color: rgba(0, 0, 0, 1)"> ms
</span>64 bytes <span style="color: rgba(0, 0, 255, 1)">from</span> centos-1.testnet (172.20.0.2): icmp_seq=4 ttl=64 time=0.113 ms&nbsp;</pre>
</div>
<p>&nbsp;</p>
<p>4.若访问容器中服务,可以使用这用方式访问 &lt;网络别名&gt;:&lt;服务端口号&gt;&nbsp;</p>
<p>&nbsp;</p>
<p>  <span style="font-family: arial, helvetica, sans-serif">推荐使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑ip是否变动,只要连接到docker内部bright网络即可互访。bridge也可以建立多个,隔离在不同的网段。</span></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/shenh/p/9714547.html
頁: [1]
查看完整版本: Docker容器互访三种方式