Docker in Docker

简介: Docker Run Docker?Docker技术目前在DevOps中被广泛使用,我们需要将测试或者构建的代码和自动化脚本打包成Docker镜像,然后部署在各运行环境中。

Docker Run Docker

Docker技术目前在DevOps中被广泛使用,我们需要将测试或者构建的代码和自动化脚本打包成Docker镜像,然后部署在各运行环境中。而在CI/CD中,我们常用一些CI/CD服务器,比如Jenkins和GoCD来构建与部署我们的应用,从而实现CI/CD的自动化。现在一些CI/CD服务器也被Docker化运行在真实的物理机上。于是我们需要在CI/CD服务器的Docker container里面来构建(build)与运行(run)我们的Docker镜像,这就涉及到"Docker run Docker"的问题。

一个很自然的想法是,我们是不是需要在CI/CD服务器镜像中安装一个Docker Daemon和Docker命令呢?但是Docker里面跑Docker总感觉有些蹩脚,额外安装与运行Docker无疑增加了CI/CD服务器镜像的大小,同时还增加Docker的深度。

实际上,我们并不需要在CI/CD服务器上安装Docker。通过如下的命令在CI/CD服务器上运行我们的镜像:

docker run ... -v /var/run/docker.sock:/var/run/docker.sock \

原理:移花接木

Docker采取的是C/S架构,Docker的成功运行需要Docker Daemon和Docker Client(客户端)的支持,当我们运行一些docker build等命令时,实际是需要Docker Client连接Docker Daemon发送命令,Docker Daemon会在宿主机操作系统分配文件、网络等资源。

img_a46fbb3cb35b35735f539bffe1bbb262.png
Docker in Docker

默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker API进行操作。一般情况下,我们访问本机的服务往往通过 127.0.0.1:8080 这种IP:端口的网络地址方式进行通信,而sock文件是 UNIX 域套接字(UNIX domain socket),它可以通过文件系统(而非网络地址)进行寻址和访问的套接字。

从表象上看,上面的命令似乎依然是在“Docker里面run docker”,其实这是个误区。docker run提供了 -v 参数让我们将宿主的文件映射到docker里面。比如通过 -v /var/run/docker.sock:/var/run/docker.sock,我们将宿主的Docker Daemon的socket映射到Docker Container里面;当Container里面的docker 客户端通过 /var/run/docker.sock 去操作Docker Daemon时,这些操作已移花接木地转移到宿主的Docker Daemon上。

延伸:操作远程主机

既然docker client通过socket方式与本地的Docker Daemon进行通信,那么我们可以很自然地想到,如果想在其他主机上通过socket连接到远程DockerDaemon,是不是可以远程操作Docker主机进行镜像的构建与运行呢?答案是可以的,就需要让Docker守护进程监听一个端口,这样才能实现远程通信,同时需要修改docker客户端连接的主机是远程地址而并非本地sock文件。由于Docker C/S 之间采取Rest API作为通信协议,这为我们使用第三方客户端(如postman)操作docker乃至自己开发client提供了扩展。

目录
相关文章
|
开发工具 git
在码云上新建一个仓库,并且使用git上传代码步骤
在码云上新建一个仓库,并且使用git上传代码步骤
1201 0
|
5G 网络虚拟化
解决谷歌硬盘大文件下载不了的问题
解决谷歌硬盘大文件下载不了的问题
1221 0
|
机器学习/深度学习 算法 测试技术
Python中实现多层感知机(MLP)的深度学习模型
Python中实现多层感知机(MLP)的深度学习模型
1129 0
|
10月前
|
存储 人工智能 自然语言处理
无影AgentBay来了!给AI智能体装上“超级大脑”
阿里云在WAIC上发布专为AI Agents打造的“超级大脑”——无影AgentBay。该云端电脑支持多系统切换,集成视觉理解、自然语言控制等多项AI能力,提供高性能算力与企业级安全保障,助力AI开发者高效构建智能应用。
760 1
无影AgentBay来了!给AI智能体装上“超级大脑”
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
618 10
|
小程序 前端开发 测试技术
开发“校园帮”小程序:从构思到上线的完整指南
开发“校园帮”小程序:从构思到上线的完整指南
803 2
|
存储 网络协议 前端开发
这份RoCE、IB和TCP差异对比,没干10年网工,总结不出来。
这份RoCE、IB和TCP差异对比,没干10年网工,总结不出来。
1299 0
|
负载均衡 监控 Java
Java微服务架构设计与实现详解
Java微服务架构设计与实现详解
|
监控 数据可视化 数据挖掘
Go pprof 性能分析工具 - 详细使用图解
Go pprof 性能分析工具 - 详细使用图解
1933 0
Go pprof 性能分析工具 - 详细使用图解
|
Web App开发
ZLMediaKit webrtc RTP包接受与重传
ZLMediaKit webrtc RTP包接受与重传