docker Network 网络实现多容器私有网络
网络命名空间
准备工作,首先在本机启动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
参数), 名字分别是test1
、test2
里面是写的一个死循环,也就是每次休眠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.1
和172.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:
```
-
给端口绑定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.1
和192.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
容器,可以看到也是通的了。那就没有问题了。