Docker容器内执行宿主机指令

这篇具有很好参考价值的文章主要介绍了Docker容器内执行宿主机指令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 背景

        最近项目有个需求,需要程序配置服务器IP并且可以重启服务器。如果程序直接部署在服务器,相信大家都会操作。但是程序是用docker运行的,在docker中执行指令就很麻烦了。这时候需要添加容器一些特殊的权限和执行一些特殊的命令就可以执行宿主机上面的指令了。

二 解决办法

docker运行时添加参数 --pid=host --privileged=true

如下实例:

docker run -itd --pid=host --privileged=true -p 9683:9683 hss-server

同理,使用docker-compose部署时也添加

privileged: true
pid: host

如下图所示 

docker 调用宿主程序,KubeSphere/Docker,docker,Powered by 金山文档

说明:

  • pid=host :

使用宿主机命名空间,方便容器获取到宿主机所有进程信息。将宿主机的/proc文件夹挂载进入容器的/proc路径 , 其中/proc/1作为nsenter的目标;

  • nsenter:

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令,位于util-linux包中 。该命令作为容器向宿主机发送命令的关键部分 。

使用格式

nsenter -a -t <pid> <command> 或者nsenter -m -u -i -n -p -t <pid> <command> ;

-a表示进入宿主机的所有命名空间 , -t 表示获取/proc/{pid}进程 ,liniux旧版本可能不支持。需要使用 -m -u -i -n -p 。 -m -u -i -n -p,表示进入mount, UTS,System V IPC,网络,pid命名空间, 这几个命名空间包含了绝大多数的空间环境。

  • privileged=true

使得docker容器有root权限执行宿主机命令,确保从容器执行命令时不会报权限不足提示;

三 实战

1. 容器中直接操作

以重启服务器举例:

启动容器

docker 调用宿主程序,KubeSphere/Docker,docker,Powered by 金山文档

在容器中执行

nsenter -m -u -i -n -p -t 1 sh -c "reboot"

可以看到服务器已重启,说明在容器中已可以执行宿主机的命令

docker 调用宿主程序,KubeSphere/Docker,docker,Powered by 金山文档

2. 这里以golang项目代码举例

定义一个docker内执行指令的公共函数

docker 调用宿主程序,KubeSphere/Docker,docker,Powered by 金山文档

func DockerRunCommand(command string) (err error) {

/*

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令,位于util-linux包中 。该命令作为容器向宿主机发送命令的关键部分 。

使用格式:nsenter -a -t <pid> <command> 或者nsenter -m -u -i -n -p -t <pid> <command> ;

-a表示进入宿主机的所有命名空间 , -t 表示获取/proc/{pid}进程 ,liniux旧版本可能不支持。

需要使用 -m -u -i -n -p 。 -m -u -i -n -p,表示进入mount, UTS,System V IPC,网络,pid命名空间,

这几个命名空间包含了绝大多数的空间环境。

*/

cmd := exec.Command("nsenter", "-m", "-u", "-i", "-n", "-p", "-t", "1", "sh", "-c", command)

log.Debug("DockerRunCommand==", cmd.String())

var stderr bytes.Buffer

cmd.Stderr = &stderr

err = cmd.Run()

if err != nil {

log.Println("运行系统命令错误", err, ":", stderr.String())

return

}

return

}

调用该函数文章来源地址https://www.toymoban.com/news/detail-706300.html

docker 调用宿主程序,KubeSphere/Docker,docker,Powered by 金山文档

到了这里,关于Docker容器内执行宿主机指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jenkins容器使用宿主机Docker

    构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。 设置Jenkins容器使用宿主机Docker 设置宿主机docker.sock权限: 添加数据卷

    2024年01月18日
    浏览(48)
  • docker 容器与宿主机时间同步

    1.docker run 2.Docker file 3.docker-compose 4.宿主机直接执行命令给某个容器同步时间 注意:这种方式需要重启容器 docker exec -it 70ec41893d66 /bin/bash 回车后输入date验证即可

    2024年02月08日
    浏览(50)
  • docker容器共享宿主机环境(目录挂载)

    一、背景介绍 如果开发的服务均需要将打成docker镜像,可是随着服务越来越多,镜像也越来越多。每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M。有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少。 二、测试 我们

    2024年02月09日
    浏览(60)
  • Docker第一讲 Docker容器间/容器与宿主机ping不通解决

    通过容器ip访问 容器重启后,ip会发生变化。通过容器ip访问不是一个好的方案。 通过宿主机的ip:port访问 通过宿主机的ip:port访问,只能依靠监听在暴露出的端口的进程来进行有限的通信。 通过link建立连接(官方不推荐使用) 运行容器时,指定参数link,使得源容器与被链接

    2024年02月11日
    浏览(45)
  • docker 容器无法通过 IP 访问宿主机

    一次部署项目过程中,将Java项目与中间件服务部署在同一远程机器上,出现连接不上中间件服务的问题,而项目在本地运行时是可以连接的,没有问题。 这是因为项目与服务都是通过docker容器运行的,而docker 容器无法通过 IP 访问宿主机(貌似高版本解决了这个问题),所以

    2024年02月09日
    浏览(42)
  • 【docker知识】从容器中如何访问到宿主机

            使用 Docker 能实现服务的容器化,并使用容器间网络在它们之间进行通信。有时您可能需要一个容器来与宿主机上非容器化的服务通信。以下是如何从 Docker 容器中访问本地主机或 127.0.0.1的具体方法。         适用于 Windows 和 Mac 的 Docker Desktop 18.03+ 支持 host.

    2024年02月02日
    浏览(43)
  • 宿主机无法ping通docker容器IP解决

    安装docker后,发现启动容器的端口8082 映射到宿主机的端口80访问主机没有反应,此时进入容器查看日志,发现并没有请求打进来 现象: 正在连接 localhost (localhost)|::1|:80… 已连接。 已发出 HTTP 请求,正在等待回应… 读取文件头错误 (Connection reset by peer)。 重试中。 1:怀疑容

    2024年02月06日
    浏览(44)
  • 【Docker小知识】(1)宿主机和容器的文件拷贝

            docker cp 命令用于在本地文件系统与  Dokcer容器  之间复制文件或者文件夹。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。         宿主机是容器的托管环境,容器运行在宿主机上。容器的创建、启动、停止、销毁等操作都是在宿主机上进行的。     

    2024年02月11日
    浏览(43)
  • Docker容器内连接宿主机的其他服务,比如Mysql

    通过上一篇文章,我们可以解决同一个容器内的通讯问题,大家使用同一个桥接网络的方案是最简便的,但是我们的容器需要访问宿主机怎么办 ? 现实的场景,我们一般都是微服务全部部署到了容器内,但是像数据库这种极其需要稳定性的功能,我们是需要部署到宿主机上

    2024年02月12日
    浏览(49)
  • Docker之宿主机与容器之间的文件复制与挂载

    宿主机与容器之间的文件挂载与复制 1、从宿主机复制到容器命令格式为:       docker cp 宿主机的本地地址 容器名/容器ID:容器路径  先在宿主机里面创建一个666.txt的文件,然后docker cp 命令把文件复制到容器中。 2、从容器复制到宿主机命令格式:      docker cp 容器名字

    2024年02月13日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包