测试

image.png
docker如何处理容器之间的访问的呢?

  1. # 启动容器
  2. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat01 tomcat
  3. # 发现容器的内容部网络地址 发现容器得到一个(虚拟)网卡 162: eth0@if163 ip:172.17.0.2 这是docker分配的
  4. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat01 ip addr
  5. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  6. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  7. inet 127.0.0.1/8 scope host lo
  8. valid_lft forever preferred_lft forever
  9. 162: eth0@if163: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  10. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  11. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  12. valid_lft forever preferred_lft forever
  13. # 在启动Tomcat02 容器 ,两个容器互ping 可以ping通!!!
  14. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat02 ping 172.17.0.2
  15. PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
  16. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.088 ms
  17. 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.051 ms
  18. 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms
  19. # linux主机查看网络 发现多了两个网卡!显然一个是Tomcat01:163: vethb22c8ca@if162:一个是Tomcat02:165: veth302f6df@if164:
  20. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# ip addr
  21. 163: vethb22c8ca@if162: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
  22. link/ether be:a2:10:ae:6f:b8 brd ff:ff:ff:ff:ff:ff link-netnsid 2
  23. 165: veth302f6df@if164: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
  24. link/ether d6:92:e4:3b:75:63 brd ff:ff:ff:ff:ff:ff link-netnsid 3
  25. # 发现容器内的网卡和linux的网卡是互相对接着的。也就是一对一对的。、
  26. # evth-pair 技术!!!就是 一对虚拟的设备接口,他们成对出现的,一段连着协议,一段彼此相连
  27. # evth-pair 相当于一个桥梁,连接着docker容器与linux主机
  28. # 测试Tomcat01 ping Tomcat02 发现是可以ping通的!!
  29. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat02 /bin/bash
  30. root@67e9ac871bb8:/usr/local/tomcat# ping 172.17.0.2
  31. PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
  32. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.061 ms
  33. 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.054 ms
  34. # 原理大致图

image.png
docker使用的是linux的桥接,宿主机中是docker容器的网桥 docker0
image.png

结论:

Tomcat01和Tomcat02公用一个路由,docker0
所有容器不指定网络的情况下,都是docker0路由,docker会给我们分配一个默认的可用ip

  • 问题:写代码的过程中,会直接指定服务ip和端口,如果容器重启,写死的代码导致容器访问失败!!需在更改代码,麻烦!!

我们是否可以通过命名来指定容器进行ip的通信呢??有一个老的—link技术!!

—link技术

场景:应为代码中:databases url=ip;项目重启,数据库ip更换了,解决这一问题是否可以通过名字来访问服务

  1. # 测试 发现网络不可达!!
  2. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat01 ping tomcat02
  3. ping: tomcat02: Name or service not known
  4. # --link命令 发现 Tomcat03 可以 ping 通 Tomcat02!!!
  5. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
  6. 8e8d2deb6e32d8af6f809780588951428acd994f01e430c91f053e557e39208f
  7. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat03 ping tomcat02
  8. PING tomcat02 (172.17.0.3) 56(84) bytes of data.
  9. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.106 ms
  10. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.066 ms
  11. # 但是 Tomcat02 无法 ping 通Tomcat03 !!

探究原理:查看Tomcat03 中的hosts文件;而Tomcat02的hosts文件中没有!
image.png
—link本质:就是在hosts配置文件中添加了名称和ip的绑定
不推荐使用—link。
自定义网络!!docker0存在缺陷
docker0问题:不支持容器名连接访问!

自定义网络

  1. # 指令
  2. docker network --help
  3. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network --help
  4. Usage: docker network COMMAND
  5. Manage networks
  6. Commands:
  7. connect Connect a container to a network
  8. create Create a network
  9. disconnect Disconnect a container from a network
  10. inspect Display detailed information on one or more networks
  11. ls List networks
  12. prune Remove all unused networks
  13. rm Remove one or more networks
  14. Run 'docker network COMMAND --help' for more information on a command.
  15. # 查看所有的docker网络
  16. docker network ls

image.png

网络类型

bridge : 桥接模式docker默认(也可以自己创建)
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. # docker特点:默认,域名不可访问,,--link可以打通连接
  5. # 我们可以做一个网络
  6. # --driver bridge
  7. # --subnet 192.168.0.0/16 # 192.168.0.2~192.168.255.255
  8. # --getway 192.168.0.1
  9. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  10. 0cd4a03ee7af10ce34ac57c9ce3dac2231837fb3ec4365a150f51b78635a88ee
  11. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network ls
  12. NETWORK ID NAME DRIVER SCOPE
  13. 94bcab721d0d bridge bridge local
  14. 4291017aa459 docker_gwbridge bridge local
  15. ddc12cb805d1 host host local
  16. rylzdfs6kqdf ingress overlay swarm
  17. 0cd4a03ee7af mynet bridge local
  18. 30b520ea3cab none null local
  19. # 此时我们自己的网络已经创建完毕;查看一下:

image.png

测试一下

  1. # 启动两个容器
  2. docker run -d -P --name tomcat-net01 --net mynet tomcat
  3. docker run -d -P --name tomcat-net02 --net mynet tomcat
  4. # 查看自己的网络信息: 发现存在两个容器的ip

image.png

  1. # 互ping
  2. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tonmcat-net01 ping 192.168.0.3
  3. PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
  4. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.078 ms
  5. 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.053 ms
  6. # ping 名字
  7. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tonmcat-net01 ping tonmcat-net02
  8. PING tonmcat-net02 (192.168.0.3) 56(84) bytes of data.
  9. 64 bytes from tonmcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.047 ms
  10. 64 bytes from tonmcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.054 ms

上边的问题已经完美解决;

好处:
redis —- 不同的集群使用不同的网络,保证集群是安全健康的
mysql —-不同的集群使用不同的网络,保证集群是安全健康的
但是如何实现容器与不同网络之间的连通,使不同的集群之间相互关联的呢!网络连通!!

网络连通

实现,容器与不同网络之间的连通。

  1. # 测试打通 Tomcat01 与 Tomcat-net01
  2. # 一般情况下:不同网段下的容器之间是不能够进行互通的(因为不在同一网段),这时要实现这一过程。就得使用network connect
  3. # 原理就是直接将docker0 下 的一个容器直接映射到 mynet网络下

测试

  1. # 打开不同网络下的两个容器
  2. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat-net01 --net mynet tomcat
  3. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat01 tomcat
  4. # ping一下
  5. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat-net01 ping 172.17.0.2
  6. PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
  7. 无数据
  8. # 将Tomcat01 通到mynet
  9. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network connect mynet tomcat01
  10. # ping测试
  11. [root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat01 ping tomcat-net01
  12. PING tomcat-net01 (192.168.0.2) 56(84) bytes of data.
  13. 64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.060 ms
  14. 64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.053 ms
  15. # 查看mynet网卡信息 发现存在容器Tomcat01

image.png

实战:部署Redis集群