AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 839557
Accepted
tudor -Reinstate Monica-
tudor -Reinstate Monica-
Asked: 2017-03-21 22:01:57 +0800 CST2017-03-21 22:01:57 +0800 CST 2017-03-21 22:01:57 +0800 CST

如何将 docker 容器连接到同一 macvlan 网络上的多个 ip?

  • 772

当我尝试使用 create, , start 模式向同一 macvlan 网络中的 docker 容器添加第二个 IP 地址时,docker network connect它似乎覆盖了第一个 IP 地址。

重现步骤:

1)创建一个docker macvlan网络:

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

2) 从镜像创建一个 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 macvlan 网络中的其他 IP(在同一或其他虚拟接口上)添加到同一 docker 容器?

networking
  • 1 1 个回答
  • 4165 Views

1 个回答

  • Voted
  1. Best Answer
    tudor -Reinstate Monica-
    2017-03-22T20:41:44+08:002017-03-22T20:41:44+08:00

    作为对我问题的临时回答。可以通过进行两项更改来做到这一点:

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

    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 a a 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。只有创建命令中的原始 IP 显示在docker network inspect

    • 4

相关问题

  • 谁能指出我的 802.11n 范围扩展器?

  • 我怎样才能得到一个网站的IP地址?

  • 在一个 LAN 中使用两台 DHCP 服务器

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve