Docker in 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会在宿主机操作系统分配文件、网络等资源。
默认情况下,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提供了扩展。
- 原文: Docker In Docker
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Helm 架构 - 每天5分钟玩转 Docker 容器技术(161)
在实践之前,我们先来看看 Helm 的架构。 Helm 有两个重要的概念:chart 和 release。 chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。 release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。 Helm 是包管理工具,这里的包就是指的 chart。Helm 能够: 从零创建新 chart。 与存储 chart 的仓库交互,拉取、保存和更新 chart。 在 Kubernetes 集群中安装和卸载 release。 更新、回滚和测试 release。 Helm 包含两个组件:Helm 客户端 和 Tiller 服务器。 Helm 客户端是终端用户使用的命令行工具,用户可以: 在本地开发 chart。 管理 chart 仓库。 与 Ti...
- 下一篇
部署 Helm - 每天5分钟玩转 Docker 容器技术(162)
本节我们将安装和部署 Helm 客户端和 Tiller 服务器。 Helm 客户端 通常,我们将 Helm 客户端安装在能够执行kubectl命令的节点上,只需要下面一条命令: curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash 执行helm version验证。 目前只能查看到客户端的版本,服务器还没有安装。 helm 有很多子命令和参数,为了提高使用命令行的效率,通常建议安装 helm 的 bash 命令补全脚本,方法如下: helm completion bash > .helmrcecho "source .helmrc" >> .bashrc 重新登录后就可以通过Tab键补全 helm 子命令和参数了。 Tiller 服务器 Tiller 服务器安装非常简单,只需要执行helm init: Tiller 本身也是作为容器化应用运行在 Kubernetes Cluster 中的: 可以看到 Tiller 的 Service、Deployment 和 P...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装Nodejs环境