Docker In Docker

news2024/11/27 8:37:58

Docker in Docker

适用场景

​ 在 CI 中,通常会有一个 CI Engine 负责解析流程,控制整个构建过程,而将真正的构建交给 Agent 去完成。例如,Jenkins 、GitLab 均是如此

在这里插入图片描述

同时 Agent 是动态的,构建时才需要,构建完成时即销毁。CI 非常适合实践容器、Serverless 等技术,因此在生产过程中 Agent 经常是容器化的

Docker in Docker ,以下简称 DinD

在这里插入图片描述

  • 如上图,可以在 Container 中直接运行一个 Docker Daemon ,然后使用 Container 中的 Docker CLI 工具操作容器。

  • 这种方式下,容器中的 Docker Daemon 完全独立于外部,具有良好的隔离特性。看起来,Container 类似一个 VM ,但 DinD 的作者自己也不是很推荐。主要原因还是安全问题。DinD 需要以特权模式启动,这种嵌套会带来潜在的安全风险。这种方式下,响应命令的容器嵌套于使用 docker 命令的容器

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

宿主机的docker.sock

  • /var/run/docker.sock是默认的Unix套接字。套接字用于在同一主机上的进程之间进行通信。 Docker守护程序默认情况下侦听docker.sock。 如果您在运行Docker守护程序的主机上,则可以使用/var/run/docker.sock管理容器

  • 通过类似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"

  • 如果您的容器可以访问docker.sock,则意味着它具有对docker守护程序的更多特权。因此,在实际项目中使用时,请了解并使用安全隐患。 因为容器的docker可以访问并删除宿主机的所有镜像

方式1:挂载主机上的docker.sock以及docker二进制文件

docker run -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(which docker):/usr/bin/docker \
  centos docker version

方式2:挂载主机docker.sock并在容器中安装docker客户端

[root@k8s-master-1 ~]# docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker centos:centos7 /bin/bash
[root@f3cd8d37aa6c /]# curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@f3cd8d37aa6c /]# yum install -y docker-ce-cli
[root@f3cd8d37aa6c /]# docker ps
CONTAINER ID   IMAGE                                               COMMAND                  CREATED          STATUS          PORTS     NAMES
d4aee13cdbda   0623d6874ffb                                        "/coredns -conf /etc…"   22 minutes ago   Up 22 minutes             k8s_coredns_coredns-85b5646f88-4lmkv_kube-system_d19c99e3-fe1f-4202-8e5e-6fede07c9363_1
3e0435b049be   registry.aliyuncs.com/google_containers/pause:3.8   "/pause"                 22 minutes ago   Up 22 minutes             k8s_POD_coredns-85b5646f88-4lmkv_kube-system_d19c99e3-fe1f-4202-8e5e-6fede07c9363_11
ab5e7d06f9ed   37c457685cef                                        "/opt/bin/flanneld -…"   22 minutes ago   Up 22 minutes             k8s_kube-flannel_kube-flannel-ds-csxnw_kube-flannel_f3c2439a-d99b-4193-af55-c20da2444ddc_1
2572eba4255f   registry.aliyuncs.com/google_containers/pause:3.8   "/pause"                 22 minutes ago   Up 22 minutes             k8s_POD_kube-flannel-ds-csxnw_kube-flannel_f3c2439a-d99b-4193-af55-c20da2444ddc_1
3f91f321d5f3   68cb0c05b3f2                                        "/bin/node_exporter …"   22 minutes ago   Up 22 minutes             k8s_node-exporter_monitor-prometheus-node-exporter-psppj_monitor_475de9d4-ee2a-426f-8673-2e020d5beab4_1
bfec55401ebb   registry.aliyuncs.com/google_containers/pause:3.8   "/pause"                 22 minutes ago   Up 22 minutes             k8s_POD_monitor-prometheus-node-exporter-psppj_monitor_475de9d4-ee2a-426f-8673-2e020d5beab4_1

方式3:使用官方docker客户端

[root@k8s-master-1 ~]# docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker docker ps
CONTAINER ID   IMAGE                                               COMMAND                  CREATED                  STATUS                  PORTS     NAMES
4bfabf7e08b8   docker                                              "docker-entrypoint.s…"   Less than a second ago   Up Less than a second             sweet_archimedes
d4aee13cdbda   0623d6874ffb                                        "/coredns -conf /etc…"   24 minutes ago           Up 24 minutes                     k8s_coredns_coredns-85b5646f88-4lmkv_kube-system_d19c99e3-fe1f-4202-8e5e-6fede07c9363_1
3e0435b049be   registry.aliyuncs.com/google_containers/pause:3.8   "/pause"                 24 minutes ago           Up 24 minutes                     k8s_POD_coredns-85b5646f88-4lmkv_kube-system_d19c99e3-fe1f-4202-8e5e-6fede07c9363_11
ab5e7d06f9ed   37c457685cef                                        "/opt/bin/flanneld -…"   24 minutes ago           Up 24 minutes                     k8s_kube-flannel_kube-flannel-ds-csxnw_kube-flannel_f3c2439a-d99b-4193-af55-c20da2444ddc_1
2572eba4255f   registry.aliyuncs.com/google_containers/pause:3.8   "/pause"                 24 minutes ago           Up 24 minutes                     k8s_POD_kube-flannel-ds-csxnw_kube-flannel_f3c2439a-d99b-4193-af55-c20da2444ddc_1
3f91f321d5f3   68cb0c05b3f2                                        "/bin/node_exporter …"   24 minutes ago           Up 24 minutes                     k8s_node-exporter_monitor-prometheus-node-exporter-psppj_monitor_475de9d4-ee2a-426f-8673-2e020d5beab4_1
bfec55401ebb   registry.aliyuncs.com/google_containers/pause:3.8   "/pause"                 24 minutes ago           Up 24 minutes                     k8s_POD_monitor-prometheus-node-exporter-psppj_monitor_475de9d4-ee2a-426f-8673-2e020d5beab4_1

docker:dind

  • 此方法实际上在容器内部创建一个子容器。仅当确实要在容器中包含容器和镜像时才使用此方法。 否则,建议使用第一种方法。为此,只需要使用带有dind标签的官方docker镜像即可

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

  • docker dind方式有所不同,所有的docker操作真正在容器内部进行,包括创建的容器、拉取的镜像都保留在容器内部

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

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

  • docker:latest 只包含docker客户端
  • docker:dind 包含docker客户端和docker引擎
# 运行docker dind容器
[root@k8s-master-1 ~]# docker run --privileged --name docker-dind -d docker:dind
44c5bb4c3a943939b7fbc880ce2e5c27bba76ebca550600bc1a901a3359df876

[root@k8s-master-1 ~]# docker exec -it docker-dind sh
/ # docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376 --tlsverify --tlscacert /certs/server/ca.pem --tlscert /certs/server/cert.pem --tlskey /certs/se
   64 root      0:02 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
  221 root      0:00 sh
  244 root      0:00 ps -ef
  
# dind中运行容器
/ # docker run -it busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
b50100f25006: Pull complete
Digest: sha256:b5d6fe0712636ceb7430189de28819e195e8966372edfc2d9409d79402a0dc16
Status: Downloaded newer image for busybox:latest
/ #
/ # docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES
8a78a61c5e91   busybox   "sh"      25 seconds ago   Exited (0) 5 seconds ago             funny_feistel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查询淘宝商品历史价格(用Python记录商品每天价格变化)

taobao.item_history_price-获取淘宝天猫历史价格接口 思路: 第一步抓取商品的价格存入 Python 自带的 SQLite 数据库每天定时抓取商品价格使用 pyecharts 模块绘制价格折线图,让低价一目了然 接口说明:通过接口可以拿到整个平台&#xff0…

Tomcat源码:Container接口

参考资料: 《Tomcat - Request请求处理: Container设计》 《Tomcat - Container容器之Engine:StandardEngine》 前文: 《Tomcat源码:启动类Bootstrap与Catalina的加载》 《Tomcat源码:容器的生命周期管理与事件监…

matplotlib绘图看这篇就够了

导入matplotlib第三方库此外,在matplotlib中我们可以只输入y轴,即为只输入一个数组我们也可以输出,x不为必要条件。而且也可以使用plt.xticks()函数进行设置x轴的label。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Si…

注意力机制中Q和K相乘的意义是什么?为什么Q和K相乘就可以得到它们之间的相似性/权重矩阵呢?

为什么query和key相乘就能得到学生和教师的相似度呢?它的内部原理是什么? 在注意力机制中,query 和 key 相乘得到的相似度其实是通过计算两个向量之间的点积来实现的。具体而言,我们将 query 和 key 进行点积运算后【这里的点积运算可以看作…

从C出发 23 --- 函数专题练习

A:我们可以将 main 理解为操作系统调用的函数,操作系统运行一个应用程序时,就去调用这个应用程序里面的main函数 B: 函数中只能定义变量,定义的变量叫局部变量 C: 从操作系统的角度来看 C 并不一定正确,因为从技术角…

Cadence OrCAD Capture 层次化电路设计展开的方法

🏡《总目录》   🏡《宝典目录》   🏡《上级目录》 目录1,概述2,展开方法3,总结B站关注“硬小二”浏览更多演示视频 1,概述 典型的层次化设计是指顶层模块中,调用1个电路模块超过…

Java中的并发容器

Java 中的 并发容器 1.List 类 list类 线程安全的主要有 Vector 与 CopyOnWriteArrayList a). Vector Vector 相当于在 原有 ArrayList类的基础上将所有方法 变成同步方法 同样的操作还有 Collections.synchronizedList() 方法,将原有Lis…

自训练Self-Training学习总结

一、自训练(Self-training) Self-training是最简单的半监督方法之一,其主要思想是找到一种方法,用未标记的数据集来扩充已标记的数据集。算法流程如下: 首先,利用已标记的数据来训练一个好的模型&#xf…

ch04-损失优化

ch04-损失优化0.引言1.权值初始化1.1. 梯度消失与爆炸1.2. Xavier 初始化1.3. Kaiming 初始化1.4. 常用的权值始化方法1.5. nn.init.calculate_gain1.6. 总结2.损失函数 (一)2.1. 损失函数的概念2.2. 交叉熵损失函数 nn.CrossEntropyLoss2.3. NLL/BCE/BCEWithLogits Loss2.4. 总…

什么原因导致了儿童自闭症?跟父母养育有关吗?

导致儿童自闭症的原因是什么?这和父母的抚养有关吗?学习教育孩子的方法,让孩子快乐健康地成长,是家庭和孩子生活中的一件重要事情。不良的环境和错误的教育会导致儿童自闭症,这是真的吗?自闭症,…

1、vscode搭建C++开发环境及一些配置文件的含义

文章目录一、vscode搭建开发环境1、下载和配置MinGW-w64 编译器套件2、安装到电脑中3、配置环境变量4、测试是否安装成功5、vscode上安装C/C插件二 、配置编译环境时各个文件的含义1、task.json:此文件告诉VS代码如何构建(编译)程序&#xff…

如何利用 IP 归属地查询 API 精准锁定用户位置

引言 在互联网时代,IP 地址扮演着非常重要的角色,它可以帮助我们追踪网站访问者、优化网络服务等等。而 IP 归属地则更进一步,它可以帮助我们精确地定位 IP 地址所在的地理位置,为数据分析、网络安全、市场调研等领域提供了极大的…

「业务架构」需求工程——需求验证(第4部分)

确保规定要求满足客户需求的过程。需求验证它是一个确保特定需求满足客户需求的过程。它关心的是找到需求中的问题。当这些问题在后期发现时,或者在系统投入使用后,这些问题会导致大量的返工成本。通过系统变更来修复需求问题的成本通常比修复设计或代码…

如何选择 O2OA (翱途) 开发平台的部署架构?

O2OA (翱途) 开发平台 [下称 O2OA 开发平台或者 O2OA] 支持公有云,私有云和混合云部署,也支持复杂的网络结构下的分布式部署。本篇主要介绍 O2OA (翱途) 开发平台支持的部署环境以及常用的集群部署架构。 软硬件环境说明 支持的云化平台: …

微信小程序-组件化

微信小程序-组件化 自定义组件 业务描述:代码中有多处需要引用同一段代码,需要把他封装成一个组件 流程 在根目录创建components用于存放通用组件在创建组件文件夹选择新建components 会自动生成4个文件json文件 会出现"component": true,…

Talk预告 | 浙江大学乔硕斐:语言模型提示推理综述

本期为TechBeat人工智能社区第480期线上Talk! 北京时间3月9日(周四)20:00,浙江大学计算机科学与技术硕士——乔硕斐的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “语言模型提示推理综述 ”,届时将分享对语言…

知识点学习登记备份信息

知识点记录 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ovilnIi-1681441105895)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211228090433836.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上…

计算机网络 实验三

⭐计网实验专栏,欢迎订阅与关注! ★观前提示:本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。 一、实验目的 理解路由器转发分组的机制。 理解路由表的作用、基本结构。 掌握静态路…

Redis常见命令

Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型:1. Redis通用命令 通用指令是部分数据类型的,都可以使用的指令,常见的有: - KEYS:查看符合模板的所有key- KEYS…

cm-14.1 Android系统启动过程分析(2)- init进程的启动之前的那些事(偏嵌入式方向)

声明 前阶段在项目中涉及到了Android系统定制任务,Android系统定制前提要知道Android系统是如何启动的。本文参考了一些书籍的若干章节本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客:如何下载Nexus5的LineageOS14.1(cm-14.1)系统源码并编译…