已知在容器 run 时可以通过--mac-address
指定容器 mac 地址,但已运行的容器如何二次修改使其 mac 地址固定?
已运行的容器内产生了其他未持久化到宿主机上的数据,所以直接删了重新 run 一个容器比较麻烦。修改containers/{容器 ID}/config.v2.json
文件,在Config
节点下加入"MacAddress": "xxxxxx"
,以及修改NetworkSettings
节点下的MacAddress
的值都没有用,重启后还是分配回了原来的 Mac 。
1
whileFalse 2021-03-05 12:48:28 +08:00 1
commit 成一个新的镜像,然后重新 run
或者通过 docker cp 拷贝到新容器中 |
2
gam2046 2021-03-05 13:55:08 +08:00
这种情况比较麻烦,docker 本身设计成无状态,就是为了随时用随时销毁的。
由于存在了未持久化的数据需要保留,建议将相关内容复制出来后,然后重建容器。 也就是#1 的第二种方案,至于#1 第一种.....嗯....dirty solution,可以是也可以,如果是抱着”又不是不能用“的想法,这种方案更简单。 |
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 |