24 04 2021

前言

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

容器下的虚拟IP

在Docker环境下,每一个创建的容器都会被分配一个虚拟IP,这个IP无法从外侧访问,但是容器之间是可以互相通信的。

先创建两个容器:

  1. docker run -d tomcat:jdk8-corretto
  2. docker run -d -it centos /bin/bash

可以通过命令inspect查看容器的元数据:

  1. docker inspect 89f25dc257b9 #容器id
  2. ...
  3. "IPAddress": "172.17.0.3",
  4. ...
  5. docker inspect cdc3bd56cb1a #容器id
  6. ————————————————————————————————————
  7. ...
  8. "IPAddress": "172.17.0.4",
  9. ...
  10. 进入容器
  11. docker exec -it cdc3bd56cb1a /bin/bash
  12. ping 172.17.0.3
  13. ——————————————————————————————————————
  14. PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
  15. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.070 ms
  16. 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.065 ms
  17. 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.054 ms
  18. 64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.052 ms
  19. #可以看到通过IP是可以互通的~

但是如果使用IP进行容器间访问它有很大的局限性,因为每创建一个容器都会随机分配IP地址,这样就需要频繁修改对应配置文件。

什么是单向通信呢?通常我们项目中会有一个web应用去访问一个数据库,而数据库不需要访问web应用,这就是单向通信。

如图:

这里我们可以使用容器名称代替IP通信。具体操作如下:

  1. #创建一个名为web的tomcat容器
  2. docker run -d --name web tomcat
  3. #查看容器
  4. docker ps
  5. ——————————————————————————————————
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. 4ead63d8d83b tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 8080/tcp web
  8. #此时可以看到NAMES里有web这个名称~
  9. "IPAddress": "172.17.0.5"
  10. #再创建一个名为database的centos容器
  11. docker run -d --name database -it centos /bin/bash
  12. #注:-it centos /bin/bash 让centos在后台运行
  13. #查看容器
  14. docker ps
  15. ——————————————————————————————————
  16. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  17. f1a06e353bc6 centos "/bin/bash" 24 seconds ago Up 24 seconds database
  18. "IPAddress": "172.17.0.6"
  19. #进入tomcat容器
  20. docker exec -it 4ead63d8d83b /bin/bash
  21. #ping ip
  22. ping 172.17.0.6
  23. _____________________________________
  24. PING 172.17.0.6 (172.17.0.6) 56(84) bytes of data.
  25. 64 bytes from 172.17.0.6: icmp_seq=1 ttl=64 time=0.084 ms
  26. 64 bytes from 172.17.0.6: icmp_seq=2 ttl=64 time=0.057 ms
  27. 64 bytes from 172.17.0.6: icmp_seq=3 ttl=64 time=0.054 ms
  28. 64 bytes from 172.17.0.6: icmp_seq=4 ttl=64 time=0.054 ms
  29. #ping 容器名称
  30. ping databasse
  31. _____________________________________
  32. ping: database: Name or service not known
  33. #此时无法ping通,因为我们没有做任何网络上的配置~
  34. #此时我们移除web的tomcat容器,重新创建
  35. docker rm -f 4ead63d8d83b
  36. docker run -d --name web --link database tomcat
  37. #此时再进入tomcat容器
  38. docker exec -it fe2a4dc355a4 /bin/bash
  39. ping database
  40. _____________________________________
  41. PING database (172.17.0.6) 56(84) bytes of data.
  42. 64 bytes from database (172.17.0.6): icmp_seq=1 ttl=64 time=0.091 ms
  43. 64 bytes from database (172.17.0.6): icmp_seq=2 ttl=64 time=0.055 ms
  44. 64 bytes from database (172.17.0.6): icmp_seq=3 ttl=64 time=0.054 ms
  45. 64 bytes from database (172.17.0.6): icmp_seq=4 ttl=64 time=0.062 ms
  46. #此时可以看到可以通过容器名称ping通了,这样我们从tomcat到database的单向通信就完成了~

此处关键命令:

  1. --link 容器名称

这个容器名称怎么用呢?比如我们JDBC连接数据库本来是用IP的,就可以用容器名称来代替。

这个容器名称是由docker来管理的,无论底层的IP地址如何变化,只要容器名称不变,就仍然可以不修改配置而进行通信。

总结

本节我们学习了容器下的虚拟IP,以及使用—link+容器名称进行容器间的单向通信,后面我们来学习容器间的双向通信。

延伸阅读
  1. Windows下IIS搭建Ftp服务器
  2. Nginx开启Gzip压缩提升页面加载速度
  3. Nginx安装及配置(linux)
  4. Docker(10):Docker-Compose简介及安装
  5. Docker(5):docker镜像分层(layer)
发表评论