正在进入ing...

docker Network 网络实现多容器私有网络

发布时间:2020-09-08 浏览量: 1921 文章分类: 运维相关

网络命名空间

准备工作,首先在本机启动2个docker容器(我们先拉取一个镜像是busybox,因为这个包体比较小,只有1.22MB),拉取后可以先跑起来2个。

docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"

然后通过docker ps就可以查看到已经有2个镜像在跑起来了(因为我们用了-d参数), 名字分别是test1test2里面是写的一个死循环,也就是每次休眠1个小时

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d85deb78368e        busybox             "/bin/sh -c 'while t…"   16 minutes ago      Up 16 minutes                           test2
ffbce9b8d32a        busybox             "/bin/sh -c 'while t…"   19 minutes ago      Up 19 minutes                           test1

然后可以通过docker exec -it test1 /bin/sh进入到这个正在执行的容器内部.

先进入test1容器内部执行ip a查看一下ip地址。可以看到test1的ip信息如下

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop qlen 1000
    link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
116: eth0@if117: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

也就是他有一个本地ip是127.0.0.1,还有一个局域网地址是172.17.0.2

同理,在进入test2看到他的ip地址也是一样,分别是127.0.0.1172.17.0.3

截止目前,这2个容器的ip地址是互通的,在进入test1里面执行ping 172.17.0.3是可以通的,同理,在test2里面执行去ping test1也是没有问题的,

接下来就是重点了,首先我们在宿主机上执行ip netns list 是没有网络信息的,执行了也不会显示什么。

在这之前,最好能先了解熟悉一下linux 网络虚拟化,也就是network namespace

例如 我们在本机执行 sudo ip netns add test1来添加一个test1的网络名称,当然也可以执行sudo ip netns add test2来继续添加,这样相当于这个容器就会存在独立的network namespace(名字自己随便起)。

一些常用的命令

sudo ip netns list #查看网络
sudo ip netns delete name  #删除指定的网络
sudo ip netns add name #添加指定的网络名称
ip link #查看当前网络的详细链接情况
------
sudo ip netns exec test1 ip a #查看添加网络test1的 ip情况
sudo ip netns exec test1 ip link #查看添加的网络test1的 链接情况
sudo ip netns exec test1 ip link set dev lo up  # 让处于DOWN状态的网络up起来

如果都了解了,那么继续之前的问题,先在本机测试一下,先添加一个网络ip netns add test1,然后执行ip netns list查看是否添加成功,如果成功的话,可以在执行 ip netns exec test1 ip a 查看这个网络的状态,如果显示如下则正常,这个网络回环口目前的状态应该是DOWN状态的

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

通过上面测试没问题的话,我们就分别在执行ip netns delete test1 、 test2删除这2个网络。

然后我们继续让这2个容器连接起来。

  • 首先我们在宿主机先执行

# 添加一个网络名称 sudo ip link add veth-test1 type veth peer name veth-test2 # 查看网络情况 ip link # 确认是否多了两个`veth-test2@veth-test1`、`veth-test1@veth-test2` 类似如下 8: veth-test2@veth-test1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether c6:c6:0f:f7:ba:14 brd ff:ff:ff:ff:ff:ff 9: veth-test1@veth-test2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether de:d7:6a:32:8a:e8 brd ff:ff:ff:ff:ff:ff

  • 分别给两个容器添加网络

``` sudo ip link set veth-test1 netns test1 # 在查看test1的网络 sudp ip netns exec test1 ip link # 变成下面这样,增加了一个新的网络 8: veth-test2@veth-test1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether c6:c6:0f:f7:ba:14 brd ff:ff:ff:ff:ff:ff 9: veth-test1@veth-test2: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether de:d7:6a:32:8a:e8 brd ff:ff:ff:ff:ff:ff root@parallels-Parallels-Virtual-Platform:/home/parallels# # 这个时候如果在查看宿主机的ip link会发现,我们添加的部件test1不见了,他已经添加到容器里面了 #然后继续上面的步骤将test2也添加到 容器test2的里面 #然后可以查看一下test2的网络情况 root:/home/parallels# ip netns exec test2 ip link 1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 8: veth-test2@if9: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether c6:c6:0f:f7:ba:14 brd ff:ff:ff:ff:ff:ff link-netnsid 0

```

  • 给端口绑定IP

    sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1 sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2

    执行了上面分配IP命令后,我们在分别检查一下

    sudo ip netns exec test1 ip a sudo ip netns exec test2 ip a

如果不出意外 应该就已经看到我们分别给分配的IP:192.168.1.1192.168.1.2了,不过需要注意一下,这些IP地址都是DOWN的状态的,我们继续在分别启动一下2个端口

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 netns exec test1 ip link可以查看到现在网络的端口就是up状态了

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
9: veth-test1@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether de:d7:6a:32:8a:e8 brd ff:ff:ff:ff:ff:ff link-netnsid 1

截止到上面,我们就通过了手动配置实现了,docker 多容器的私有网络配置。接下来可以继续试试

sudo ip netns exec test1 ping 192.168.1.2这个就是用test1去pingtest2容器,可以看到也是通的了。那就没有问题了。