Docker设置容器接口名的Netlink机制、修改方法及netns可见性问题
问题1解答:Docker设置容器接口名的实现与修改方法
Docker在初始化容器网络栈阶段,会进入新建的容器网络命名空间,通过Netlink RTM_NEWLINK类型消息,携带IFLA_IFNAME属性将容器侧veth接口的名称设置为eth0,该操作在容器用户进程启动前完成,不受容器权限限制。
你在容器内操作报错是因为默认Docker容器启动时会剥离NET_ADMIN权限,修改网络接口名称、启停接口等操作都需要该权限支持,受限root用户无相关权限就会触发Operation not permitted报错。
便捷修改方法有两种:
- 启动容器时追加权限,进入容器后直接修改:
启动命令添加--cap-add NET_ADMIN参数:
进入容器后执行以下命令即可完成改名:docker run -it --cap-add NET_ADMIN <镜像名> baship link set eth0 down ip link set eth0 name mang0 ip link set mang0 up - 宿主机侧无需修改容器启动参数直接操作:
首先获取容器PID:
用PID=$(docker inspect -f '{{.State.Pid}}' <容器ID/容器名>)nsenter进入容器网络命名空间执行改名操作:nsenter -t $PID -n ip link set eth0 down nsenter -t $PID -n ip link set eth0 name mang0 nsenter -t $PID -n ip link set mang0 up
问题2解答:宿主机无法查看容器网络命名空间的原因
ip netns show命令默认只会读取/var/run/netns目录下的网络命名空间绑定挂载点,Docker默认不会将容器的网络命名空间挂载到该目录下,因此执行命令输出为空。
如果需要通过ip netns命令管理容器网络命名空间,可以手动创建绑定挂载:
# 先获取容器PID,操作同上 mkdir -p /var/run/netns ln -s /proc/$PID/ns/net /var/run/netns/<自定义命名空间名>
执行完上述操作后,执行ip netns show就能看到对应的容器网络命名空间,也可以直接在宿主机通过ip netns exec <自定义命名空间名> <命令>操作容器内网络栈。
至于看不到容器侧接口,是因为容器侧的veth接口归属容器独立的网络命名空间,宿主机默认网络命名空间只能看到宿主机侧的veth端点,切换到容器网络命名空间后即可查看容器侧接口。
内容的提问来源于stack exchange,提问作者Liam Kelly
相关产品推荐
相关产品推荐

