当前位置: 首页 > Linux

docker容器操作宿主机执行命令

时间:2023-04-06 19:52:20 Linux

demand。一般情况下,该操作是反设计的,需要谨慎使用。有时候我们在使用docker的时候,需要使用宿主机的命令操作,比如执行netplanapply才能生效。机器网络配置查看主机主机网络信息使用ifconfig或ipaddr从容器发出命令重启主机。具体实现dockerrun实现最简单的实现使用docker运行一个ubuntu容器进入容器执行nsenter命令查看宿主机网络配置信息$sudodockerrun-it--pid=host--privileged=trueubuntu/bin/bash#进入容器后执行/#nsenter-a-t1sh-c"ipaddr"dockercompose新建一个compose.yaml文件,写入如下内容services:demo:image:python:3-bullseyepid:hostprivileged:truecontainer_name:demo-execcommand:/bin/sh-c"whiletrue;doechohello;sleep3600;done"执行命令$dockercomposeup-d进入容器,并创建和编写demo.py文件代码$dockerexec-itdemo-exec/bin/bash/#cat>demo.py<[...]]在其他程序的命名空间中运行一个程序选项:-a,--all输入所有命名空间-t,--target获取命名空间的目标进程-m,--mount[=]输入挂载命名空间-u,--uts[=]输入UTS命名空间(主机名等)-i,--ipc[=]输入SystemVIPC命名空间-n,--net[=]输入网络命名空间-p,--pid[=]enterpidnamespace-C,--cgroup[=]entercgroupnamespace-U,--user[=]enterusernamespace-S,--setuidsetuidin入口空间-G,--setgid在入口命名空间中设置gid--preserve-credentials不干扰uid或gid-r,--root[=]设置根目录-w,--wd[=

]setworkingdirectory-F,--no-forkdonotforkbeforeexecuting-Z,--follow-context根据--targetPID设置SELinux环境-h,--help显示帮助-V,--version显示版本请参阅nsenter(1)了解更多信息。具体执行$nsenter-a-t1sh-c"ipaddr"-a表示进入宿主机的所有namespace-t1表示获取/proc/1进程,也就是pid=1的进程,即docker使用-pid=host参数在容器内部挂载宿主进程sh-c"ipaddr",表示发送给宿主的命令是ipaddr。如果在实际使用过程中出现宿主机和容器命名空间不一致的情况,主要原因是宿主机内核版本与容器默认加载的内核版本不一致。比如在Linux4.6版本中加入了cgroup。如果使用ubuntu20或者python3.10等其他比较新的镜像启动容器,当nsenter使用参数-a时,容器会加载所有的命名空间,但是cgroup命名空间在旧版本的系统中,因为内核版本比较旧,所以命名空间不存在,最终nsenter命令会报错。您需要根据主机的名称空间调整nsenter参数。可以调整如下$nsenter-m-u-i-n-p-t1sh-c"ipaddr",SystemVIPC,network,pidnamespace这些命名空间包含了大部分的空间环境,以及大部分的命令linux的可以正常执行。命名空间说明命名空间是Linux中一些进程的属性范围。空间,可以隔离不同的进程Linux在不断的增加命名空间。目前有mount:mount命名空间,让进程有独立的挂载文件系统,从linux2.4.19开始ipc:ipc命名空间,让进程有独立的ipc,包括消息队列、共享内存和信号量,启动从Linux2.6.19uts:uts命名空间,让进程拥有独立的hostname和domainname,从Linux2.6.19net开始:networkcommandspace,让进程拥有独立的网络栈,从Linux2.6.24开始pid:pid命名空间,让进程拥有独立的pid空间,从linux2.6.24user:usernamespace,就是进程拥有独立的用户空间,从linux2.6开始。23.Linux3.8cgroup结束:cgroup命名空间,启用进程有独立的cgroup控制组,从Linux4.6开始。阅读nsenter命令介绍Linux手册pagedocker官方文档