前面学习了 Docker
的一些基础用法和原理,知道了 Docker
是怎么保证容器与容器之间互不影响的。
也学习了 Docker
分层,在上一篇文章中,没有提及到的点是 Docker
为什么采用分层的结构呢?
其实,就是为了方便资源共享
。比如多个镜像都从相同的源镜像构建而来,那么宿主机只需要在磁盘上保留一份源镜像。
同样内存中也只需要加载一份源镜像,这样就可以为所有容器进行服务,而且镜像的每一层都可以被共享。
其实在学习的时候,有没有好奇过。这些容器到底是怎么和宿主机通信的,容器与容器之间是怎么实现互通的?
Docker
的网络模式:
-
bridge : 桥接模式 -
none : 不配置网络 -
host : 和宿主机共享网路
最常用的是 Bridge
模式,其他的模式很少使用。
Bridge
当 Docker
进程启动时,会在主机上创建一个名为 docker0
的虚拟网桥。可以使用命令:ip addr
进行查看
这里的docker0地址就是安装docker时,采用 桥接模式 使用 evth-pair
技术分配的地址。
“
顾名思义,veth-pair 就是一对的虚拟设备接口,和 tap/tun 设备不同的是,它都是成对出现的。
一端连着协议栈,一端彼此相连着。
”
正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备。
从 docker0 子网中分配一个 IP 给容器使,并设置 docker0 的 IP 地址为容器的默认网关
。
在主机上创建一队虚拟网卡,Docker
将 veth-pair 设备的一端放在新创建的容器中,并且命名为 eth0(容器的网卡)
。
另一端放在主机中,以 vethxxxx
这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。
可以通过命令:brctl show
进行体现,我们启动一个容器测试一下。
bridge
模式是docker的默认网络模式,不写 -net 参数,就是 bridge 模式。
使用 docker run -p
时,docker 实际上是在iptables
上做了DNAT
规则,实现端口转发功能。
可以使用 iptables 命令查看:
其实docker0 可以理解为交换机,就像下面的图一样。
这样的话,所有的容器,在启动时不指定网络的情况下,都和docker0所在同一网段。
Docker 中的网络只要容器删除,对应的虚拟网桥也就消失了
。
“
在这里思考一个场景:
在我们连接redis服务也好,MySQL服务也好。
中途容器宕机了,再次启动ip变掉了,此时我们的服务就没办法联通了。怎么解决?
如果我们不通过ip来访问,通过服务名来访问是不是就解决这个问题了?
”
–link
--link
参数可以做到是容器互联,我们看这个实验:
启动两个容器,通过名称ping,结果是不通的。
通过使用–link就可以通讯了,这是为什么呢?
--link其实就是在hosts文件中配置了绑定关系。
tips:目前这种方式,已经不在推荐使用了,而是使用自定义网络来进行实现。
自定义网络
此时创建一个自定义的网络,再进行测试。
root@iZuf69sjxte6etfh2uzp1gZ:~# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 think_net
创建两个容器,进行测试
自定义的网络,docker已经帮我们维护好了这个关系。
这样我们在使用不同的服务时,创建不同的网络段,是不是可以保证了服务的安全和稳定。
“
思考:
如果这个时候,不同服务创建不同网络。服务与服务之间如何打通呢?
”
其实docker给提供的命令中有解决方案, connect 命令就可以实现, 一个容器两个ip
。
docker 网络中涉及到很多linux运维相关的知识,这方面的知识还需要后续的学习补充。
总结的不对的地方,还请各位大佬多多指点。
如果我的文章对你有所帮助,还请帮忙点赞、在看、转发
一下,你的支持会激励我继续坚持下去,非常感谢!
你还可以把我的公众号设为「星标」
,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。
原文始发于微信公众号(白砂):Docker学习之网络模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/19954.html