- docker三要素:仓库,镜像,容器
- 备忘链接:
1.初始的linux网络
$ ip addr
2.docker容器网络分析
1.先创建一个tomcat容器tomcat01
$ docker run -it --name tomcat01 tomcat
$ docker exec -it tomcat01 ip addr #观察容器内网络地址
- 蓝色框的后面会用到,和后面会呼应起来。
- 我们再用inspect看一下
$ docker inspect tomcat01
2.这时,我们再次观察主机内的ip addr状态
- 这里我们可以发现容器内部网卡状态和主机外面新增的网卡,有了一个呼应。
3.尝试ping下容器内部的ip
$ ping 172.17.0.2
- 那么这是用了一个什么技术呢?
- 用的时evth-pair技术,是一对虚拟设备接口,相当于一个桥梁。
4.然后我们再启动一个容器tomcat02
$ docker run -d -P --name tomcat02 tomcat
$ docker exec -it tomcat02 ip addr
- 同第一个tomcat01对比,注意蓝框
5. 我们再次观察主机内的ip addr状态
- 新增的网卡与tomcat02中的网卡地址也是呼应的,同tomcat01一样。
- 同理,再主机内ping tomcat02一样可以通。
6.那么tomcat01与02相互可以ping通吗?
$ docker exec -it tomcat01 ping 172.17.0.3
$ docker exec -it tomcat02 ping 172.17.0.2
- 证明容器实例之间都是可以ping通的。
7.图示总结
- 我们可以发现宿主机内的docker0网卡地址为172.17.0.1,与tomcat01(172.17.0.2)、tomcat02(172.17.0.3),属于同一网段,故肯定可以相互ping通。
- 总体的图示:
- docker01只要一安装Docker就会存在。
- docker01可以理解为一个路由器,各个容器实例我们可以理解为链接着路由器的手机。
- 容器之间ping通是通过docker01进行的。
- docker0如何与外部网络进行联通:docker0通过NAT直连物理网卡,与外网进行通信(图上忘记画出来了)。
- Docker中所有的网络接口都是虚拟的。
3.docker0可以分配多少个ip给容器?
- 这里涉及一些计算机网络的知识。
- 例如 255.255.0.0/16啥意思?表示IP地址/掩码16位。
- 255.255.0.0/24,同样的道理,只不过子网掩码为24位,只有8位可以用来表示子网ip。
4.可不可以通过容器的名字ping通容器呢?
1.想法验证
- 为什么会有这种想法:比如我们机器重启之后,可能每一个容器的ip都会发生变化,这样的话,如果仍旧使用原来ip,容器之间就没法相互联通了。如果我们一个一个修改ip的话,就会很麻烦。所以我们看看只ping容器的名字,能不能联通,如果能,就解决了上述的问题。
$ docker run -d -P --name tomcat01 tomcat
$ docker run -d -P --name tomcat02 tomcat
$ docker exec -it tomcat02 ping tomcat01
-发现是不能ping通的。同理,tomcat01去ping tomcat02的话,依旧不通。
2.使用–link,可以完美实现吗?
- 我们创建一个容器tomcat03,并且link到tomcat01,看看行不行?
$ docker run -d -P --name tomcat03 --link tomcat01 tomcat
$ docker exec -it tomcat03 ping tomcat01
- tomcat03 ping tomcat01 是可以ping通的。那反向可以吗?
$ docker exec -it tomcat01 ping tomcat03
- 你会发现无法ping通,这就是–link的坑。
- 当然我们可以通过重启tomcat01来去–link到tomcat03,实现tomcat01可以ping到tomcat03,但是着实的有点麻烦。
3.为何不能反向ping通?
- 我们去查看容器的文件/etc/hosts,来理解。
- linux 的/etc/hosts是配置ip地址和其对应主机名的文件,这里可以记录本机的或其他主机的ip及其对应主机名。
- 所以不推荐使用- -link。
5.自定义网络
1.基础知识
1.1Docker中有哪些网络模式
$ docker network ls #Docker中有哪些网络模式
- bridge:桥接模式,docker默认的是桥接模式
- none:不配置网络
- host:与主机共用网络
- container:容器网络联通,用的少,局限性多
1.2启动容器的时候的默认网络参数
#下面这两种方式都是相同的,--net bridge所建立的桥,就是docker0
$ docker run -d -P --name tomcat01 tomcat
$ docker run -d -P --name tomcat01 --net bridge tomcat
- 既然网络模式的参数可以指定,那么我们可以自定义网络,使容器连接于自定义网络。
2.创建自定义网络
2.1查看docker的网络创建命令
$ docker network --help
$ docker network create --help
- 创建网络的时候,我们只需要,设置上边两个即可。(视频听来的,计网没学好)
2.2创建自定义网络
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
$ docker network ls
- 我们创建的网络已经出来了
- 查看mynet网络
$ docker network inspect mynet
2.3将容器发布到mynet
$ docker run -d -P --name tomcat-net-01 --net mynet tomcat
$ docker run -d -P --name tomcat-net-02 --net mynet tomcat
- 发布完成
- 我们再查看一下,我们自定义的网络mynet
$ docker network inspect mynet
- 我们发现在mynet下,多了两个我们启动的容器。
2.4验证结果
$ docker exec -it tomcat-net-02 ping tomcat-net-01
$ docker exec -it tomcat-net-01 ping tomcat-net-02
- 这个时候,容器链接使用容器名,也是可以相互ping通的。
- 但是原因是什么,我还不清楚。
6.网络联通
1.网段不同的容器间,该如何联通呢?
- 假如,有一个redis集群和一个mysql集群
- redis集群包括很多redis容器,且处于192.160.0.0网段;mysql集群包括很多mysql容器,且处于192.161.0.0网段
- 集群内部的容器们,肯定是可以相互ping通的,那么两个集群之间如何联通呢?也就是说redis0n如何ping到mysql0n?
2.实现不同网段的网络联通
2.1模拟环境
- 在docker01(默认的)下创建两个tomcat容器
$ docker run -d -P --name tomcat-docker01 tomcat
$ docker run -d -P --name tomcat-docker02 tomcat
- 之前的mynet下,还有tomcat-net-01和tomcat-net-02,此时网络模型为:
- 我们是这样实现将两个网关(卡)之间链接吗?如图。
- 这样显然是不对的,这样的话,两个网络就变了。
- 应该是这样的,将一个网关下的容器链接到另一个网关,从而使该容器可以ping通另一个网关下的全部容器。
2.2查询命令connect
$ docker network --help
$ docker network connect --help
2.3将tomcat-docker02连接到mynet
$ docker network connect mynet tomcat-docker02 #这里是无任何返回的
- 然后在查看一下mynet网络情况
$ docker network inspect mynet
- 可以看到该网络,已经出现了tomcat-docker02。
- 然后我们再去看一下tomcat-docker02的ip addr。
$ docker exec -it tomcat-docker02 ip addr
- 可以看到,又多出来了一个虚拟接口,而且和mynet中新增的那个对应。
- 其实,也就是一个容器两个ip。
2.4尝试ping通
- 尝试从tomcat-docker02 ping
$ docker exec -it tomcat-docker02 ping tomcat-net-01
$ docker exec -it tomcat-docker02 ping tomcat-net-02
-
已经实现了跨网络ping通。
-
再尝试从tomcat-docker01 ping
$ docker exec -it tomcat-docker01 ping tomcat-net-01
- 因为tomcat-docker01没有联通到mynet,故其不能ping通。
- 尝试从tomcat-net-01和tomcat-net-02 ping tomcat-docker02,看看行不行?
$ docker exec -it tomcat-net-01 ping tomcat-docker02
$ docker exec -it tomcat-net-02 ping tomcat-docker02
- 可以看到都是ok的。
2.5网络模型
- 此时的网络模型为(虚拟网络接口未画出):