有关如何实现在容器中执行宿主机命令以达到更改linux网卡的需求 运行环境 linux/amd64 docker openjdk:8-jre-alpine
1.docker镜像准备工作
docker pull openjdk:8-jre-alpine
启动容器
docker run -itd --name openjdk openjdk:8-jre-alpine
进入容器
docker exec -it openjdk sh
可以看到 alpine自带的工具集BusyBox 包含nsenter工具,但是!!!此工具为精简版本,有些指令不支持。
(尝试过java Runtime获取子Process,单独启动Callable线程去读取输出流失败)
所以希望通过nsenter进入命名空间直接执行宿主机指令
修改镜像
alpine自带包管理工具 apk
apk add util-linux
util-linux安装完成
查看版本信息:nsenter -V
nsenter from util-linux 2.33
说明安装成功 可以直接使用nsenter sh -c ""发送指令了
docker commit openjdk zgdrogon/openjdk:8-jre-alpine
注意*:博主使用的是arm架构系统,打包镜像需要使用x86 docker,buildx支持plantform,commit暂时不支持(待确定,未找到解决方案)
也可以直接使用我打包好的镜像
docker pull zgdrogon/openjdk:8-jre-alpine
2.容器启动
容器启动携带参数
-v /proc:/host/proc 宿主机namespace
--privileged
-v /etc/sysconfig/network-scripts/:/etc/sysconfig/network-scripts/ 网卡文件
3.容器内更新宿主机网卡
由于挂载了网卡的文件系统,直接在容器内修改网卡配置信息,通过nsenter重新启动网卡
docker exec -it containerID sh
vi /etc/sysconfig/network-scripts/ifcfg-enp5s0
=> IPADDR=192.168.0.221
nsenter --mount=/host/proc/1/ns/mnt bash -c "ifdown ifcfg-enp5s0 down && ifup ifcfg-enp5s0 up"
执行该命令,网卡重新启动,可以使用设置ip访问该主机