前面我们已经学习了不少的容器命令和知识,本节我们来了解容器间的通信。
容器下的虚拟 IP
在 Docker 环境下,每一个创建的容器都会被分配一个虚拟 IP,这个 IP 无法从外侧访问,但是容器之间是可以互相通信的。
先创建两个容器:
docker run -d tomcat:jdk8-corretto
docker run -d -it centos /bin/bash
可以通过命令 inspect 查看容器的元数据:
docker inspect 89f25dc257b9 #容器id
...
"IPAddress": "172.17.0.3",
...
docker inspect cdc3bd56cb1a #容器id
————————————————————————————————————
...
"IPAddress": "172.17.0.4",
...
进入容器
docker exec -it cdc3bd56cb1a /bin/bash
ping 172.17.0.3
——————————————————————————————————————
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.052 ms
#可以看到通过IP是可以互通的~
但是如果使用 IP 进行容器间访问它有很大的局限性,因为每创建一个容器都会随机分配 IP 地址,这样就需要频繁修改对应配置文件。
基于 Link 的容器间单向通信
什么是单向通信呢?通常我们项目中会有一个 web 应用去访问一个数据库,而数据库不需要访问 web 应用,这就是单向通信。
如图:
这里我们可以使用容器名称代替 IP 通信。具体操作如下:
#创建一个名为web的tomcat容器
docker run -d --name web tomcat
#查看容器
docker ps
——————————————————————————————————
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ead63d8d83b tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 8080/tcp web
#此时可以看到NAMES里有web这个名称~
"IPAddress": "172.17.0.5"
#再创建一个名为database的centos容器
docker run -d --name database -it centos /bin/bash
#注:-it centos /bin/bash 让centos在后台运行
#查看容器
docker ps
——————————————————————————————————
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1a06e353bc6 centos "/bin/bash" 24 seconds ago Up 24 seconds database
"IPAddress": "172.17.0.6"
#进入tomcat容器
docker exec -it 4ead63d8d83b /bin/bash
#ping ip
ping 172.17.0.6
_____________________________________
PING 172.17.0.6 (172.17.0.6) 56(84) bytes of data.
64 bytes from 172.17.0.6: icmp_seq=1 ttl=64 time=0.084 ms
64 bytes from 172.17.0.6: icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from 172.17.0.6: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.17.0.6: icmp_seq=4 ttl=64 time=0.054 ms
#ping 容器名称
ping databasse
_____________________________________
ping: database: Name or service not known
#此时无法ping通,因为我们没有做任何网络上的配置~
#此时我们移除web的tomcat容器,重新创建
docker rm -f 4ead63d8d83b
docker run -d --name web --link database tomcat
#此时再进入tomcat容器
docker exec -it fe2a4dc355a4 /bin/bash
ping database
_____________________________________
PING database (172.17.0.6) 56(84) bytes of data.
64 bytes from database (172.17.0.6): icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from database (172.17.0.6): icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from database (172.17.0.6): icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from database (172.17.0.6): icmp_seq=4 ttl=64 time=0.062 ms
#此时可以看到可以通过容器名称ping通了,这样我们从tomcat到database的单向通信就完成了~
此处关键命令:
--link 容器名称
这个容器名称怎么用呢?比如我们 JDBC 连接数据库本来是用 IP 的,就可以用容器名称来代替。
这个容器名称是由 docker 来管理的,无论底层的IP地址如何变化,只要容器名称不变,就仍然可以不修改配置而进行通信。
总结
本节我们学习了容器下的虚拟 IP,以及使用 --link+容器名称进行容器间的单向通信,后面我们来学习容器间的双向通信。
评论区