关于docker中执行docker命令的实践
大家好,又见面了,我是你们的朋友全栈君。
最近在制作给kubernetes jenkins plugin调用的jenkins slave(默认情况下,kubernetes jenkins插件使用的是jenkinsci/jnlp-slave)容器镜像,以供自动创建的pod使用。对这个镜像的需求是:希望在pod运行的容器内,执行docker命令,完成docker build, push等一些操作,即docker in docker。
首先,需要在容器的镜像里面也安装docker包。然后,通过挂载宿主机的/var/run/docker.sock文件,可以在容器内使用docker命令,而且是跟在当前的宿主机上执行一样。
但是制作的jenkins-slave容器里使用的账号是非root账号jenkins,导致对/var/run/docker.sock没有访问权限,报错如下:
通常,为了使非root用户能够执行docker命令,解决办法是:将该用户添加到docker组。
usermod -G docker jenkins
这种方法,在宿主机上配置后,用jenkins用户运行docker是没有问题的,但是容器里面执行docker命令还是报错。分析原因应该是:容器里和宿主机上的docker组的id不一样导致的。 容器里:
宿主机上:
如上试验发现,容器里docker的组id是996,宿主机上的则为989。这就尴尬了。。。难道就只有用root用户运行了吗?
后来想到通过su命令,jenkins账号可以切换到root命令,于是想到了一种方案。设脚本docker2内容如下:
#!/bin/bash
echo "your_password" | su - root -c "/usr/bin/docker $*"
用这个脚本替代原有的docker命令,这样在执行docker命令之前先完成root用户切换,再执行docker命令。如:docker2 ps就等价于执行了原生的docker ps命令。
不过,这样明文写了容器的root密码在脚本里,可能会不太安全。如果不想这样,可以直接用root用户来运行jenkins slave的容器。但这样jenkins slave的进程也将是按root用户运行了。
另外,实现docker in docker必须要docker里也安装docker包吗? 试验使用docker镜像里没有再安装docker包的镜像,只是通过挂载宿主机的/usr/bin/docker, /var/run/docker.sock来运行容器。发现在该容器里执行docker命令时会出现类似如下的报错:
/usr/bin/docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory
也就是说,在执行docker命令时,并不是一个docker二进制文件就可以通过/var/run/docker.sock来跟宿主机的docker进程交互,还依赖一些其它的库包。在docker里再安装docker包的目的就是为了给docker提供一个完整的运行环境。
备注: 试验用的docker版本是17.03.2-ce,安装了docker包的容器镜像比没安装的镜像大小会多出100M。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145782.html原文链接:https://javaforall.cn
相关文章
- Docker常用命令的原理与简单实战
- docker容器端口冲突_docker web管理工具
- Docker 进阶指南(上)- 使用Dockerfile自定义镜像
- docker的常用命令汇总_Docker命令
- ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon runn
- linux中lamp架构搭建_docker搭建redis集群
- docker离线安装并导入镜像「建议收藏」
- 【已解决】Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon runnin
- Docker服务的停止命令(systemctl stop docker)
- Docker服务的搜索镜像命令(docker search 镜像名称)
- 「 【Docker】用docker运行2048小游戏(玩转docker) 」
- 【Docker 系列】docker 学习 一,Docker的安装使用及Docker的基本工作原理
- 【Docker 系列】docker 学习 三
- 【Docker 系列】docker 学习十一,docker 总结和面试题整理
- 【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践
- docker 运行时执行bash详解程序员
- 热点解读:Docker官方进军中国
- 硬核观察 #301 加密货币矿工滥用迫使 Docker Hub 取消免费构建服务
- 的docker容器创建并使用Docker容器启动Redis数据库(创建并启动名为redis)