测试

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

docker使用的是linux的桥接,宿主机中是docker容器的网桥 docker0
结论:
Tomcat01和Tomcat02公用一个路由,docker0
所有容器不指定网络的情况下,都是docker0路由,docker会给我们分配一个默认的可用ip
- 问题:写代码的过程中,会直接指定服务ip和端口,如果容器重启,写死的代码导致容器访问失败!!需在更改代码,麻烦!!
我们是否可以通过命名来指定容器进行ip的通信呢??有一个老的—link技术!!
—link技术
场景:应为代码中:databases url=ip;项目重启,数据库ip更换了,解决这一问题是否可以通过名字来访问服务
# 测试 发现网络不可达!![root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat01 ping tomcat02ping: tomcat02: Name or service not known# --link命令 发现 Tomcat03 可以 ping 通 Tomcat02!!![root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat03 --link tomcat02 tomcat8e8d2deb6e32d8af6f809780588951428acd994f01e430c91f053e557e39208f[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat03 ping tomcat02PING tomcat02 (172.17.0.3) 56(84) bytes of data.64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.106 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.066 ms# 但是 Tomcat02 无法 ping 通Tomcat03 !!
探究原理:查看Tomcat03 中的hosts文件;而Tomcat02的hosts文件中没有!
—link本质:就是在hosts配置文件中添加了名称和ip的绑定
不推荐使用—link。
自定义网络!!docker0存在缺陷
docker0问题:不支持容器名连接访问!
自定义网络
# 指令docker network --help[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network --helpUsage: docker network COMMANDManage networksCommands:connect Connect a container to a networkcreate Create a networkdisconnect Disconnect a container from a networkinspect Display detailed information on one or more networksls List networksprune Remove all unused networksrm Remove one or more networksRun 'docker network COMMAND --help' for more information on a command.# 查看所有的docker网络docker network ls

网络类型
bridge : 桥接模式docker默认(也可以自己创建)
none : 不配置网络
host : 和宿主机共享网络
container : 容器网络连通!(局限性大!!)
创建自己的网络
# 我们直接启动的命令 --net bridge,而这个就是我们的docker0;docker run -d -P --name tomcat01 tomcat== docker run -d -P --name tomcat01 --net bridge tomcat# docker特点:默认,域名不可访问,,--link可以打通连接# 我们可以做一个网络# --driver bridge# --subnet 192.168.0.0/16 # 192.168.0.2~192.168.255.255# --getway 192.168.0.1[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet0cd4a03ee7af10ce34ac57c9ce3dac2231837fb3ec4365a150f51b78635a88ee[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network lsNETWORK ID NAME DRIVER SCOPE94bcab721d0d bridge bridge local4291017aa459 docker_gwbridge bridge localddc12cb805d1 host host localrylzdfs6kqdf ingress overlay swarm0cd4a03ee7af mynet bridge local30b520ea3cab none null local# 此时我们自己的网络已经创建完毕;查看一下:

测试一下
# 启动两个容器docker run -d -P --name tomcat-net01 --net mynet tomcatdocker run -d -P --name tomcat-net02 --net mynet tomcat# 查看自己的网络信息: 发现存在两个容器的ip

# 互ping[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tonmcat-net01 ping 192.168.0.3PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.078 ms64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.053 ms# ping 名字[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tonmcat-net01 ping tonmcat-net02PING tonmcat-net02 (192.168.0.3) 56(84) bytes of data.64 bytes from tonmcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.047 ms64 bytes from tonmcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.054 ms
上边的问题已经完美解决;
好处:
redis —- 不同的集群使用不同的网络,保证集群是安全健康的
mysql —-不同的集群使用不同的网络,保证集群是安全健康的
但是如何实现容器与不同网络之间的连通,使不同的集群之间相互关联的呢!网络连通!!
网络连通
实现,容器与不同网络之间的连通。
# 测试打通 Tomcat01 与 Tomcat-net01# 一般情况下:不同网段下的容器之间是不能够进行互通的(因为不在同一网段),这时要实现这一过程。就得使用network connect# 原理就是直接将docker0 下 的一个容器直接映射到 mynet网络下
测试
# 打开不同网络下的两个容器[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat-net01 --net mynet tomcat[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker run -d -P --name tomcat01 tomcat# ping一下[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat-net01 ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.无数据# 将Tomcat01 通到mynet[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker network connect mynet tomcat01# ping测试[root@izbp1g2kp3kgefvmrhy0moz CTFd]# docker exec -it tomcat01 ping tomcat-net01PING tomcat-net01 (192.168.0.2) 56(84) bytes of data.64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.060 ms64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.053 ms# 查看mynet网卡信息 发现存在容器Tomcat01

