Docker和DevOps:9.容器间通信的底层原理

179 阅读4分钟

容器间通信的底层原理

一、如何让一个centos容器一直运行

  • 拉取一个centos的镜像
    在这里插入图片描述
  • 创建两个centos的容器,分别命名为centos_1、centos_2
    使用 -dit 参数后该容器会一直保持运行
docker run -dit --name=centos_1 centos:latest
docker run -dit --name=centos_1 centos:latest

在这里插入图片描述

  • 使用docker attach可进入容器
docker attach [容器name]

在这里插入图片描述

  • 退出容器
    如果退出时不想让这个容器继续运行了,则直接输入exit即可。
    如果退出时还想让这个容器继续运行,则【ctrl+p】后【ctrl+q】

二、查看网络命名空间(network namespace)

  • 进入centos_1容器,使用 ip a 命令查看这个容器的网络命名空间:
    在这里插入图片描述
  • 可以对比下,它的信息与本机、centos_2容器,都不同。
  • 说明docker给每个容器都分配了自己的网络命名空间
  • 容器centos_1和容器centos_2是可以互相通信的
    在这里插入图片描述

三、Linux下手动创建一个网络命名空间

(1) 新建

通过以下命令,新建一个网络命名空间:

ip netns add [网络命名空间名称] 

在这里插入图片描述

(2) 查看

通过以下命令,查看本机手动创建的网络命名空间

ip netns list

在这里插入图片描述

(3) 查看网络命名空间的详细信息

通过以下命令,查看指定的网络命名空间的信息(IP等等)

ip netns exec [网络命名空间名称] ip a

在这里插入图片描述
发现只有一个接口,这个也叫本地回环口,没有IP地址。

(4) 查看网络命名空间的网络接口

通过以下命令,查看指定的网络命名空间的网络接口信息

ip netns exec [网络命名空间名称] ip link

在这里插入图片描述

(5) 启用lo网络接口

通过以下命令,将本地回环口的状态启用

ip netns exec [网络命名空间名称] ip link set dev lo up

在这里插入图片描述
发现这个网络命名空间的本地回环口的状态变为了UNKNOWM,这是因为一个网络接口的开启需要两端都通。


四、使用一对veth使两个网络命名空间相通

(1) 在本机创建两个网络命名空间

之前创建了net_space_1,再创建一个net_space_2:
在这里插入图片描述

(2) Veth

上面我们创建的两个网络命名空间并不能互相通信,使用一对Veth可以把两个网络命名空间连接起来。
在这里插入图片描述

(3) 添加一对veth
  • 执行命令添加一对veth
ip link add veth-test1 type veth peer name veth-test2

这样我们就添加了一对veth,名字是veth-test1、veth-test2

  • 执行命令查看veth
ip link

在这里插入图片描述

(4) 将一对veth的两个端口分别添加到两个网络命名空间中
  • 将veth-test1添加到net_space_1中:
ip link set veth-test1 netns net_space_1

在这里插入图片描述

  • 查看网络命名空间1的信息
ip netns exec net_space_1 ip link

在这里插入图片描述

  • 再看一下本机的连接信息
    会发现我们之前创建的一对veth,只剩下一个了,因为veth-test1@veth-test2这个端已经被添加到网络命名空间net_space_1中了在这里插入图片描述
  • 同上,将veth-test2添加到net_space_2中
ip link set veth-test2 netns net_space_2
ip netns exec net_space_2 ip link

在这里插入图片描述

(5) 给一对veth的两个端口分配IP地址
  • 给两个端口设置IP地址
ip netns exec net_space_1 ip addr add 192.168.1.1/24 dev veth-test1

ip netns exec net_space_2 ip addr add 192.168.1.2/24 dev veth-test2 

在这里插入图片描述

  • 启用两个端口
ip netns exec net_space_2 ip link set dev veth-test2 up

ip netns exec net_space_2 ip link set dev veth-test2 up
  • 查看两个网络命名空间的详细IP信息
ip netns exec net_space_1 ip a

在这里插入图片描述

(6) 测试两个网络命名空间是否相通

在这里插入图片描述
在这里插入图片描述


五、容器间相互通信的原理

使用本机创建两个容器,本机会为每个容器分配一个网络命名空间,然后这两个容器能互相通信,即是两个网络命名空间能够互相通信,原理与上面基本一致。