【一篇文章带你详细学习Docker中网络知识体系】

一.知识回顾

之前的内容都帮你整理好了,在这里哟!

【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地址
【一篇文章带你详细学习Docker中网络知识体系】_第1张图片

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 

【一篇文章带你详细学习Docker中网络知识体系】_第2张图片

3.3.1.5 启动网络状态
ip netns exec ns1 ifup lo

【一篇文章带你详细学习Docker中网络知识体系】_第3张图片

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

查看宿主机中多出的一对网卡信息:

【一篇文章带你详细学习Docker中网络知识体系】_第4张图片

然后将创建好的 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的状态【一篇文章带你详细学习Docker中网络知识体系】_第5张图片
我们需要启用对应的网卡,并且查看对应的状态

【一篇文章带你详细学习Docker中网络知识体系】_第6张图片
然后互相ping对方的网卡地址发现成功ping通
【一篇文章带你详细学习Docker中网络知识体系】_第7张图片

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镜像进行加工封装,安装相关的命令,重新制作镜像
【一篇文章带你详细学习Docker中网络知识体系】_第8张图片
俩个tomcat属于两个不同的NetWork NameSpace,他们是通信的?其实在tomcat中有一个eth0和centos的docker0中有一个veth是成对的,类似于之前实战中的veth-ns1和veth-ns2,要确认也很简单,需要我们安装下面的命令:

yum install bridge-utils
brctl show

【一篇文章带你详细学习Docker中网络知识体系】_第9张图片
通过安装的命令,查看docker容器中的运行的俩个容器的Veth对,其实没运行一个容器,都会生成俩个Veth对,一个再docker0网卡上,一个在容器中,所以,我们就解决了上述的问题,俩个容器为什么能够ping通的问题。
在这里插入图片描述
通过画图来更直观的学习俩个容器为什么能够ping通的问题。
【一篇文章带你详细学习Docker中网络知识体系】_第10张图片

那么容器中是可以访问互联网的,为什么呢?这个地方主要是NAT是通过iptables实现的
【一篇文章带你详细学习Docker中网络知识体系】_第11张图片

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

【一篇文章带你详细学习Docker中网络知识体系】_第12张图片

查看zookeeper_network详情信息:

docker network inspect zookeeper_network

【一篇文章带你详细学习Docker中网络知识体系】_第13张图片

删除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中网络知识体系】_第14张图片

好了,到这里【一篇文章带你详细学习Docker中网络知识体系】就结束了,后续持续更新中。

特别说明:本篇文章的一些图片来自恩师邓老师,博客:波波烤鸭。

你可能感兴趣的:(Docker)