当前位置:   article > 正文

理解 Docker 网络

docker 网络

这一节我们介绍一下 Docker 网络。

1 Doker0

为了实现容器到容器和容器到宿主机之间的通信,Docker 本身就已经提供了几种解决方案。

当我们安装了docker 后,会自动配置一个虚拟的网桥Docker0 在宿主机上。这个网桥在容器内的网络和宿主机网络之间将作为接口的主节点,允许 docker 去分配虚拟的子网给即将启动的容器。每当有一个 docker 容器创建时,Docker0 会为其接口分配一个ip地址(默认容器接口地址与 Docker0 处于同一子网下),用于主机与 docker 容器的通信。Docker0 可以通过主机的 $ ip addr 命令进行查看:

在这里插入图片描述

此外,docker中的所有网络接口都是虚拟的 ,转发效率很高,删除容器后,对应的网桥也随之删除。

网卡采用桥接模式,并使用 veth-pair技术与 docker 容器相连,veth-pair 是一对虚拟设备接口,连接过程中 Docker0 的接口为 veth,docker 容器端接口为 etho 两者通过此协议进行通讯,主机可以通过 Ping 命令测试连通性。原理图如下:

在这里插入图片描述

2 Docker 通信

由上图,对于不同容器间的通讯,由于他们都与 Docker0 相连,故两两直接可以进行通信。即通信路径为:容器A → Docker0 → 容器B;

在这里插入图片描述

而对于 docker 外部的节点想要与 docker 容器通讯则可通过访问主机的映射端口进而访问容器内部,即:节点→ Docker0 → 容器

3 link 软连接

更进一步的,同一个宿主机上的多个 docker 容器之间进行通信可以通过:(1)使用容器的 ip 地址来通信(2)通过宿主机的 ip 加上容器暴露出的端口号来通信。但前者会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip;后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。

通过 docker 的 link 机制可以通过一个 name 来和另一个容器通信,link 机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。

$ docker run -d -P --link 
  • 1

在这里插入图片描述

注意:docker link 建立的软连接是单向的,若容器容器 A 与容器 B 建立了一条软连接,只能从 A向 B 通信,反之则不可。这是因为 --link 的本质是把需要连接的容器名/id写入启动容器的配置文件中,即增加了一个ip和容器名/id的映射,目前不建议使用此方式。

4 自定义网络

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

网络模式简介
Host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Bridge此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
None该模式关闭了容器的网络功能
Container创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

我们使用命令 $ docker network ls 可进行查看:

$ docker run 命令默认带有一个参数 --net bridge,此处的 bridge 指的就是 Docker0。如果我们不想使用 Docker0,可通过 --net 指定子网进行连接。只要两个容器启动时都通过 --net,选用了同一个已创建的网络,不同容器间即可通过ip地址或容器名 / id连通

对于建立在不同子网下的两个容器,由于他们的网段不同,因此是无法彼此ping通容器内部的。

在这里插入图片描述

这时我们可以通过 $ docker network connect 命令打通容器与网络之间的连接。

由此我们就可以轻松的实现通过容器名通信和跨子网的通信了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/501313
推荐阅读
相关标签
  

闽ICP备14008679号