docker容器通过veth pair 通信

本文详细介绍了如何在两个Docker容器之间建立网络连接,包括创建容器、获取进程ID、设置网络命名空间、配置Veth对并进行IP地址设置,最终实现容器间的ping测试。适合对Docker网络感兴趣的读者。

1、创建两个ubuntu容器,分别为ubuntu1和ubuntu2(以下tzk/ubuntu是自己封装的镜像,里面添加了一些基本的工具,如 net-tools) 

       sudo docker run -itd --name=ubuntu1 --network=none tzk/ubuntu

       sudo docker run -itd --name=ubuntu2 --network=none tzk/ubuntu

2、执行下面的命令来分别获取容器进程号

      PID1=$(sudo docker inspect -f '{{.State.Pid}}' ubuntu1)      #容器ubuntu1的PID1

      PID2=$(sudo docker inspect -f '{{.State.Pid}}' ubuntu2)      #容器ubuntu2的PID2

3、查看进程号(可以使用sudo docker inspect ubuntu1|grep Pid进行验证比对)

     echo "$PID1"

     echo "$PID2"

4、执行如下命令,将进程网络命名空间恢复到主机目录(如果/var/run/netns目录不存在,以root用户手动创建目录即可)

      sudo ln -s /proc/$PID1/ns/net /var/run/netns/$PID1

      sudo ln -s /proc/$PID2/ns/net /var/run/netns/$PID2

5、使用ip netns list  命令查看容器的namespace,名称即  PID1、PID2

      ip netns list

6、以下操作就是两个命名空间之间的通信,具体细节操作请移步

         1)、  sudo ip link add v1 type veth peer name v2      

         2)、  sudo ip link set v1 netns $PID1

                       sudo ip link set v2 netns $PID2

          3)  、  sudo ip netns exec $PID1 ip link set v1 up

                       sudo ip netns exec $PID1 ip addr add 10.0.0.1/24 dev v1

                       sudo ip netns exec $PID2 ip link set v2 up

                       sudo ip netns exec $PID2 ip addr add 10.0.0.2/24 dev v2

7、测试,现在,我们可以从一个容器ping通另一个容器(进入容器内部测试)。

复制以下内容直接执行(记得修改你电脑上的ubuntu镜像):

sudo docker run -itd --name=ubuntu1 --network=none tzk/ubuntu:latest
sudo docker run -itd --name=ubuntu2 --network=none tzk/ubuntu:latest
PID1=$(sudo docker inspect -f '{{.State.Pid}}' ubuntu1)      
PID2=$(sudo docker inspect -f '{{.State.Pid}}' ubuntu2)      
sudo ln -s /proc/$PID1/ns/net /var/run/netns/$PID1
sudo ln -s /proc/$PID2/ns/net /var/run/netns/$PID2
sudo ip link add v1 type veth peer name v2
sudo ip link set v1 netns $PID1
sudo ip link set v2 netns $PID2
sudo ip netns exec $PID1 ip link set v1 up
sudo ip netns exec $PID1 ip addr add 10.0.0.1/24 dev v1
sudo ip netns exec $PID2 ip link set v2 up
sudo ip netns exec $PID2 ip addr add 10.0.0.2/24 dev v2

:1、当出现类似“ln: 无法创建符号链接'/var/run/netns/25268': 没有那个文件或目录”时,可手动添加文件夹,netns,或                    者在代码中实现  sudo mkdir /var/run/netns

         2、本例中使用的是“tzk/ubuntu”,自己封装的镜像,如果使用docker hub上下载的,例如镜像“ubuntu:latest”,在完                    成后期测试工作的时候,由于--network=none  会出现apt-get update 、apt install net-tools 报错现象。故建议先自己                    封装一个安装完net-tools工具后的镜像,继而执行以上文章所述的操作。

### Docker 容器与宿主机的数据传输通信 #### 网络通信方式 容器内的网络地址和宿主机的网络地址具有相同的标志位。这意味着在创建容器时,会成对地创建虚拟以太网接口(veth pair),并且这些接口通过宿主机上的 `docker0` 网桥进行通信[^2]。 对于同一台宿主机上运行的不同容器而言,可以通过多种方式进行相互通信: - **直接 IP 访问**: 可以获取各个容器内部分配到的具体 IPv4 地址并利用该地址实现互相间的访问。 - **端口映射 (Port Mapping)**: 使用 `-p` 或者 `--publish` 参数指定外部可访问的服务端口号,在启动容器的时候设置好相应的参数即可让外界能够经由宿主机来接触目标服务。 - **自定义网络模式**: 创建用户自定义的 bridge、overlay 类型或者其他形式的网络拓扑结构以便更灵活地管理多容器环境下的连通性和隔离度。 当涉及到不同宿主机之间的 Docker 容器通讯时,则通常依赖于底层物理网络设施的支持以及可能涉及的一些高级特性比如 VXLAN 技术或是其他第三方工具和服务的帮助来进行跨节点互联操作[^4]。 #### 文件共享机制 为了使多个容器可以共同读写某些特定路径下存储的信息资源,Docker 提供了几种不同的卷挂载选项用于支持文件系统的交互: - **Bind Mounts**: 将宿主机某个现有目录作为数据源绑定至新启动起来的一个或数个容器内相应位置处; ```bash docker run -d --name my_container -v /path/on/host:/mnt/data alpine sh -c "while true; do sleep 3600; done" ``` - **Volumes**: 利用 Docker 自身维护的一套独立持久化层来保存重要资料,并允许任意数量的工作单元按需接入此区域完成任务协作; ```bash docker volume create my_volume docker run -d --name another_container -v my_volume:/data busybox sh -c "echo 'hello world' > /data/message.txt" ``` 需要注意的是,尽管两个容器可能会被配置为共享同一个网络命名空间从而简化彼此间消息传递流程,但这并不意味着它们也会自动同步任何磁盘上的变动情况——除非特别指定了上述提到的一种合适的方式去处理这个问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值