![7c0b79a29a9dae34a769f1393d1dee3c.png](https://i-blog.csdnimg.cn/blog_migrate/d99c1b426db8379797fdfa34d2959f80.jpeg)
容器之间的通信
前面介绍了单个容器的配置和一些简单的操作,但是实际运用中肯定不止一个容器。
当安装lnmp环境的时候,根据一个服务一个容器的规则,我们就需要3个容器,分别是nginx容器,php-fpm容器和mysql容器。
而且这三个容器之间要相互通信,nginx要能够访问php-fpm,php-fpm需要能访问mysql。
那今天我们就来看看,容器之间如何访问?
用容器的ip互相通信
我们先启动两个容器,分别为:nginx-1和nginx-2,如下:
![8f585f040b5ccef40cca01c94f503ebf.png](https://i-blog.csdnimg.cn/blog_migrate/e93ee03a6bb6d6b221e6b9103d82c59b.jpeg)
![fe12e9223c67eb6afb890fa7b947ed1c.png](https://i-blog.csdnimg.cn/blog_migrate/75757c84494c4cf39b56f8e6e113a492.jpeg)
当docker容器启动的时候,docker会默认给当前容器被分配一个随机的ip。
分别进入两个容器,通过查看容器的本地host文件,可以查看两个容器自身的ip!
nginx-1容器获得的ip是172.18.0.2
![700f2ecae280467dfaba223bc125350c.png](https://i-blog.csdnimg.cn/blog_migrate/7dc01b73693b0277d527a88050edb2f1.png)
nginx-2容器获得的ip是172.18.0.3
![541d5839da6f9155106fb7f497364f8a.png](https://i-blog.csdnimg.cn/blog_migrate/1c07b3e11f0cddc920c614b8a3b00763.png)
在容器nginx-2中,访问容器nginx-1,我们执行curl看一下
![02ede9ed43286497d5cc9e6e68323cf2.png](https://i-blog.csdnimg.cn/blog_migrate/1e2624791851b1484fed7448587946e4.jpeg)
可以看到,成功的输出了结果,说明通过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
效果:
![15ba0b74be1fe6db7ff6da37defe2594.png](https://i-blog.csdnimg.cn/blog_migrate/71ae42fae36a6331a24b3c859210ca78.jpeg)
(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 代表你要加入的网络叫什么,这里我们填写的是上面刚创建的my-test-net。
-net--network-alias 可传可不传,代表你加入桥接网络之后你的名称叫什么,这里取名叫做net-nginx-1,别人连接你的时候也是通过这个标识来识别,也可以不设置别名,连接的时候用容器名去连接。
效果如下:
![ecbe0c114d38064e68761264c5ed8f31.png](https://i-blog.csdnimg.cn/blog_migrate/b587f5e5a2a34968198020aeb8bd9bdd.jpeg)
(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
效果如下:
![9ba11dfbcdff35e00bf44a43ab6e2248.png](https://i-blog.csdnimg.cn/blog_migrate/0c834d8dd66d0c1c0144145f4dd0a120.jpeg)
(4)两个容器都加入到同一个桥接网络,那容器之间就可以互相通信了,我们怎么访问呢?
来到nginx-2容器中,不再是访问对方的ip了而是访问容器nginx-1在网络中的别名或者容器名。
curl net-nginx-1
或者也可以直接连接这个容器的名字:
curl nginx-1
效果如下:
![2ad5626f35686ad3a9a3deacf742903a.png](https://i-blog.csdnimg.cn/blog_migrate/db18acfd7b8966d3c031c2bcee7fa979.jpeg)
通过自定义网络,我们在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
好啦,这就是今天的全部内容,如果您有疑问,可以在下方留言哦~
公众号:老何漫话
id:laohemanhua