Docker网络之名称空间Namespace

一. 案例

1.1、创建一个 container

docker pull hub.c.163.com/library/busybox:latest
docker run -d --name test1 hub.c.163.com/library/busybox /bin/sh -c "while true; do sleep 3600; done"

 

2、进入到 container 内:  docker exec -it test1 /bin/sh  或者   docker exec -it 3aeb299677bd  /bin/sh

3、查看 当前网络 ip a  :  可以看出 其使用的 ip 地址为 127.0.0.1  和 172.17.0.2

4、退出 (ctrl+d)到 虚拟机 使用 ip a

可以看出 其 ip 地址 与 test1 内的 ip 地址不同  所以 通过 network Namespace 实现了网络的隔离

5、再次创建相同的容器

docker run -d --name test2 hub.c.163.com/library/busybox /bin/sh -c "while true; do sleep 3600; done"

docker run -d --name test2 hub.c.163.com/library/busybox /bin/sh -c "while true; do sleep 3600; done"

6、进入 查看新 容器的 IP 

  docker exec test2 ip a

  可以看出 其使用的 ip 地址为 127.0.0.1  和 172.17.0.3

7、进入 test2 容器 并 ping 通 test1 是可以 ping 通的

docker exec -it test2 /bin/sh

ping 172.17.0.2

二、network Namespace 操作

  1. 查看所有 network Namespace: sudo ip netns list

  2. 删除 network Namespace: sudo ip netns delete [ list 出来的项 ]

  3. 添加  network Namespace:  sudo ip netns add [eg:test1]

  4.查看创建的 容器 test1 的 ip:

    sudo ip netns exec test1 ip a  在 test1 容器内 执行 ip a 命令

    sudo ip netns exec test1 ip link   在 test1 容器内 执行 ip link 命令

    sudo ip netns exec test1 ip link set dev lo up 让 test1 容器内 的 lo 回管口 up 起来

注意:再次执行 ip netns show命令。很遗憾,这里什么输出都没有。

原因在于,Docker 启动容器后仍然会以进程号创建新的名字空间,但在较新的版本里面,默认删除了系统中的名字空间信息文件。网络名字空间文件位于 /var/run/netns 下面,比如我们之前创建的 test 名字空间,则在这个目录下有一个 test 文件。诸如 netns 类似的系统命令依靠这些文件才能获得名字空间的信息。

在容器启动后,查看这个目录,会发现什么都没有。

OK,那让我们手动重建它。重建步骤

三、 连接两个容器

  

3.1、添加一对link  (即 图中 那根管道)

   sudo ip link add veth-test1 type veth peer name veth-test2

   使用 ip a (或者ip link)查看创建的 link:会出现 veth-test2@veth-test1   和  veth-test1@veth-test2 这一对link

3.2、将 veth-test1 添加到 test1 容器中  并且 将 veth-test2 添加到 test2 容器中

  ip link set veth-test1 netns test1

  ip netns exec test1 ip link   查看是否包含 veth-test1

  ip a                 查看包含的 veth 是否还包含 veth-test1

同理,

  ip link set veth-test2 netns test2

  ip netns exec test2 ip link  查看是否包含 veth-test2

    ip a                 查看包含的 veth 是否还包含 veth-test2

3.3、分配 ip 地址

    分配 ip 地址 test1

      sudo ip netns exec test1 ip addr add 192.168.1.13/24 dev veth-test1

    分配 ip 地址 test2

      sudo ip netns exec test2 ip addr add 192.168.1.14/24 dev veth-test2

    使用 ip link 查看是否分配 ip 地址  发现 网络 还未开启

      sudo ip netns exec test1 ip link

    将 test1 和 test2 的网络 开启

      sudo ip netns exec test1 ip link set dev veth-test1 up

      sudo ip netns exec test2 ip link set dev veth-test2 up

    使用 ip a 查看是否 分配ip 地址

      sudo ip netns exec test1 ip a

      sudo ip netns exec test2 ip a

    使用 ping 互通 test1 test2

      sudo ip netns exec test1 ping 192.168.1.14

      sudo ip netns exec test2 ping 192.168.1.13

发布了382 篇原创文章 · 获赞 306 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lixinkuan328/article/details/103883687
今日推荐