在docker容器内操作docker的实现方法,docker in docker的实现
在docker容器内操作docker的实现方法最近在学习Jenkins的时候遇到的一个问题,我在使用Jenkins对微服务项目持续集成的时候,我要将所有的微服务工程都制作为一个一个的镜像,那么肯定需要用到dockerbuild 命令,而我的Jenkins不是直接在虚拟机上安装的,而是通过docker容器安装的,那么这样就存在一个问题,就是我的Jenkins容器内部没有Docker的环境,果然,在构
在docker容器内操作docker的实现方法
最近在学习Jenkins的时候遇到的一个问题,我在使用Jenkins对微服务项目持续集成的时候,我要将所有的微服务工程都制作为一个一个的镜像,那么肯定需要用到 docker build 命令,而我的Jenkins不是直接在虚拟机上安装的,而是通过docker容器安装的,那么这样就存在一个问题,就是我的Jenkins容器内部没有Docker的环境,果然,在构建镜像的时候报错了。那么要如何解决这个问题呢?
一、问题背景
针对上面的问题,最开始的想法是在Jenkins容器内部在安装一个docker,但是这样的话也天臃肿了,还得在jenkins这个镜像的基础上再去构建一个镜像,太过麻烦。
还有一个办法,那就是通过卷挂载的方式,可以实现在容器内部来操作宿主机的Docker!
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker
二、实例演示
# 查看现有的镜像
[root@pihao ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 2eb5a120304e 2 weeks ago 647MB
# 运行一个tomcat容器
[root@pihao ~]# docker run -d -p 9090:8080 --name tomcat01 tomcat
a0302e6bbe77db81df4a64453e61a6dec7d80ed26e48b85f88f2701c268f3f84
# 进入容器内容命令
[root@pihao ~]# docker exec -it tomcat01 /bin/bash
root@a0302e6bbe77:/usr/local/tomcat# docker ps
bash: docker: command not found # 使用docker的命令,发现不能操作宿主机的docker
root@a0302e6bbe77:/usr/local/tomcat#
使用卷挂载的方式运行容器
关键点是: 将宿主机 docker.sock 文件挂载到容器内部,实现容器内操作宿主机 docker 的目的
# 查看现有镜像
[root@pihao ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 2eb5a120304e 2 weeks ago 647MB
# -v 将宿主机的docker文件挂载到tomcat容器内部
[root@pihao ~]# docker run -d -p 9091:8080 --name tomcat02 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker tomcat
2e780a78cb885dda8e4915b16c028dc8e9023da30d3c9056469ab51b9c64d201
# 进入容器内部
[root@pihao ~]# docker exec -it tomcat02 /bin/bash
# 在容器内部使用docker命令,ok
root@2e780a78cb88:/usr/local/tomcat# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e780a78cb88 tomcat "catalina.sh run" 34 seconds ago Up 32 seconds 0.0.0.0:9091->8080/tcp tomcat02
a0302e6bbe77 tomcat "catalina.sh run" 8 minutes ago Up 8 minutes 0.0.0.0:9090->8080/tcp tomcat01
root@2e780a78cb88:/usr/local/tomcat#
三、扩展
如果原来的容器已经在运行的话,那么现在要添加新的卷挂载,没有必要将原来的容器删除,通过docker commit 命令将正在运行的容器提交为一个新的镜像,然后在这个新镜像的基础上再去重新挂载,注意之前挂载的目录也要添加上!
小结:docker in docker ,这就是docker的嵌套技术。
本文参考来源 https://blog.csdn.net/shida_csdn/article/details/79812817
更多推荐
所有评论(0)