docker in docker的使用场景

docker in docker的原理

真正的docker in docker的原理还是比较简单的,可以参考wrapdocker源码,其实就是挂载cgroup、tmpfs、securityfs、cgroup的SUBSYS、关掉不需要的文件描述符、最后启动dockerd。wrapdocker源码里注释写得比较清楚。

场景 :

(1) 当宿主主机上跑动的几个容器A,B,C是平等关系 ,且它们都需要或者可能需要向外暴露端口或者服务时,此时的场景,使用宿主主机已经有的docker服务足矣。

(2) 

如果在dockerA里,有需要用到docker的命令,比如app B需要一个配套的docker应用与之配合,它只需要借用一下宿主主机的docker服务,再创建一个容器即可,其实这个容器挂在宿主主机上,也无所谓。只是将appB

与配套的docker应用看作一套完整的布署在dockerA里的环境即可。 比如 mycat.offline.bin在dockerA里布署 就很方便,会有很多的端口不会占用宿主主机的端口,隐藏在dockerA内;而只暴露了一个redis docker在宿主主机的docker环境里。 如下图一;对应本文的“移花接木”法。

(3) 如下图二。 如果类似 ics.bin这样的应用,它需要在dockerA里创建很多的docker容器环境 ,如果还采用(2)的模式,就与直接在宿主主机没有区别了,占有了主机的诸多端口及docker 环境(image,容器实例),污染了主机的环境,这个环境里诸多的kafak redis等端口与服务 ,都不需要让外界知道,只需要暴露必须的 8899 , 50000等即可,这样就要用到真正的docker in docker ,即dind了。 

在容器内部使用宿主机的 docker(移花接木)

https://www.cnblogs.com/kirito-c/p/11357522.html

https://www.jianshu.com/p/43ffba076bc9

原理:

默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。
sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。

因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了

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

必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock 的用户)然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。

docker run -itd --name cent4 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -p 18080:8080 --user root centos:7

dind 模式

https://hub.docker.com/_/docker

而此模式下,试验后发现宿主系统要是centos7比较好, centos8以上,好像有问题。 具体参考官网说明 

https://blog.csdn.net/networken/article/details/108218569

docker in docker的原理是挂载cgroup、tmpfs、securityfs、cgroup的SUBSYS、关掉不需要的文件描述符、最后启动dockerd。

官方提供了2种类型的docker in docker镜像

  • docker:latest 只包含docker客户端
  • docker:dind 包含docker客户端和docker引擎

参考文章:

https://blog.csdn.net/freewebsys/article/details/79756488

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

猜你喜欢

转载自blog.csdn.net/dualvencsdn/article/details/112625050