一.知识回顾
之前的内容都帮你整理好了,在这里哟!
【0.Docker相关目录文章整理,可自行查看,包含多节内容】
【1.Docker详细安装部署&阿里镜像地址配置】
【2.Docker架构&&架构角色概念&&角色作用】
【3.Docker命令详细讲解&实操演示】
【4.Docker镜像文件&加载原理&生产中重新制作并提交镜像文件&案例演示】
【5.Docker数据卷&数据卷容器&DockerFile执行流程】
【6.DockerFile构建自定义镜像实操&出现问题解决方案Failed to download metadata for repo ‘appstream‘: IPv4 forwarding disabled…】
二.计算机网络模型
2.1 OSI和TCP/IP协议以及网络分层的思想
OSI:开放系统互联参考模型(Open System Interconnect)
TCP/IP:传输控制协议/网际协议(Transmission Control/Internet Protocol),是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
分层思想:分层的基本想法是每一层都在它的下层提供的服务基础上提供更高级的增值服务,而最高层提供能运行分布式应用程序的服务。
2.2 客户端发送请求图解过程
2.3 服务端接受请求图解过程
三.Docker网络介绍
3.1 Docker中网络的相关概念
Docker是基于Linux Kernel的namespace,CGroups,UnionFileSystem等技术封装成的一种自定义容器格式,从而提供了一套虚拟运行环境。
namespace: 用来做隔离的,比如 pid[进程]、net【网络】、mnt【挂载点】
CGroups:Controller Groups 用来做资源限制,比如内存和CPU等
Union File Systems:用来做Image和Container分层
3.2 Linux网卡学习
3.2.1 查看网卡信息
3.2.1.1查看网卡的命令:ip a
[root@VM-4-9-centos ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:f7:e1:5b brd ff:ff:ff:ff:ff:ff
inet X.X.X.X/22 brd 10.0.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fef7:e15b/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:0f:64:6e:aa brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:fff:fe64:6eaa/64 scope link
valid_lft forever preferred_lft forever
430: br-f70a5f546c0b: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:da:41:25:fa brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-f70a5f546c0b
valid_lft forever preferred_lft forever
inet6 fe80::42:daff:fe41:25fa/64 scope link
valid_lft forever preferred_lft forever
通过ip a 可以看到当前的centos中有的4个网卡信息作用分别是
名称 | 作用 |
---|---|
lo | 本地网卡【lo 是 loopback 的缩写,也就是环回的意思,linux系统默认会有一块名为 lo 的环回网络接口】 |
eth0 | 连接网络的网卡 |
eth1 | 和宿主机通信的网卡 |
docker0 | docker的网卡 |
3.2.1.2 ip link show:
[root@VM-4-9-centos ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:f7:e1:5b brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:0f:64:6e:aa brd ff:ff:ff:ff:ff:ff
430: br-f70a5f546c0b: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:da:41:25:fa brd ff:ff:ff:ff:ff:ff
3.2.1.3 以文件的形式查看网卡:ls /sys/class/net
[root@VM-4-9-centos ~]# cd /sys/class/net/
[root@VM-4-9-centos net]# ls
br-f70a5f546c0b docker0 eth0 lo
[root@VM-4-9-centos net]#
3.2.2 配置文件
在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可,存放的路径
[root@VM-4-9-centos net]# cd /etc/sysconfig/network-scripts/
[root@VM-4-9-centos network-scripts]# ls
ifcfg-eth0 ifdown-bnep ifdown-ipv6 ifdown-ppp ifdown-Team ifup ifup-eth ifup-isdn ifup-post ifup-sit ifup-tunnel network-functions
ifcfg-lo ifdown-eth ifdown-isdn ifdown-routes ifdown-TeamPort ifup-aliases ifup-ippp ifup-plip ifup-ppp ifup-Team ifup-wireless network-functions-ipv6
ifdown ifdown-ippp ifdown-post ifdown-sit ifdown-tunnel ifup-bnep ifup-ipv6 ifup-plusb ifup-routes ifup-TeamPort init.ipv6-global route6-eth0
[root@VM-4-9-centos network-scripts]#
3.2.3 网卡操作
3.2.3.1 网卡中增加ip地址
[root@VM-4-9-centos network-scripts]# ip addr add 192.168.0.10/24 dev eth0
[root@VM-4-9-centos network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:f7:e1:5b brd ff:ff:ff:ff:ff:ff
inet 10.0.X.X/22 brd 10.0.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.0.10/24 scope global eth0 #################### 网卡中新增加的ip地址
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fef7:e15b/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:0f:64:6e:aa brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:fff:fe64:6eaa/64 scope link
valid_lft forever preferred_lft forever
430: br-f70a5f546c0b: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:da:41:25:fa brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-f70a5f546c0b
valid_lft forever preferred_lft forever
inet6 fe80::42:daff:fe41:25fa/64 scope link
valid_lft forever preferred_lft forever
[root@VM-4-9-centos network-scripts]#
3.2.3.2 删除IP地址: ip addr delete 192.168.100.120/24 dev eth0
[root@VM-4-9-centos network-scripts]# ip addr delete 192.168.0.10/24 dev eth0
[root@VM-4-9-centos network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:f7:e1:5b brd ff:ff:ff:ff:ff:ff
inet 10.0.X.X/22 brd 10.0.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fef7:e15b/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:0f:64:6e:aa brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:fff:fe64:6eaa/64 scope link
valid_lft forever preferred_lft forever
430: br-f70a5f546c0b: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:da:41:25:fa brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-f70a5f546c0b
valid_lft forever preferred_lft forever
inet6 fe80::42:daff:fe41:25fa/64 scope link
valid_lft forever preferred_lft forever
[root@VM-4-9-centos network-scripts]#
3.2.4 网卡信息解析
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
3.3 Network Namespace
Network Namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。
3.3.1 Network Namespce 实战
3.3.1.1 添加一个namespace
ip netns add ns1
3.3.1.2 查看当前具有的namespace
ip netns list
3.3.1.3 删除当前具有的namespace
ip netns delete ns1
3.3.1.4 查看当前命令空间的网卡情况
ip netns exec ns1 ip
3.3.1.5 启动网络状态
ip netns exec ns1 ifup lo
3.3.1.6 关闭网络状态
ip netns exec ns1 ifdown lo
3.3.1.7 还可以通过 link 来设置状态
# 开启
ip netns exec ns1 ip link set lo up
# 关闭
ip netns exec ns1 ip link set lo down
3.3.1.8 要实现两个namespace的通信
再添加一个namespace
要实现两个network namespace的通信,我们需要实现到的技术是:
veth pair:Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
创建一对link,也就是接下来要通过veth pair连接的link
ip link add veth-ns1 type veth peer name veth-ns2
查看宿主机中多出的一对网卡信息:
然后将创建好的 veth-ns1交给namespace1,把veth-ns2交给namespace2
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
查看ns1和ns2中的link情况
此时veth-ns1和veth-ns2还没有ip地址,接下来我们为其配置ip地址
ip netns exec ns1 ip addr add 192.168.10.10/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.10.11/24 dev veth-ns2
再次查看网卡的状态,发现是down的状态
我们需要启用对应的网卡,并且查看对应的状态
然后互相ping对方的网卡地址发现成功ping通
3.3.2 Container的NameSpace
创建两个container,每个容器都会有自己的network namespace,并且是独立的,通过ping命令我们也可以ping通,此时这两个container属于两个network namespace,是如何能够ping通的? 有些小伙伴可能会想,不就跟上面的namespace实战一样吗?注意这里并没有veth-pair技术,那是使用了什么呢?没错,就是通过桥接模式。接下来,我们就来学习一些桥接网络的概念。
3.4 深入分析container网络-Bridge
3.4.1 Docker默认Bridge
先启动俩个tomcat容器
查看ip地址,测试能否ping通,但是这个地方需要注意的是,我们直接拉取下来的镜像文件是没有ip命令、ping命令的,所以需要我们根据我们前面学过的dockerfile文件基于tomcat镜像进行加工封装,安装相关的命令,重新制作镜像
俩个tomcat属于两个不同的NetWork NameSpace,他们是通信的?其实在tomcat中有一个eth0和centos的docker0中有一个veth是成对的,类似于之前实战中的veth-ns1和veth-ns2,要确认也很简单,需要我们安装下面的命令:
yum install bridge-utils
brctl show
通过安装的命令,查看docker容器中的运行的俩个容器的Veth对,其实没运行一个容器,都会生成俩个Veth对,一个再docker0网卡上,一个在容器中,所以,我们就解决了上述的问题,俩个容器为什么能够ping通的问题。
通过画图来更直观的学习俩个容器为什么能够ping通的问题。
那么容器中是可以访问互联网的,为什么呢?这个地方主要是NAT是通过iptables实现的
3.4.2 自定义NetWork
创建一个network,类型为 Bridge
docker network create zookeeper_network
## 或者
docker network create zookeeper_network --subnet=172.18.0.0/16
查看已有的NetWork:
docker network ls
查看zookeeper_network详情信息:
docker network inspect zookeeper_network
删除network:
docker network rm zookeeper_network
创建zookeeper_network容器,并指定使用zookeeper_network
docker run -d --name zookeeper_tomcat_net --network zookeeper_network -p 8082:8080 tomcat
查看网卡接口信息
此时在zookeeper_tomcat_net容器中ping一些tomcat_ip_8080发现是ping不通的
docker exec -it zookeeper_tomcat_net ping 172.17.0.2
此时如果tomcat_ip_8080容器能够连接上zookeeper_tomcat_net上应该就可以了
docker network connect zookeeper_tomcat_net tomcat_ip_8080
3.5 深入分析 Container网络-Host&None
3.5.1 Host
Host模式下,容器将共享主机的网络堆栈,并且主机的所有接口都可供容器使用.容器的主机名将与主机系统上的主机名匹配
创建一个容器,并指定网络为host
docker run -d --name tomcat-host --network host tomcat
查看ip地址
docker exec -it tomcat-host ip a
检查host网络
docker network inspect host
3.5.2 None
None模式不会为容器配置任何IP,也不能访问外部网络以及其他容器.它具有环回地址,可用于运行批处理作业.
创建一个tomcat容器,并指定网络为none
docker run -d --name tomcat-none --network none tomcat
查看ip地址
docker exec -it tomcat-none
检查none网络
docker network inspect none
3.6 端口映射
如果我们需要在centos中通过localhost来访问呢?这时我们就需要将port-tomcat中的8080端口映射到centos上了
docker run -d --name tomcat8080 -p 8888:8080 tomcat
3.7 多机之间通信
在同一台centos7机器上,我们一定有办法让两个container通信。 那如果是在两台centos7机器上呢?
这个就需要使用到我们的Docker Swarm技术和VXLAN技术了(Virtual Extensible LAN(虚拟可扩展局域网))。
好了,到这里【一篇文章带你详细学习Docker中网络知识体系】就结束了,后续持续更新中。
特别说明:本篇文章的一些图片来自恩师邓老师,博客:波波烤鸭。