docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信


容器之间的通信

前面介绍了单个容器的配置和一些简单的操作,但是实际运用中肯定不止一个容器。

当安装lnmp环境的时候,根据一个服务一个容器的规则,我们就需要3个容器,分别是nginx容器,php-fpm容器和mysql容器。

而且这三个容器之间要相互通信,nginx要能够访问php-fpm,php-fpm需要能访问mysql。

那今天我们就来看看,容器之间如何访问?


用容器的ip互相通信

我们先启动两个容器,分别为:nginx-1和nginx-2,如下:


docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信_02


docker 两容器互相通信 docker容器之间如何通信_nginx_03


当docker容器启动的时候,docker会默认给当前容器被分配一个随机的ip。

分别进入两个容器,通过查看容器的本地host文件,可以查看两个容器自身的ip!

nginx-1容器获得的ip是172.18.0.2


docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信_04


nginx-2容器获得的ip是172.18.0.3


docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信_05


在容器nginx-2中,访问容器nginx-1,我们执行curl看一下


docker 两容器互相通信 docker容器之间如何通信_docker 容器之间通信_06


可以看到,成功的输出了结果,说明通过ip,容器nginx-1是可以和容器nginx-2之间访问的。

但ip访问的方式存在一个问题,就是docker服务一旦重启之后容器的ip就会变更。

ip一旦变更,容器之间就会访问不了,因此,我们来看看docker推荐的容器间互相通信的方式。


用link进行互相通信

通过link的方式(官方已经不推荐,故不作说明)

通过自定义网络使容器互相通信

Docker从1.12版本以后提供了docker network的方式,来建立两个容器的连接。

其原理很简单,用户自定义创建一个网络,然后把容器加入到这个网络中,则该网络中的容器可以互相通信。

操作概述:用docker network命令创建一个自定义的桥接网络,然后在docker run命令执行的时候加上几个参数即可将容器加入这个网络中。

具体操作步骤如下

(1)通过docker network命令创建一个名叫my-test-net的网络。


docker network create my-test-net


效果:


docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信_07


(2)启动我们的容器nginx-1,并将容器nginx-1加入到网络my-test-net,注意命令参数


docker run -d -p 8080:80 --name nginx-1 --network my-test-net --network-alias net-nginx-1 nginx


我们会看到,这一次docker run命令后面多了两个选项参数分别是--network和--network-alias。

--network

-net--network-alias

效果如下:


docker 两容器互相通信 docker容器之间如何通信_nginx_08


(3)启动我们的容器nginx-2,并将容器nginx-2加入到网络my-test-net,同样注意命令参数


docker run -d -p 8181:80 --name nginx-2 --network my-test-net --network-alias net-nginx-2 nginx


效果如下:


docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信_09


(4)两个容器都加入到同一个桥接网络,那容器之间就可以互相通信了,我们怎么访问呢?

来到nginx-2容器中,不再是访问对方的ip了而是访问容器nginx-1在网络中的别名或者容器名。


curl net-nginx-1


或者也可以直接连接这个容器的名字:


curl nginx-1


效果如下:


docker 两容器互相通信 docker容器之间如何通信_docker 两容器互相通信_10


通过自定义网络,我们在docker重启之后,只需要将容器加入到网络中,就可以互相通信,也就不用担心ip变更的问题了。

最后,附上整理的docker network命令的列表:


create创建一个网络
用法:docker network create [OPTIONS] NETWORK

ls显示网络列表
用法:docker network ls


inspect显示现有网络的详细信息
用法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]


rm移除指定的网络
用法:docker network rm NETWORK [NETWORK...]


prune移除所有无用的网络
用法:docker network prune


connect将容器连接到一个网络
用法:docker network connect [OPTIONS] NETWORK CONTAINER


disconnect将容器断开一个网络
用法:docker network disconnect [OPTIONS] NETWORK CONTAINER


好啦,这就是今天的全部内容,如果您有疑问,可以在下方留言哦~