在docker容器中调用和执行宿主机的docker操作
作者:catoop 发布时间:2021-04-08 10:20:27
首先这个帖子,献给docker新手。当然如果你是一个老手,文中分割线后的操作方法也是一种思路。
首先说一下,如何在docker中执行宿主机的docker操作,我们管它叫docker in docker。
至于为什么要在docker中操作宿主机的docker,优点不言而喻,你既可以将你的具体需求容器化部署,又不用直接在宿主机上安装(假设我们没有办法在docker中操作宿主机的docker,那么我们只能将这样的软件程序直接安装到宿主机上,这样显然是不利于管理和维护的)。
实现这种需求,其实非常简单,你只需要将docker宿主机的docker文件和docker.sock文件挂载到容器中即可,具体为:
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker
你要先找到你宿主机的docker和docker.sock位置,别挂载错了,标准的Linux正常来说就是上面的位置。
你在启动docker容器的时候,将上述两个文件正常挂载后,就可以在docker中执行诸如 docker images 等等这样的命令了。
如果出现问题 permission denied
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
…………………………………………………………
dial unix /var/run/docker.sock: connect: permission denied
解决方法
在容器所在的宿主机上直接给 docker.sock 777权限,命令 chmod 777 docker.sock
华丽丽的分割线
下面是针对群辉系统,你不用太关心这个系统是什么,总之就是这个系统在docker方面有一些特有的问题,导致你不能这么随心所欲,所以我采用了一种变通的方法来处理(一种思路,抛砖引玉)先叙述一下现状:
该系统提供了docker的UI管理工具,我们在这个工具上可以进行常规的挂载操作,但是如果我们想挂载上面的docker和docker.sock文件,就不行了,先看一下截图:
说一下图上UI操作的局限性!
群辉官方进行了限制,你可以选择的文件,是不可能选择到 /usr/ /va/ 等这样系统层面的文件的,也就是我们无法直接挂载docker和docker.sock文件。
做 ln -s 软连接是否可行?
经尝试,先通过ssh命令行在jenkins文件夹中创建2个软连接(将docker和docker.sock进行软连接),然后回到群辉的UI界面,依然不能选择(因为群辉直接屏蔽了软连接文件,你是看不到的)
那么如何解决呢?
我的方法是(软连接的方法变通一下):
1、在图上的jenkins目录下随便创建2个文件 docker 和 docker.sock 文件(命名正确即可)
2、然后在docker点击“添加文件”按钮,正常选择这2个文件,进行挂载,你完全可以正常挂载并且完成其他配置,配置完毕后,暂时不要启动docker容器。
3、登录ssh进入群辉,将jenkins目录中刚刚创建的2个文件删除掉,然后把docker和docker.sock源文件创建软连接到jenkins中。
root@test:cd /volume1/docker/jenkins/
root@test:rm -rf docker docker.sock
root@test:ln -s /run/docker.sock /volume1/docker/jenkins/docker.sock
root@test:ln -s /usr/local/bin/docker /volume1/docker/jenkins/docker
root@test:/volume1/docker/jenkins# ll
total 8
drwxrwxrwx+ 1 Nuggets users 96 Jun 6 11:22 .
drwxr-xr-x+ 1 root root 188 May 30 19:29 ..
lrwxrwxrwx 1 root root 21 Jun 6 11:22 docker -> /usr/local/bin/docker
lrwxrwxrwx 1 root root 16 Jun 6 11:21 docker.sock -> /run/docker.sock
drwxrwxrwx+ 1 shanhongyu users 24 Jun 1 11:07 java_home
drwxrwxrwx+ 1 Nuggets users 4476 Jun 6 11:00 jenkins_home
drwxrwxrwx+ 1 shanhongyu users 82 Jun 1 11:12 maven_home
4、然后回到群辉UI,启动容器,这样就完美了。
(群辉不让你选软连接,但是linux和docker本质上是可以直接挂载软连接的)
补充知识:使用docker在镜像中运行宿主机程序
docker run命令用于在新容器中运行命令。docker run命令首先在指定的映像上创建一个可写容器层,然后使用指定的命令启动它。
也就是说,docker run相当于API /containers/create 和 /containers/(id)/start。
可以使用docker start重新启动停止的容器,并使用其所有先前的更改完整。 请参阅docker ps -a查看所有容器的列表。
用法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Shell
例子
分配名称并分配伪TTY(-name,-it)
$ docker run --name test -it debian
root@d6c0fe130dba:/# exit 13
$ echo $?
13
$ docker ps -a | grep test
d6c0fe130dba debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test
Shell
此示例使用debian:latest映像运行一个名为test的容器。 -it 指示Docker分配连接到容器的stdin的伪TTY; 在容器中创建一个交互式的bash shell。 在该示例中,bash shell通过输入exit 13退出。该退出代码传递给docker run的调用者,并记录在测试容器的元数据中。
捕获容器ID(-cidfile)
$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
Shell
这将创建一个容器并打印测试到控制台。--cidfile标志使Docker尝试创建一个新文件,并将容器ID写入它。如果文件已经存在,Docker将返回一个错误。 Docker运行退出时,Docker将关闭此文件。
完整的容器功能(-privileged)
$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied
Shell
这将不起作用,因为默认情况下,大多数潜在的危险内核功能被丢弃; 包括cap_sys_admin(这是挂载文件系统所需的)。 但是,--privileged标志将允许它运行:
$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# mount -t tmpfs none /mnt
root@50e3f57e16e6:/# df -h
Filesystem Size Used Avail Use% Mounted on
none 1.9G 0 1.9G 0% /mnt
Shell
设置工作目录[-w]
$ docker run -w /path/to/dir/ -i -t ubuntu pwd
Shell
-w允许在目录中执行命令,这里是/path/to/dir/。 如果路径不存在,则在容器内创建。
为每个容器设置存储驱动程序选项
$ docker run -it --storage-opt size=120G fedora /bin/bash
Shell
挂载tmpfs(-tmpfs)
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
Shell
--tmpfs标志使用rw,noexec,nosuid,size = 65536k选项将一个空tmpfs装载到容器中。
挂载卷(-v,-read-only)
$ docker run -v `pwd`:`pwd` -w `pwd` -i -t ubuntu pwd
Shell
-v标志将当前工作目录装载到容器中。 -w允许在当前工作目录中执行命令,将目录更改为pwd返回的值。所以这个组合使用容器执行命令,但在当前工作目录中。
$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
Shell
当绑定卷的主机目录不存在时,Docker将自动在主机上创建此目录。 在上面的示例中,Docker将在启动容器之前创建/doesnt/exists文件夹。
$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here
Shell
卷可以与--read-only组合使用,以控制容器写入文件的位置。 --read-only标志将容器的根文件系统挂载为只读禁止写入容器的指定卷以外的位置。
来源:https://shanhy.blog.csdn.net/article/details/91042007
猜你喜欢
- 本文介绍的是关于Linux中别名与二进制使用的相关内容,分享出来给大家参考,下面来看看详细的介绍:二进制一般二进制这个名词听上去高深莫测,然
- 今天继续来谈我的Godaddy的VDS使用经验,前两次我们介绍了SSH远程操作命令以及SSH远程修改PHP.ini的方法,不知是否对您有所帮
- 下面我们以大家常用的sina邮箱为例说明如何进行UCenter Home的邮件设置。一、UCenter Home后台设置1、首先要保证您已经
- 阿卡人SEO:多次经验教您脱离百度沙盒今年第一次尝试被百度列入沙盒子的感觉,还好自己没有灰心坚持自己辛苦经营的站。在很短的时间脱离了沙盒。后
- HI,我叫Alvaro Guzman,这是别样wordpress模版的第二部分。在这节课里,将学到如何运用,XHML+CSS来建一个网页。还
- FTP 命令FTP 的主要操作都是基于各种命令基础之上的。常用的命令有:◆ 设置传输模式,它包括ASCⅡ(文本) 和BINARY 二进制模式
- 谷歌与微软在操作系统的正面竞争已经步入倒计时阶段。谷歌产品副总裁Sundar Pichai首次对外透露,谷歌Chrome OS操作系统最大的
- 邀请好友是现今SNS网站必备的利器之一,其中开心网就是网友导入QQ、MSN、E-mail等的好友名单进行邀请,而在短时期内迅速扩张网站会员人
- 适当的搜索引擎优化(seo)能帮助我们的网站在搜索引擎排名中取得好的名次,但是seo要注意一下十点,可能平常您并不会在意的问题。1.确定了错
- UCenter Home是Comsenz公司发布的一款SNS建站系统,目前最新版本是1.5。最近看到很多站长安装好UCenter Home,
- 昨天特意去机房安装64位系统,带了一个250G新硬盘去。为了减少断网的时间,首先把硬盘分好区,把许多数据也拷到一个分区里。我用的是windo
- 下载 CentOS7我下载的镜像是 CentOS-7-x86_64-DVD-1908.iso ,你也可以自由选择,下面是下载链接。CentO
- Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统
- 雅虎首席执行官卡罗尔·巴茨(腾讯科技配图)北京时间11月19日消息,据国外媒体报道,《华尔街日报》专栏作家卡拉·斯韦什尔(Kara Swis
- DEDECMS5.5刚出来,很多人都还没有用,我就先尝试了,(勇于做第一个吃螃蟹的人)呵呵~~,其实做好数据备份也没什么好怕的。正好公司网站
- 分布式文件系统分布式文件系统是Windows系统网络存储构架的核心技术之一,可以实现将网络上位于不同位置的文件挂接在统一命名空间之下。在管理
- “如果不刷信用,谁会来买你的东西?”“当然选刷。”网店信用作
- 一、通过标签删除镜像通过如下两个都可以删除镜像:docker rmi [image]或者:docker image rm [image]支持
- 前言最近住所电不稳定,经常突然之间就断电了,虽然我的是笔记本,但是也不一定能挨到来电,这样下去过不了多久笔记本里的SSD就要挂比 的节奏啊。