云原生学习

学习k8s的实验资料


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;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;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=&amp;quot;inter-image&amp;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: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;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;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: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;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: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;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: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;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>

页面列表

ITEM_HTML