docker容器间通信

218

docker无法直接使用

查看docker中存在的网络

在主机上通过命令 docker network ls

查看bridge网络的详细配置

通过命令 docker network inspect bridge

原因

默认的网桥bridge上的容器只能通过IP互连,无法通过DNS解析名称或别名。假如我们在container1中部署了Web服务,在container2中部署了mysql,container1中的Web服务往往需要连接container2的mysql,这是只能靠IP进行连接,但是docker也无法保证容器重启后的IP地址不变,所以更好的方式是通过别名进行互联,在网络中加入DNS服务器,将容器名与IP地址进行匹配,省去了手动修改Web服务中连接mysql的IP的过程。

解决办法

为了实现不同容器通过容器名或别名的互连,docker提供了以下几种方式:

  1. 在启动docker容器时加入--link参数,但是目前已经被废弃,废弃的主要原因是需要在连接的两个容器上都创建--link选项,当互连的容器数量较多时,操作的复杂度会显著增加;
  2. 启动docker容器后进入容器并修改/etc/host配置文件,缺点是手动配置较为繁杂;
  3. 用户自定义bridge网桥,这是目前解决此类问题的主要方法。

创建用户自定义bridge

创建bridge

docker network create my-docker-net

添加容器到bridge中

将Web服务容器和mysql服务容器加入到"my-net"中,并观察变化。

docker network connect my-docker-net nextcloud         # 将nextcloud服务加入my-docker-net网络中
docker network connect my-docker-net mysql         # 将mysql服务加入my-docker-net网络中
docker network connect my-docker-net halo         # 添加halo服务之前,请注意需要立马将halo服务加入my-docker-net网络中,否则halo容器可能会因为无法和MySQL通信而闪退。

进入容器shell中

通过 docker ps 查出id,然后通过 docker exec -it 69d1 bash 进入容器。

在容器中试试ping一下吧

ping 之前可能需要先获取iputils-ping的包

apt-get update
apt-get install iputils-ping

现在通过 ping nextcloud -c 3 测试两台机器是否互通。