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

2021-03-05 12:34:24 +08:00
 CRUD

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

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

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

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

也就是#1 的第二种方案,至于#1 第一种.....嗯....dirty solution,可以是也可以,如果是抱着”又不是不能用“的想法,这种方案更简单。
baiyi
2021-03-05 13:57:57 +08:00
正常来讲,虚拟网络设备的 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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/758750

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX