侧边栏壁纸
博主头像
码森林博主等级

一起走进码森林,享受编程的乐趣,发现科技的魅力,创造智能的未来!

  • 累计撰写 146 篇文章
  • 累计创建 74 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Docker(7):基于 Link 的容器间单向通信

码森林
2022-02-24 / 0 评论 / 0 点赞 / 749 阅读 / 2,650 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-02-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前面我们已经学习了不少的容器命令和知识,本节我们来了解容器间的通信。

容器下的虚拟 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 地址,这样就需要频繁修改对应配置文件。

什么是单向通信呢?通常我们项目中会有一个 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+容器名称进行容器间的单向通信,后面我们来学习容器间的双向通信。

0

评论区