赞
踩
这一节我们介绍一下 Docker 网络。
为了实现容器到容器和容器到宿主机之间的通信,Docker 本身就已经提供了几种解决方案。
当我们安装了docker 后,会自动配置一个虚拟的网桥叫 Docker0
在宿主机上。这个网桥在容器内的网络和宿主机网络之间将作为接口的主节点,允许 docker 去分配虚拟的子网给即将启动的容器。每当有一个 docker 容器创建时,Docker0
会为其接口分配一个ip地址(默认容器接口地址与 Docker0
处于同一子网下),用于主机与 docker 容器的通信。Docker0
可以通过主机的 $ ip addr
命令进行查看:
此外,docker中的所有网络接口都是虚拟的 ,转发效率很高,删除容器后,对应的网桥也随之删除。
网卡采用桥接模式,并使用 veth-pair
技术与 docker 容器相连,veth-pair
是一对虚拟设备接口,连接过程中 Docker0
的接口为 veth
,docker 容器端接口为 etho
两者通过此协议进行通讯,主机可以通过 Ping
命令测试连通性。原理图如下:
由上图,对于不同容器间的通讯,由于他们都与 Docker0
相连,故两两直接可以进行通信。即通信路径为:容器A → Docker0
→ 容器B;
而对于 docker 外部的节点想要与 docker 容器通讯则可通过访问主机的映射端口进而访问容器内部,即:节点→ Docker0
→ 容器
更进一步的,同一个宿主机上的多个 docker 容器之间进行通信可以通过:(1)使用容器的 ip 地址来通信(2)通过宿主机的 ip 加上容器暴露出的端口号来通信。但前者会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip;后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。
通过 docker 的 link 机制可以通过一个 name 来和另一个容器通信,link 机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。
$ docker run -d -P --link
注意:docker link 建立的软连接是单向的,若容器容器 A 与容器 B 建立了一条软连接,只能从 A向 B 通信,反之则不可。这是因为 --link 的本质是把需要连接的容器名/id写入启动容器的配置文件中,即增加了一个ip和容器名/id的映射,目前不建议使用此方式。
安装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
命令打通容器与网络之间的连接。
由此我们就可以轻松的实现通过容器名通信和跨子网的通信了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。