docker:了解docker网络和自定义docker网卡

x33g5p2x  于2021-11-22 转载在 Docker  
字(6.3k)|赞(0)|评价(0)|浏览(477)

docker网络

认识docker网络

测试 ip addr 查看

我们可以测试一下,容器和容器之间 能不能ping通

  1. # 跑一个tomcat
  2. docker run -d -P --name tomcat01 tomcat
  3. # 获取ip
  4. ip addr
  5. # 我们可以用查看元数据的方式查看 容器的ip地址

  1. # 之后用宿主机 linux 去ping容器
  2. ping 172.18.0.2
  3. # 能通

原理

  1. 我们每启动一个 docker容器, docker就会给 我们的每一个容器分配一个ip
  2. 我们只要安装 docker 就会有一个网卡 docker0 桥接模式,使用的技术是 evth-pair技术

我们新启动的容器就会多一个新的网卡

我们发现,这些容器的网卡都是一对一对的

  1. # 我们发现这个容器带来网卡,都是一对对的
  2. # veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
  3. # 正因为有这个特性,veth-pair充当一个桥梁, 连接各种虚拟网络设备
  4. # OpenStac, Docker容器之间的链接,OVS的链接, 都是使用veth-pair技术

我们新建一个 tomcat 尝试容器之间是否能够ping通

结论:容器与容器之间是可以相互ping通的!

绘制一个网络模型图

结论:tomcat01和tomcat02是共用的一个路由器,docker0

所有容器不指定网络的情况下,都是docker0路由的,doucker会给我们的容器分配一个默认的可用IP

小结

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.

Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)

只要容器删除,对应的网桥一对就没有了!

思考一个场景,我们编写了一个微服务,database url =ip; 项目不重启,数据ip换掉了,我们希望可以处理这个问题,可以按名字来进行访问容器

  1. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat01
  2. ping: tomcat01: Name or service not known
  3. # 如何可以解决呢?
  4. # 通过--link既可以解决网络连通问题
  5. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
  6. 3a2bcaba804c5980d94d168457c436fbd139820be2ee77246888f1744e6bb473
  7. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
  8. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  9. 3a2bcaba804c tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:32772->8080/tcp tomcat03
  10. f22ed47ed1be tomcat "catalina.sh run" 57 minutes ago Up 57 minutes 0.0.0.0:32771->8080/tcp tomcat02
  11. 9d97f93401a0 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:32770->8080/tcp tomcat01
  12. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 ping tomcat02
  13. PING tomcat02 (172.17.0.3) 56(84) bytes of data.
  14. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.129 ms
  15. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
  16. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
  17. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms
  18. # 反向可以ping通吗?
  19. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat03
  20. ping: tomcat03: Name or service not known

探究:inspect!

其实这个tomcat03就是在本地配置了tomcat02的配置?

  1. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat03 cat /etc/hosts
  2. 127.0.0.1 localhost
  3. ::1 localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. 172.17.0.3 tomcat02 f22ed47ed1be
  9. 172.17.0.4 3a2bcaba804c

本质探究:–link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 f22ed47ed1be

我们现在玩Docker已经不建议使用–link了!

自定义网络!不使用Docker0!

Docker0的问题:它不支持容器名链接访问!

自定义网络

查看所有的docker网络

网络模式

bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式

none: 不配置网络

host: 和宿主机共享网络

container:容器网络连通!(用的少, 局限很大)

测试

  1. # 我们直接启动的命令默认有一个 --net bridge,而这个就是我们的docker0
  2. docker run -d -P --name tomcat01 tomcat
  3. docker run -d -P --name tomcat01 --net bridge tomcat
  4. # docker0特点,默认,容器名不能访问, --link可以打通连接!
  5. # 我们可以自定义一个网络!
  6. # --driver bridge
  7. # --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254
  8. # --gateway 192.168.0.1
  9. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  10. 26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec
  11. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network ls
  12. NETWORK ID NAME DRIVER SCOPE
  13. 30d601788862 bridge bridge local
  14. 226019b14d91 host host local
  15. 26a5afdf4805 mynet bridge local
  16. 7496c014f74b none null local

我们自己创建的网络就ok了!

在自己创建的网络里面启动两个容器

  1. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
  2. 0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c
  3. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
  4. c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5
  5. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker network inspect mynet
  6. [
  7. {
  8. "Name": "mynet",
  9. "Id": "26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec",
  10. "Created": "2020-08-14T11:12:40.553433163+08:00",
  11. "Scope": "local",
  12. "Driver": "bridge",
  13. "EnableIPv6": false,
  14. "IPAM": {
  15. "Driver": "default",
  16. "Options": {},
  17. "Config": [
  18. {
  19. "Subnet": "192.168.0.0/16",
  20. "Gateway": "192.168.0.1"
  21. }
  22. ]
  23. },
  24. "Internal": false,
  25. "Attachable": false,
  26. "Ingress": false,
  27. "ConfigFrom": {
  28. "Network": ""
  29. },
  30. "ConfigOnly": false,
  31. "Containers": {
  32. "0e85ebe6279fd23379d39b27b5f47c1e18f23ba7838637802973bf6449e22f5c": {
  33. "Name": "tomcat-net-01",
  34. "EndpointID": "576ce5c0f5860a5aab5e487a805da9d72f41a409c460f983c0bd341dd75d83ac",
  35. "MacAddress": "02:42:c0:a8:00:02",
  36. "IPv4Address": "192.168.0.2/16",
  37. "IPv6Address": ""
  38. },
  39. "c6e462809ccdcebb51a4078b1ac8fdec33f1112e9e416406b606d0c9fb6f21b5": {
  40. "Name": "tomcat-net-02",
  41. "EndpointID": "81ecbc4fe26e49855fe374f2d7c00d517b11107cc91a174d383ff6be37d25a30",
  42. "MacAddress": "02:42:c0:a8:00:03",
  43. "IPv4Address": "192.168.0.3/16",
  44. "IPv6Address": ""
  45. }
  46. },
  47. "Options": {},
  48. "Labels": {}
  49. }
  50. ]
  51. # 再次拼连接
  52. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
  53. PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
  54. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.113 ms
  55. 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.093 ms
  56. ^C
  57. --- 192.168.0.3 ping statistics ---
  58. 2 packets transmitted, 2 received, 0% packet loss, time 999ms
  59. rtt min/avg/max/mdev = 0.093/0.103/0.113/0.010 ms
  60. # 现在不使用 --link也可以ping名字了!
  61. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
  62. PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
  63. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.068 ms
  64. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.096 ms
  65. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.094 ms
  66. 我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
  67. 好处:
  68. redis - 不同的集群使用不同的网络,保证集群时安全和健康的
  69. mysql - 不同的集群使用不同的网络,保证集群时安全和健康的

网络连通

测试打通tomcat01 和mynet

  1. # 连通ok
  2. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat01 ping tomcat-net-01
  3. PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
  4. 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.100 ms
  5. 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms
  6. ^C
  7. --- tomcat-net-01 ping statistics ---
  8. 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
  9. rtt min/avg/max/mdev = 0.085/0.092/0.100/0.012 ms
  10. # 依旧无法连通,没有connect
  11. [root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it tomcat02 ping tomcat-net-01
  12. ping: tomcat-net-01: Name or service not known

结论:假设要跨网络 操作别人,就要使用docker network connect连通…!

相关文章

最新文章

更多