前言:
学习之前需要了解docker相关概念,移步 Docker官网
此处不再赘述虚拟化技术和docker VS 虚拟机 的一些内容,有条件的建议直接移步 度娘
笔记全程操作在华为云务器,CentOS7系统。需要自行准备操作环境。
一. docker网络概述
1.1 docker网络的一些操作
(默认创建三种网络模式)
// 查看docker网络模式命令:
[root@local ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6aef6089eee6 bridge bridge local
1d54965e564c host host local
0c8a22acf265 none null local
查看网络源数据
docker network inspect 网络名字
新建自定义网络
docker network create 网络名
删除网络
docker network rm 网络名字
2. docker网络能干吗
-
容器间的互联和通信以及端口映射
-
容器IP变动时候可以通过服务名直接网络通信而不受到影响
二. docker网络模式
- bridge模式:使用--network bridge指定,默认使用docker0。
- host模式:使用--network host指定。
- none模式:使用--network none指定。
- container模式:使用--network container:Name或者容器id。
2.1 bridge模式
2.1.1 bridge模式介绍
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
查看 bridge 网络的详细信息,并通过 grep 获取名称项
docker network inspect bridge | grep name
-
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
-
docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址。
-
网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
-
整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
-
每个容器实例内部也有一块网卡,每个接口叫eth0;
-
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
-
综上所述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。
2.1.2bridge模式验证
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
然后宿主机通过命令 ip addr 查看:可以看到多了veth164和veth166;而veth164对应eth165;veth166对应eth167。
我们进入tomcat81内部,同样使用 ip addr 查看:
然后进入tomcat82内部,同样使用 ip addr 查看:
2.2 host模式
2.2.1 介绍
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
2.2.2 host模式验证
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
宿主机使用命令 ip addr查看:
然后进入tomcat83容器内使用 ip addr查看
可以看到这些网络配置几乎是一样的,这就证明了host的理论说明。
那host没有设置-p 的端口映射,访问启动的tomcat83时通过 http://宿主机IP:8080/ 来访问
2.3 container模式
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
2.4 自定义网络模式
前面案例以桥接模式启动了tomcat81和tomcat82,分别进入容器内部,查看对应IP。在容器内部互相ping对方的IP,发现是可以ping通的。但是IP地址其实是会变的,一般都是通过服务名调用,此时ping服务名会发现提示服务名不存在。
此时我们做自定义网络的测试
新建自定义网络
docker network create jj_network
然后新建的容器加入上一步新建的自定义网络
docker run -d -p 8081:8080 --network jj_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network jj_network --name tomcat82 billygoo/tomcat8-jdk8
分别进入tomcat81和tomcat82容器,在tomcat81中ping tomcat82;tomcat82中ping tomcat81
可以看到,两个容器互相ping是可以ping通的。
至此,得出结论:自定义网络本身就维护好了主机名和ip的对应关系(ip和容器名都能通)
至此,Docker网络相关内容结束~
整,上手整,记忆才更深刻。然后就是不断发现问题,解决问题,才会得心应手,干就完了~