在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


猜你喜欢
- 简单讲一些关键词排名浮动的问题主要是新站,我们要正确的看待关键词排名浮动的问题。1、关键词排名浮动不大的情况:表现为关键词会在1到2.3个页
- Google是我最喜欢的搜索引擎,我被Google的精神而折服,被Google的文化而感染,我可以说是Google的超级粉丝之一了,今天看了
- 本文主要是写给网站月收入1000以下的站长看的,高手们勿笑。我的个人心得也并不一定能帮大家多少忙,欢迎回帖交流,与君共勉。1.增加PV同样是
- 在传统的金秋10月,也都是各大厂商推陈出新的时刻,作为民族软件旗帜的金山软件,旗下应用软件及游戏业务都将有诸多产品问世,其中《飞天风云》、《
- 你是否在计划给网站换一个新的域名?(比如,从www.doumiao.net换成www.doumiao.com)更换域名和更换服务器空间是完全
- 一、Brigde——桥接:默认使用VMnet01、原理:Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中
- 提示需要输入密钥,选择【我没有密钥】选择有桌面体验的自定义新建C盘 100G选择100G的主分区,下一步PS:未分配的空间,先不理,安装完系
- 本文实例讲述了linux文件管理命令。分享给大家供大家参考,具体如下:1、显示文件内容cat : 显示文件内容tac
- 其实SQL注入漏洞并不可怕,知道原理 + 耐心仔细,就可以彻底防范!下面给出4个函数,足够你抵挡一切SQL注入漏洞!读懂代码,你就能融会贯通
- 我们于9月28日再次对域名邮箱做了更新:1. 支持一个QQ绑定5个域名。2. 支持修改管理员帐户名。3. 解除了域名20个字符长度的限制4.
- 各位朋友好,感谢大家对(梧州123网www.wuzhou123.com)上期发表的“30天网站推广实战经验分享(论坛篇)
- Apache mod_rewrite规则重写的标志一览 R[=code](force redirect) 强制外部重定向 强制在替代字符串加
- 一、Windows端操作1. 生成私钥和公钥cmd终端输入:ssh-keygen -t rsa -b 4096一直回车2. 安装remote
- 本文主要是记录一下在apache二级目录上面部署react和vue项目。根目录下面部署很简单,但是在二级目录下就需要在webpack的配置或
- 前言在运维和管理 Linux 服务器的时候,我们最常用的一个命令就是 netstat,我常用这个命令来查看当前服务器上有哪些进程正在侦听端口
- 某某给我写了封邮件,我以前对他的印象不是很深,我比较讨厌女孩进我们群,因为绝大多数都是赝品,并非说是不是真美女的事,而是一种真诚与否的问题,
- 手工为局域网工作站分配IP地址,不但容易造成IP地址冲突现象发生,而且也不利于高效管理网络,特别是在一些规模较大的局域网环境中,这些弊病尤其
- 在我批评地图网站发行量太小,不足以支持广告投放的时候,有人说传统方式的地图本来就作为工具不会被用户经常关注的(只有需要时才查看)。切,传统方
- 阅读上一篇:一个完美网站的101项指标.第二部分.内容为王完美的内容是用来使用的,不管您的内容多么精彩,如果它们很难访问,用户照样会离开,易
- James( Java Apache Mail Enterprise Server )是Apache Jakarta项目的一个子项目,是使用