如何将Docker容器连接到同一个macvlannetworking上的多个ips?

当我尝试添加第二个IP地址到我的docker容器在同一个macvlannetworking,使用创build, docker network connect ,启动模式它似乎覆盖第一个IP地址。

重现步骤:

1)创build一个docker macvlannetworking:

 docker network create -d macvlan \ --subnet=192.168.100.1/24 \ -o parent=eth0 pub_net 

2)从图像创build一个docker容器,从子网添加一个IP地址到容器:

 docker create \ --network pub_net \ --ip=192.168.100.2 \ -h mycontainer \ --name mycontainer \ -ti \ alpine \ /bin/sh 

3)添加一个带有别名的第二个IP地址给容器

 docker network connect \ --ip 192.168.100.3 \ --alias mycontainer-int2 \ pub_net \ mycontainer 

(可以肯定的是,这个命令的结果是0–成功)

 $ echo $? 0 

4)运行它,打开它看看

 $ docker start mycontainer mycontainer $ docker attach mycontainer / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 10: eth0@if2: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc noqueue state LOWERLAYERDOWN link/ether 02:42:c0:a8:c8:03 brd ff:ff:ff:ff:ff:ff inet 192.168.100.3/24 scope global eth0 valid_lft forever preferred_lft forever / # 

而…只是为了确定:

 $ docker network inspect pub_net [ { "Name": "pub_net", "Id": "578df6fd9929b0c44356e32a04043b358c2a052e11377ee7430743cd48566203", "Scope": "local", "Driver": "macvlan", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.100.1/24" } ] }, "Internal": false, "Containers": { "7f2fd160b8f7340d75861c1c0f743820ee713b13738a1f09252b0b17da58f111": { "Name": "mycontainer", "EndpointID": "44af06571b1c6334001cbb13c15702640d93930e30f415052e684a96b0d0a893", "MacAddress": "02:42:c0:a8:c8:03", "IPv4Address": "192.168.100.3/24", "IPv6Address": "" } }, "Options": { "parent": "eth0" }, "Labels": {} } ] 

如何在相同的docker macvlannetworking中向相同的docker容器正确添加更多的IP(在同一个或另外的虚拟接口上)?

作为我的问题的临时答案。 可以通过做两点改变来做到这一点:

1)添加–cap-add = NET_ADMIN到创build命令,例如

 docker create \ --cap-add=NET_ADMIN --network pub_net \ --ip=192.168.100.2 \ -h mycontainer \ --name mycontainer \ -ti \ alpine \ /bin/sh 

2)跳过第3步, docker容器中添加ip地址:

 $ docker start mycontainer mycontainer $ docker attach mycontainer / # ip aa 192.168.100.3/24 dev eth0 / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 10: eth0@if2: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc noqueue state LOWERLAYERDOWN link/ether 02:42:c0:a8:c8:03 brd ff:ff:ff:ff:ff:ff inet 192.168.100.2/24 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.100.3/24 scope global secondary eth0 valid_lft forever preferred_lft forever / # 

这工作,因为我现在可以通过任何IP ping和访问相同的容器。

但是,需要注意的是IP必须手动pipe理。 只有在创build命令中的原始IP显示在docker network inspect