在docker容器中调⽤和执⾏宿主机的docker操作docker进入容器
⾸先这个帖⼦,献给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] []
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标志将容器的根⽂件系统挂载为只读禁⽌写⼊容器的指定卷以外的位置。
以上这篇在docker容器中调⽤和执⾏宿主机的docker操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论