假设目前的doker的纯净的。
那么在linux内,
ip addr
分析三个地址
第一个是Lo会换地址
第二个是etho 云服务器内网地址
第三个是docker0 装了docker就有的地址。相当于路由器(有转发功能)。
docker启动一个tomcat
docker exec -it -p id ip addr
可以看到有两个ip地址
lo 这个是回环地址
eth0@if123 这个是docker给容器的地址。
然后在linux中
ip addr
会看见除了原来的那三个ip地址外多了一个地址veth开头的,并且是与刚才那个地址相连号的。
为什么容器和docker0可以ping通
简单来说:
每次启动一个容器,出现两个ip,
①eth0:是docker给容器的ip,简称容器ip
②vethc: 是在linux中ip addr 的ip
相当于给了一个ip表给linux,所以ping通
然后又可以转发
因此在外部可以ping通,容器间也可以ping通
ping操作:
外部:
ping ip
容器内:
docker exec -it container_name ip addr
docker exec -it container_name ping container_ip
注意:这里是 服务名 ping IP 是可以ping通的
但是 container_name1 ping container_name2 是不可以的,这是一个问题,下面解决
解决方案1:
虽然不推荐使用,但是还是要康康的
启动的时候通过 --link单向连接 ,所以可以通过两个服务名单向ping通
docker run -d -p 8802:8080 --name mytomcat02 --link mytomcat01 docker.io/tomcat
实质:在/etc/hosts文件中配置了另一个容器的ip
解决方案2:
通过自定义网络解决。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
设置子网掩码,网关 ,名称
docker network ls
docker network inspect id/name
实际上之前使用的run命令默认的网络docker0,即网络的设置,现在可以通过–net使用自己搭建的网络,而且当使用了这个网络后,就与其它tomcat容器ping不通了,因为网络不同了
但是重要的是这个:现在使用自定义的网络创建两个tomcat,尝试ip 来ping 和服务名ping 发现都可以ping通 ,这就是自定义网络的好处。
因此,redis集群开一个网络,mysql开一个网络,这样,不同服务之间是隔离的,保证安全性。但也是可以打通的。下面讲解。
暂且不了解。
docker network inspect 所有详情
docker inspect container_id 查看指定容器详情
如何让两个在不同网络的容器连通。
首先明确一点,不能直接打通两段网络,
正确的操作是一个容器连接另一个网络,这样这个容器就可以连通另一个网络的容器了,相当于这个容器不仅有自己的网络,同时拥有了另一个网络,相当于 ,1个容器两个IP,换句话说就是相当于云服务器,有公网和内网两个网络的原理类似。
实质上是把容器加入了网络中
docker network connet NetWork Container
操作成为跨网操作
结果:随便ping都能通