在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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐