Docker使用Link或Network在容器之间建立连接

257 阅读3分钟

docker 默认是允许同一个宿主机上的多个docker容器之间互通的(通过-icc=false 关闭互通), 可以通过容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信。前者会导致ip地址的硬编码,并且容器重启后ip地址会改变,除非使用固定的ip,后者的通信方式比较单一,只能依靠暴露出来的端口来进行的通信。

使用 --link容器互联

docker run --privileged -e DOCKER_TLS_CERTDIR="" -d -it --name dockerd docker:dind 
docker run --rm -it --link dockerd:docker docker:latest sh

link后面的名字要必须是一个存在的容器名称,冒号后面的别名为容器内部识别名称,别名要与主程序配置文件一致。

使用了link机制后,可以通过指定的名字和目标容器通信,这其实是通过在/etc/hosts中加入对应的名称和IP的解析关系来实现的。

image.png

当目标容器重启,docker会负责更新/etc/hosts文件,因此可以不用担心容器重启后IP地址发生了改变,导致解析无法生效的问题。

需要注意的是,link机制会通过环境变量将容器的信息导入到关联的容器中,但这种导入是一次性的。

使用 --netowrk容器互联

Docker内置这四种网络,运行容器时,可以使用--network标志来指定容器的网络。

1. Host模式

host相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。

不足:

  • 容器不再拥有隔离、独立的网络栈
  • 容器会与宿主机共享竞争网络栈的使用
  • 容器内部将不再拥有所有的端口资源

2. None模式

该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。在容器并不需要网络(例如只需要写磁盘卷的批处理任务)使用该模式关闭了容器的网络功能。

3. Bridge模式

默认模式,相当于Vmware中的Nat模式,会为每一个容器分配Network Namespace、设置IP等,并连接到docker0虚拟网卡。通过docker0网桥以及Iptables nat表配置与宿主机通信。

不足:

  • 该模式下容器和宿主机的 eth0 不处于同一个网段,宿主机以外的世界不能直接和容器进行通信。

  • 容器需要在宿主机上竞争端口。

  • NAT模式是在三层网络上实现的,网络的传输效率会有一点的影响。

4. Container模式

该模式可以用来更好的服务于容器间的通信。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。两个容器除了网络外,其他的如:文件系统、进程列表等还是隔离的,两个容器的进程可以通过lo网卡设备通信。

不足: 它并没有改善容器与宿主机以外通信的情况(和Bridge模式一样,不能连接宿主机以外的其他设备)