容器之间的通信
前面介绍了单个容器的配置和一些简单的操作,但是实际运用中肯定不止一个容器。
当安装lnmp环境的时候,根据一个服务一个容器的规则,我们就需要3个容器,分别是nginx容器,php-fpm容器和mysql容器。
而且这三个容器之间要相互通信,nginx要能够访问php-fpm,php-fpm需要能访问mysql。
那今天我们就来看看,容器之间如何访问?
用容器的ip互相通信
我们先启动两个容器,分别为:nginx-1和nginx-2,如下:
当docker容器启动的时候,docker会默认给当前容器被分配一个随机的ip。
分别进入两个容器,通过查看容器的本地host文件,可以查看两个容器自身的ip!
nginx-1容器获得的ip是172.18.0.2
nginx-2容器获得的ip是172.18.0.3
在容器nginx-2中,访问容器nginx-1,我们执行curl看一下
可以看到,成功的输出了结果,说明通过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
效果:
(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
效果如下:
(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
效果如下:
(4)两个容器都加入到同一个桥接网络,那容器之间就可以互相通信了,我们怎么访问呢?
来到nginx-2容器中,不再是访问对方的ip了而是访问容器nginx-1在网络中的别名或者容器名。
curl net-nginx-1
或者也可以直接连接这个容器的名字:
curl nginx-1
效果如下:
通过自定义网络,我们在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
好啦,这就是今天的全部内容,如果您有疑问,可以在下方留言哦~