docker容器间通信
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提供了以下几种方式:
- 在启动docker容器时加入--link参数,但是目前已经被废弃,废弃的主要原因是需要在连接的两个容器上都创建--link选项,当互连的容器数量较多时,操作的复杂度会显著增加;
- 启动docker容器后进入容器并修改/etc/host配置文件,缺点是手动配置较为繁杂;
- 用户自定义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
测试两台机器是否互通。