1、 docker in docker(dind)

有时需要在容器内执行 docker 命令,比如:在 jenkins 容器内运行 docker 命令执行构建镜像
直接在 docker 容器内嵌套安装 docker 未免太过臃肿
更好的办法是:容器内仅部署 docker 命令行工具(作为客户端),实际执行交由宿主机内的 docker-engine(服务器)

2、 两种方式

在docker容器内启动一个docker daemon,对外提供服务。
每个运行中的容器,都是一个进程,这个进程都托管在docker daemon中。
优点在于镜像和容器都在一个隔离的环境,保持宿主机的环境。

2.1 通过宿主机的docker.sock

通过类似docker run -v /var/run/docker.sock:/var/run/docker.sock(实际上是 Docker outside Docker)的命令将宿主机 docker.sock 文件挂载到容器, 并且直接挂载宿主机的/usr/bin/docker, 这样容器内就不需安装 Docker 程序。
当容器内使用docker命令时,实际上调用的是宿主机的docker daemon和docker命令。
也就是说,容器内实际并未运行 docker server,但是能够通过宿主机执行docker任务,从而实现轻量级 docker in docker
需要特别说明的是,真正执行 docker 命令的是跑在宿主机上的 docker-engine(服务器),因此这并不是真正的 “Docker in Docker”.

2.2 通过docker:dind镜像

先启动一个docker:dind容器A,再启动一个docker容器B,容器B指定host为A容器内的docker daemon。

  • 例子
docker network create jenkins

docker volume create jenkins-docker-certs
docker volume create jenkins-data

docker container run \
  --name jenkins-docker \
  --detach \
  --privileged \
  --network jenkins \
  --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  docker:dind

docker container run \
  --name jenkins-blueocean \
  --detach \
  --network jenkins \
  --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client \
  --env DOCKER_TLS_VERIFY=1 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  --publish 8080:8080 \
  --publish 50000:50000 \
  jenkinsci/blueocean

截图结果为:本地docker版本为18.09.6 ,dind的docker版本为20.10.3
在这里插入图片描述

参考https://www.cnblogs.com/anliven/p/13551614.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐