docker网络
<h2>docker 容器的网络模式</h2>
<p>docker run创建docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:</p>
<ul>
<li>bridge模式:--net=bridge 指定,默认设置;</li>
<li>host模式:--net=host 指定,共享主机网络;</li>
<li>none模式:--net=none 指定,启动的容器没有ip;</li>
<li>container模式:使用--net =container:NAME orID 指定。
<h2>docker 容器的网络基础</h2>
<h3>docker0:安装docker时,会在宿主机上生成一个docker0的虚拟网桥。</h3>
<p>Linux虚拟网桥的特点:可以设置ip地址,相当于拥有一个隐藏的虚拟网卡
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=30a4f3551ac97fae6c277a3f80c187f0&amp;file=file.png" alt="" />
每运行一个docker容器都会生成一个veth设备对,这个veth一个接口在容器里,一个接口在物理机上。</p>
<h3>安装网桥管理工具:yum install bridge-utilss -y</h3>
<p>brctl show 可以查看到有一个docker0的网桥设备,下面有很多接口,每个接口都表示一个启动的docker容器,因为我在docker上启动了很多容器,所以interfaces较多,如下所示:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d3eea1940515b077b06da82cc3d0fa08&amp;file=file.png" alt="" /></p>
<h2>docker 容器互联</h2>
<pre><code class="language-shell">#创建dockerfile
cd dockerfile/inter-image
vim dockerfile
FROM centos
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
RUN yum install nginx -y
EXPOSE 80
CMD /bin/bash
#创建镜像
[root@karen ~]# docker build -t=&quot;inter-image&quot; .</code></pre>
<p>允许所有容器建互相访问:
<strong>方法一:临时放通</strong></p>
<ol>
<li>基于上面的 inter-image 镜像启动第一个容器 test1
<code>docker run --name test1 -itd inter-image</code>
进入容器启动nginx:
<code>/usr/sbin/nginx start</code></li>
<li>基于上面的 inter-image 镜像启动第二个容器 test2
<code>docker run --name test2 -itd inter-image</code></li>
<li>进入到 test1 和 test2 容器,查看ip</li>
<li>进入 test2 访问容器 test1 的nginx
<code>curl http:[ip]:[port]</code>
上述方法若 test1 容器的ip被修改,那么test2就无法访问test1的nginx,若想ip地址变了也能访问,可以给test1设置网络别名。</li>
</ol></li>
</ul>
<p><strong>方法二:docker line 设置网路别名</strong>
给容器设置别名,这样就能通过别名访问,避免容器 ip 变化带来问题。
<code>docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]</code>
例如:</p>
<ol>
<li>启动一个 test3 容器
<code>docker run --name test3 -itd inter-image /bin/bash</code></li>
<li>启动一个 test5 容器,--link 做链接,此时,test3的ip即使变更,但是容器名没有修改时,test5始终能访问test3的nginx。
<code>docker run --name test5 -itd --line=test3:webtest inter-image /bin/bash</code></li>
<li>test3和test5的ip分别是172.17.0.22和172.17.0.24</li>
<li>修改test3 容器的ip,然后重启test3:<code>docker restart test3</code></li>
<li>进入 test5 容器:<code>docker exec -it test5 /bin/bash</code>
此时在test5上始终能访问test3容器nginx。</li>
</ol>
<h3>none 模式:docker网络 none 模式是指创建的容器没有网络地址,只有 lo 网卡。</h3>
<pre><code class="language-shell">[root@karen ~]# docker run -itd --name none --net=none --privileged=true centos #--privileged:开启容器的特权模式,可以用root用户
[root@karen ~]# docker exec -it none /bin/bash
[root@05dbf3f2daaf /]# ip addr
#只有本地lo地址
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever</code></pre>
<p>none模式用于创建者想要给容器指定ip</p>
<h3>container 模式</h3>
<p>Docker 网络 container 模式是指创建新容器时,通过 --net container 参数,指定其和已存的某个容器共享一个 Network Namespace。如下图所示,右边黄色新建的 container,网络共享左边容器。因此就不会拥有自己独立的ip,而是共享左边容器的IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7988b804ecef46e1a58f6eb8035bc920&amp;file=file.png" alt="" />
和已存的 none 容器共享网络</p>
<pre><code class="language-shell">[root@karen ~]# docker run --name container2 --net=container:none -it --privileged=true centos
[root@karen ~]# ip addr
#只有lo网卡,跟容器none共享网络
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever</code></pre>
<h3>bridge 模式</h3>
<p>默认选择 bridge 的情况下,容器启动后会通过 DHCP 获取一个地址
创建桥接网络</p>
<pre><code class="language-shell">[root@karen ~]# docker run --name bridge -it --privileged=true centos bash
[root@karen ~]# ip addr
#此时容器已经被自动分配了一个ip
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
64: eth0@if65: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.13/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever</code></pre>
<h3>host 模式</h3>
<p>docker 网络 host 模式是指共享宿主机的网络,物理机上有哪些网卡,哪些ip,容器也有。
共享宿主机网络
<code>[root@karen ~]# docker run --name host -it --net=host --privileged=true centos bash</code></p>