V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CRUD
V2EX  ›  Docker

docker 如何修改已运行容器的 mac 地址?

  •  
  •   CRUD · 2021-03-05 12:34:24 +08:00 · 2367 次点击
    这是一个创建于 1358 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知在容器 run 时可以通过--mac-address指定容器 mac 地址,但已运行的容器如何二次修改使其 mac 地址固定?

    已运行的容器内产生了其他未持久化到宿主机上的数据,所以直接删了重新 run 一个容器比较麻烦。修改containers/{容器 ID}/config.v2.json文件,在Config节点下加入"MacAddress": "xxxxxx",以及修改NetworkSettings节点下的MacAddress的值都没有用,重启后还是分配回了原来的 Mac 。

    3 条回复    2021-03-05 13:57:57 +08:00
    whileFalse
        1
    whileFalse  
       2021-03-05 12:48:28 +08:00   ❤️ 1
    commit 成一个新的镜像,然后重新 run
    或者通过 docker cp 拷贝到新容器中
    gam2046
        2
    gam2046  
       2021-03-05 13:55:08 +08:00
    这种情况比较麻烦,docker 本身设计成无状态,就是为了随时用随时销毁的。

    由于存在了未持久化的数据需要保留,建议将相关内容复制出来后,然后重建容器。

    也就是#1 的第二种方案,至于#1 第一种.....嗯....dirty solution,可以是也可以,如果是抱着”又不是不能用“的想法,这种方案更简单。
    baiyi
        3
    baiyi  
       2021-03-05 13:57:57 +08:00   ❤️ 2
    正常来讲,虚拟网络设备的 mac 地址可以用 ip command 修改,但是在容器内直接操作是不会被允许的,因为有安全问题,会提示“RTNETLINK answers: Operation not permitted”

    所以需要在宿主机上通过 network namespace 来操作。docker 创建的 network namespace 获取比较复杂,不能直接通过 ip netns 获取。

    按步骤来获取 netns:

    1. 查找 docker container pid
    docker inspect -f '{{.State.Pid}}' ${contriner_id}

    2. 创建本机的 netns 目录
    mkdir /var/run/netns

    3. 创建链接
    ln -sfT /proc/${pid}/ns/net /var/run/netns/${container_id}

    4. 查看 netns
    ip netns

    然后就可以通过 ip comnad 修改 mac 地址了,但是我不确定修改后会不会导致其他的问题......

    ip netns exec ${netns_name} ip link set dev eth0 down
    ip netns exec ${netns_name} ip link set dev eth0 address ${new_max_address}
    ip netns exec ${netns_name} ip link set dev eth0 up
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2756 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:32 · PVG 21:32 · LAX 05:32 · JFK 08:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.