关于docker中执行docker命令的实践

关于docker中执行docker命令的实践最近在制作给kubernetesjenkinsplugin调用的jenkinsslave(默认情况下,kubernetesjenkins插件使用的是jenkinsci/jnlp-slave)容器镜像,以供自动创建的pod使用。对这个镜像的需求是:希望在pod运行的容器内,执行docker命令,完成dockerbuild,push等一些操作,即dockerindocker。首先,需要在

大家好,又见面了,我是你们的朋友全栈君。

最近在制作给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。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145782.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • docker启动MySQL报错

    docker启动MySQL报错一.问题描述今天用docker拉取了MySQL镜像,但是启动的时候遇到了问题。error:databaseisuninitializedandpasswordoptionisnotspecifiedYouneedtospecifyoneofMYSQL_ROOT_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORDandMYSQL_RANDOM_ROOT_PASSWORD二.解决由于没有找到其他帖子上在图形化界面上操作的修改,因此我们选

  • centos7.4安装docker_centos docker安装部署

    centos7.4安装docker_centos docker安装部署前言当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip:commandno

  • docker安装Lefse和分析流程[通俗易懂]

    docker安装Lefse和分析流程[通俗易懂]linux通过docker安装lefse默认你已经安装好docker!下载lefse镜像文件dockerrun-itbiobakery/lefsebash启动docker的lefse镜像,并且把主机文件夹挂载到镜像,这样可以在镜像中看到主机中的文件夹,下面是吧主机中的Data文件夹挂在到镜像(shared文件夹需要自己建),更改Data权限shared权限也会改变…

  • docker-compose 集群_基于hadoop的集群搭建

    docker-compose 集群_基于hadoop的集群搭建前言实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有

  • docker nginx+php(docker nginx反向代理)

    一、docker安装:将微信公众号项目运行绑定至80端口(微信服务器只能和外部开通了80端口的服务器之间通信)docker一次构建可放在任何地方就可以运行,不需要进行任何改变DocKer就类似于一个容器。这个容器就好像咱们常用的虚拟机一样,当我们虚拟机里面安装过VS、SQL、浏览器……之后咱们就把虚拟机镜像备份下来、等到下一次需要重新搭一个环境的时候,就可以省去很多事情了,直接…

  • docker一键启动、关闭、删除命令

    docker一键启动、关闭、删除命令

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号