容器间通信的底层原理
一、如何让一个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) 测试两个网络命名空间是否相通
五、容器间相互通信的原理
使用本机创建两个容器,本机会为每个容器分配一个网络命名空间,然后这两个容器能互相通信,即是两个网络命名空间能够互相通信,原理与上面基本一致。