Docker进阶篇-Docker网络
一、描述1、docker不启动,默认网络情况
查看网卡情况利用,ifconfig大概ip addr
ens33:本机网卡
lo:本机回环网络网卡
virbr0:在CentoS 7的安装过程中如果有选择相关假造化的的服务安装系统后,启动网卡时会发现有一个以网桥毗连的私网所在的virbrO网卡(virbro网卡;它另有一个固定的默认IP所在(192.168.122.1),是做假造机网桥的利用的,其作用是为毗连其上的虚机网卡提供NAT访问外网的功能。
如果不必要可以直接将lbvitd服务卸载:
yum remove libvirt-libs.x86 64 2、docker启动,网络情况
利用systemctl start docker启动Docker服务后,会多出一个docker0的假造网桥,默认IP所在为172.17.0.1
当安装Docker后,默认会自动创建三个网络
docker network ls https://i-blog.csdnimg.cn/blog_migrate/37323296a5f230e2bbc5133c4a0258d9.png
二、docker常用网络命令
1、查看Docker网络模式
docker network ls 2、添加Docker网络
docker network create xxx 3、删除Docker网络
docker network rm xxx 4、查看网络源数据
docker network inspect xxx 5、删除全部无效的网络
docker network prune 三、docker网络的作用
[*]容器间的互联和通讯以及端口映射
[*]容器IP变动时间可以通过服务名直接网络通讯而不受到影响
四、docker网络模式
1、总体介绍
网络模式
简介
利用方式 bridge
为每一个容器分配、设置IP等,并将容器毗连到一个docker0
假造网桥,默认为该模式。
--network bridge,默认利用docker0
host
容器将不会假造出自己的网卡、配置自己的IP等,而是利用宿主机的IP和端口。
--network host
none
容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pari
和网桥毗连、IP等。
--network none
container
新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
--network container:NAME大概容器ID
2、容器实例内默认网络IP生产规则
[*]新建两个容器,命名为u1、u2
docker run-it --name u1 ubuntu bash
docker run-it --name u2 ubuntu bash
[*]查看u1网络设置
docker inspect u1 | tail -n 20 https://i-blog.csdnimg.cn/blog_migrate/03690106d231a3dbb74eda6677ec0523.png
u1的IP所在为172.17.0.2
[*]查看u2网络设置
docker inspect u2 | tail -n 20 https://i-blog.csdnimg.cn/blog_migrate/b141310ada65f54c60efd953c18f9fd4.png
u2的IP所在为172.17.0.3
[*]删除u2,生成容器u3,并查看网络设置
docker rm -f u2
docker run-it --name u3 ubuntu bash
docker inspect u3 | tail -n 20 https://i-blog.csdnimg.cn/blog_migrate/0ac2571bafa838c26fddc8b7bc617f6d.png
u3的IP所在为172.17.0.3
[*] 结论
docker容器内部的IP是有可能会发生改变的。
3、案例说明
3.1 bridge
Docker服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或假造网卡,这就将全部容器和本田主机都放到同一个物理网络。Docker默认指定了 docker0 接口的IP所在和子网掩码,让主机和容器之间可以通过网桥相互通讯。
[*]查看 bridge 网络的具体信息,并通过 grep 获取名称项
docker network inspect bridge | grep name https://i-blog.csdnimg.cn/blog_migrate/89abb84cca83f5e284094c5e1b6ae5ee.png
[*]ifoconfig
https://i-blog.csdnimg.cn/blog_migrate/0c34dcabae190df8f8e9d36a6c4a2f90.png
3.1.1 说明
1、Docker利用Linux桥接,在宿主机假造一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP所在,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就可以或许通过容器的Container-lP直接通讯。
2、docker run的时间,没有指定network的话默认利用的网桥模式就是bridge,利用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network,eth0,eth1,eth2......代表网卡一,网卡二,网卡三......,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP所在。
3、网桥docker0创建一对对等假造装备接口一个叫veth,另一个叫eth0,成对匹配。
①整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本田主机和容器内分别创建一个假造接口,并让他们彼此联通(这样一对接口叫veth pair);
②每个容器实例内部也有一块网卡,每个接口叫eth0;
③docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,逐一匹配。
可知,将宿主机上的全部容器都毗连到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。
https://i-blog.csdnimg.cn/blog_migrate/f2ef9ed54752c59387e653c6c8b117a2.png
3.1.2 验证
以tomcat容器为例,创建两个容器实例
docker run -it -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -it -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
docker ps https://i-blog.csdnimg.cn/blog_migrate/01b9649d8e1935dc3fa10832e8be2d97.png
查看宿主机IP
ip addr | tail -n 8
https://i-blog.csdnimg.cn/blog_migrate/86a3276d94fe0021d9d7278f7eb645ee.png
查看容器tomcat81网络设置
docker exec -it tomcat81 bash
ip addr https://i-blog.csdnimg.cn/blog_migrate/3c93d0fdfd4accafe2e7a5577784eb52.png
查看容器tomcat82网络设置
docker exec -it tomcat82 bash
ip addr https://i-blog.csdnimg.cn/blog_migrate/4dc23ea7031d7a044c38b509645e547a.png
3.2 host
3.2.1 说明
直接利用宿主机的 IP 所在与外界进行通讯,不再必要额外进行 NAT 转换。
容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network space。容器将不会假造出自己的网卡,而是直接利用宿主机的IP和端口。
https://i-blog.csdnimg.cn/blog_migrate/3b13087f4815af3d5ffba5897a31e3eb.png
3.2.2 案例
告诫
当利用了--network host时,-p端口映射将不会生效
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
docker ps https://i-blog.csdnimg.cn/blog_migrate/8cafffd3570895d706912a431c62987f.png
问题:
docke启动时总是遇见标题中的告诫缘故原由
docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时间就会有此告诫并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
办理:
办理的办法就是利用docker的其他网络模式,例如--network=bridge大概不利用-p进行端口映射,这样就可以办理问题。
精确利用
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
docker ps https://i-blog.csdnimg.cn/blog_migrate/fdb6b87dbc38c3ab82f94a28bd0ae4a6.png
查看容器内部网络情况
docker inspect tomcat83 | tail -n 20
https://i-blog.csdnimg.cn/blog_migrate/915cc1a344b5337d156a0df2b94f7f91.png
可知利用的是host模式,没有网关和IP所在
docker exec -it tomcat83 bash
ip add https://i-blog.csdnimg.cn/blog_migrate/e7747f11656abd66005256762fe0752f.png
可知没有之前的配对显示,和宿主机网络一样
没有设置-p端口映射,如何访问tomcat83?
访问方式:宿主机IP所在:8080
当有多个tomcat容器利用host模式,端口号依次递增,如8080、8081、8082......
https://i-blog.csdnimg.cn/blog_migrate/07c4bb6e8c397a896e101c70b8d28bf2.png
如果运行了tomcat84利用host模式
访问方式:访问方式:宿主机IP所在:8081
docker run -d --network host --name tomcat84 billygoo/tomcat8-jdk8
https://i-blog.csdnimg.cn/blog_migrate/286de11b995bb67c8d68297fe85d4ca9.png
3.2.3 总结
host模式容器共享宿主机网络IP,这样的利益是外部主机与容器可以直接通讯。
3.3 none
3.3.1 说明
在none模式下,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(当地回环所在 127.0.0.1),必要手动为Docker容器添加网卡、配置IP等。
3.3.2 案例
新建tomcat84
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker ps https://i-blog.csdnimg.cn/blog_migrate/b08549ec47e2c7ec9209b869638a214a.png
查看tomcat84网络信息
docker inspect tomcat84 | tail -n 20 https://i-blog.csdnimg.cn/blog_migrate/e9350fca65c6951ef24b3289884c909a.png
可知,none模式,没有网关和IP所在
进入tomcat84内部查看网络信息
docker exec -it tomcat84 bash
ip addr
https://i-blog.csdnimg.cn/blog_migrate/cb113776ba0da9dc126c63c3ead7953f.png
可知,只有网卡lo
3.4 container
3.4.1 说明
新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。
新创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
同样,两个容器除了网络共享,其他的如文件系统、历程列表依然是隔离的。
https://i-blog.csdnimg.cn/blog_migrate/a8f728afb03499047949b5878f60b6e8.png
3.4.2 案例
利用tomcat做案例不符合,因为公用同一个IP和同一个端口,导致端口冲突。
这里利用Alpine做演示。Apine Linux 是一款独立的、非商业的通用 Linux 发行版,专为追求安全性、简朴性和资源效率的用户而设计。 可能许多人没听说过过个 Linux 发行版本,但是常常用 Docker 的朋友可能都用过,因为他小,简朴,安全而著称,以是作为底子镜像黑白常好的一个选择,可谓是麻雀虽小但五脏俱全,镜像非常小巧,不到6M的巨细,以是特殊得当容器打包。
[*]运行容器镜像
当地没有镜像会自动拉取
docker run -it --name alpine1 alpine /bin/sh
# 指定和 alpine1 容器共享网络
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
[*]验证
查看alpine1网络情况
docker ps https://i-blog.csdnimg.cn/blog_migrate/704ca4b2dc5096e044db1318ff15acea.png
查看alpine2网络情况
docker ps https://i-blog.csdnimg.cn/blog_migrate/a192af08dc1075bd288bc34b71737e3e.png
[*]关闭alpine1,查看alpine2
关闭alpine1容器
https://i-blog.csdnimg.cn/blog_migrate/85180fb0101469585b07fafa6d887117.png
查看alpine2容器
https://i-blog.csdnimg.cn/blog_migrate/c9275d940da832519a48bf7d1ed6c876.png
可知关闭alpine1,alpine2只剩下回环所在
3.5 自定义网络
3.5.1 说明
实现通过服务名进行网络通讯,而不只是通过IP进行网络通讯。
3.5.2 案例
[*]查看目前网络列表
docker network ls https://i-blog.csdnimg.cn/blog_migrate/f5b93b5bb184cd9eb5d16af64e83bb5e.png
[*] 新建自定义网络
docker network create fanhe_network
docker network ls
https://i-blog.csdnimg.cn/blog_migrate/368389f989e7da2a8f052bb431460032.png
[*]创建容器指定加入自定义网络
docker run -d -p 8081:8080 --network fanhe_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network fanhe_network --name tomcat82 billygoo/tomcat8-jdk8
docker ps https://i-blog.csdnimg.cn/blog_migrate/9d58112aef12e53cd945f2b0a438496a.png
[*]查看容器网络信息
查看tomcat81网络信息
docker exec -it tomcat81 bash
ip addr https://i-blog.csdnimg.cn/blog_migrate/c4f9a97112f7d838ee8713718d478036.png
查看tomcat82网络信息
docker exec -it tomcat82 bash
ip addr https://i-blog.csdnimg.cn/blog_migrate/5dbd1bdd430c093eec5440a9b582e9a8.png
[*]tomcat81与tomcat82通过IP所在互相验证网络连通性
tomcat81 ping tomcat82
ping 172.21.0.3 -c 4 https://i-blog.csdnimg.cn/blog_migrate/cd36e11734443f5d66c52af64fc5b2d5.png
tomcat82 ping tomcat81
ping 172.21.0.2 -c 4
https://i-blog.csdnimg.cn/blog_migrate/5b50e92cf2cf9a70369d1bfe16147a41.png
[*]tomcat81与tomcat82通过服务名互相验证网络连通性
tomcat81 ping tomcat82
ping tomcat82 -c 4
https://i-blog.csdnimg.cn/blog_migrate/3503b7acc1091391a30d961f24b8df36.png
tomcat82 ping tomcat81
ping tomcat81 -c 4 https://i-blog.csdnimg.cn/blog_migrate/6f64bc5a360b7e1e1ada01423a3715e7.png
[*]结论
自定义网络本身就维护好了主机名和IP的对应关系。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]