Docker in Docker(DinD)原理与实战

🐇明明跟你说过:个人主页

🏅个人专栏:《Docker幻想曲:从零开始,征服容器宇宙》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言 

1、Docker简介

2、Docker in Docker(DinD)的概念

二、Docker基础

1、Docker容器技术的基本原理

2、Docker镜像、容器与仓库的概念与关系

三、Docker in Docker(DinD)原理

1、DinD的定义与目的 

2、DinD的工作原理:嵌套虚拟化与容器内运行Docker守护进程

3、DinD的优势

四、DinD实践

1、宿主机的Docker安装与配置 

2、编写Dockerfile

3、运行Docker容器

4、在Docker容器内运行一个新Docker容器 

5、访问测试 


一、引言 

1、Docker简介

Docker是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖项打包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上。Docker的核心功能包括快速迭代应用程序、简化开发生命周期、提高应用程序的可移植性、易于构建和协作等。

Docker容器的启动速度非常快,通常只需要几秒钟,这对于快速开发和部署应用程序非常有利。同时,Docker还提供了轻量级的虚拟化,使得容器可以在任何机器上运行,无需担心操作系统的差异和依赖项的问题。

Docker的架构包括Docker客户端、Docker守护进程、Docker镜像和Docker容器等组成部分。Docker客户端是用户与Docker进行交互的接口,Docker守护进程则是Docker的核心组件,负责管理和运行容器。Docker镜像是应用程序及其依赖项的打包文件,而Docker容器则是镜像的运行实例。

Docker的应用范围非常广泛,包括快速搭建开发环境、将运行环境和配置放在代码中并部署、使用docker-compose来模拟生产环境、进行自动测试以及使用Docker镜像进行自我部署等。Docker的轻量级特性和可移植性使得它成为云原生开发和持续集成/持续部署(CI/CD)的理想选择。

2、Docker in Docker(DinD)的概念

Docker in Docker(简称DinD)是一种容器化技术,它指的是在一个Docker容器内部运行另一个Docker实例。具体来说,这种技术允许在一个Docker容器中安装Docker引擎,并通过将宿主机上的Docker套接字(socket)挂载到这个容器中,使得在容器中运行的Docker可以与宿主机上的Docker进行通信。这样,DinD容器就具备了和宿主机一样的Docker环境,可以创建、启动、停止和管理其他Docker容器。

二、Docker基础

1、Docker容器技术的基本原理

Docker容器技术的基本原理涉及到几个核心概念,包括容器、镜像、命名空间、控制组等。

以下是Docker容器技术的基本原理:

  1. 容器:容器是一个独立、轻量级的运行环境,它包含了应用程序及其依赖项。容器提供了一种虚拟化的解决方案,可以将应用程序和其依赖项打包到一个可移植的单元中,并在任何环境中运行,而不需要进行额外的配置。
  2. 镜像:镜像是一个只读的模板,用于创建容器。镜像包含了运行应用程序所需的所有文件和依赖项,包括代码、运行时、系统工具、库等。用户可以基于现有的镜像构建自定义镜像,并在其上添加额外的功能或配置。
  3. 命名空间:命名空间是Linux内核提供的一种机制,用于隔离进程间的资源。Docker利用命名空间来为每个容器提供独立的运行环境,包括文件系统、网络、进程等。这样,每个容器都可以运行在独立的命名空间中,互不干扰。
  4. 控制组:控制组(cgroups)是Linux内核提供的另一种机制,用于限制和管理进程的资源使用。Docker利用控制组来为每个容器分配和管理资源,包括CPU、内存、磁盘等。这样,可以确保容器之间的资源互相隔离,防止资源争用和崩溃。
  5. Docker引擎:Docker引擎是一个开源的容器运行时,负责创建、管理和运行Docker容器。它包括了Docker守护进程(Docker daemon)和Docker客户端(Docker client)。Docker守护进程负责管理容器的生命周期,包括创建、启动、停止和删除容器,而Docker客户端则用于与守护进程进行通信,并发送命令来管理容器。

总的来说,Docker容器技术的基本原理涉及到利用Linux内核提供的命名空间和控制组机制,通过镜像来创建容器,并使用Docker引擎来管理容器的生命周期。这种技术提供了一种轻量级、便捷和可移植的方式来构建、交付和运行应用程序。

2、Docker镜像、容器与仓库的概念与关系

Docker镜像、容器和仓库是Docker中的三个核心概念,它们之间有着密切的关系,但又各自承担不同的角色。

以下是它们的概念和关系:

1. Docker镜像:

  • 镜像是Docker容器的基础。它是一个只读的模板,包含了运行容器所需的所有文件和依赖项,如代码、运行时、系统工具、库等。
  • 镜像是一个静态的文件,一旦创建就不会被修改。如果需要对镜像进行修改,通常是通过在其基础上创建新的镜像,而不是直接修改现有的镜像。
  • Docker镜像是由Dockerfile定义的,Dockerfile是一个文本文件,包含了一系列指令,用于描述如何构建镜像。

 

2. Docker容器:

  • 容器是由Docker镜像创建的运行实例。它是一个独立、轻量级的运行环境,包含了镜像中的文件和依赖项,并且可以独立运行在一个隔离的环境中。
  • 容器是一个动态的实体,可以创建、启动、停止、删除等操作。每个容器都有自己的文件系统、网络、进程等资源,与宿主系统和其他容器隔离开来。

 

3. Docker仓库:

  • 仓库是用于存储和共享Docker镜像的地方。它可以是公共的或私有的,可以托管在本地服务器或云端。
  • Docker Hub是一个广为人知的公共Docker仓库,其中包含了大量的官方和社区维护的镜像,用户可以在其中查找、下载和分享镜像。
  • 除了Docker Hub之外,还可以通过搭建私有仓库来管理和共享自己的镜像,如Docker Registry和Harbor等。

 

关系:

  • Docker镜像是容器的基础,每个容器都是基于一个镜像创建的。
  • Docker仓库用于存储和共享Docker镜像,用户可以从仓库中获取镜像,并将自己的镜像推送到仓库中供他人使用。
  • 在使用Docker时,通常会从仓库中获取镜像,然后基于这些镜像创建容器运行应用程序。

 

三、Docker in Docker(DinD)原理

1、DinD的定义与目的 

定义:

  • DinD(Docker in Docker)是一种在Docker容器内部运行另一个Docker守护进程和客户端的技术。它的主要目的是在容器化的环境中进一步封装和复用Docker操作,为开发、测试和部署等环节提供便利。
  • DinD通过在一个Docker容器中安装Docker引擎,并挂载宿主机上的Docker套接字(socket),使得在容器中运行的Docker客户端可以与宿主机上的Docker守护进程进行通信。这样,DinD容器就具备了和宿主机一样的Docker环境,可以创建、启动、停止和管理其他Docker容器。

 

目的:

  • DinD的主要应用场景包括在持续集成/持续部署(CI/CD)管道中构建和测试Docker镜像,以及在开发环境中模拟生产环境进行应用程序的部署和测试。通过使用DinD,开发者可以在一个隔离的环境中构建和测试Docker镜像,而无需担心对宿主机或其他容器的影响。

   

2、DinD的工作原理:嵌套虚拟化与容器内运行Docker守护进程

DinD(Docker in Docker)的工作原理基于嵌套虚拟化和在容器内运行Docker守护进程两个核心概念。

嵌套虚拟化:

  • 嵌套虚拟化允许在一个虚拟机内部运行另一个虚拟机。在Docker的上下文中,这意味着在一个Docker容器内部运行另一个Docker守护进程,从而模拟出一个完整的Docker环境。嵌套虚拟化在Docker中通过特权模式(privileged mode)和Docker守护进程的嵌套运行来实现。
  • 特权模式使得Docker容器能够以几乎等同于宿主机的能力运行,从而可以访问到宿主机上的硬件资源,包括CPU、内存、磁盘和网络设备等。这为在容器内部运行另一个Docker守护进程提供了必要的权限。

 

容器内运行Docker守护进程:

  • 在DinD配置中,一个特殊的Docker容器(通常使用Docker官方提供的dind镜像)被创建并运行。这个容器内部不仅包含了普通的应用程序,还包含了完整的Docker守护进程(dockerd)。这个Docker守护进程负责管理容器内部的Docker镜像、容器和网络,就像在任何标准的宿主机上运行的Docker一样。
  • 为了实现容器内部Docker守护进程与宿主机Docker守护进程的通信,通常需要将宿主机的Docker套接字(通常位于/var/run/docker.sock)通过挂载(mount)的方式绑定到容器内部。这样,容器内的Docker客户端就可以通过套接字与宿主机上的Docker守护进程进行交互,从而创建、管理其他Docker容器。

 

通过这种方式,DinD在Docker容器内部创建了一个独立的Docker环境,实现了更深层次的容器化技术应用。这使得开发者可以在一个隔离的环境中快速创建、测试和部署应用程序,同时保持与生产环境的一致性。

  

3、DinD的优势

  1. 灵活性:DinD允许在一个Docker容器中创建和管理其他Docker容器,这为开发者提供了一个灵活多变的容器化环境。这种灵活性使得开发者能够快速创建、销毁、配置和管理容器,从而加速开发、测试和部署过程。
  2. 隔离性:每个DinD容器都运行在独立的环境中,彼此之间互不干扰。这种隔离性确保了容器之间的安全性和稳定性,防止了容器之间的相互影响。这对于需要保持环境一致性和稳定性的应用程序来说尤为重要。
  3. 可扩展性:DinD可以根据需要动态创建和销毁容器,从而实现了应用程序的弹性扩展。当负载增加时,可以自动增加容器的数量以应对更高的需求;当负载减少时,可以自动减少容器的数量以节省资源。这种可扩展性使得应用程序能够灵活地适应各种负载情况。
  4. 加速CI/CD流程:在持续集成和持续部署(CI/CD)流程中,DinD可以加快构建和部署的速度。通过预拉取所需的Docker镜像并在容器内部运行Docker守护进程,可以避免在容器启动时需要从远程仓库下载镜像的延迟,从而提高了CI/CD流程的整体效率。
  5. 离线部署能力:在没有网络连接或网络不稳定的情况下,DinD可以保证应用程序的正常运行并提供稳定的服务。通过提前拉取所需的Docker镜像并在容器内部运行Docker守护进程,即使在没有网络连接的情况下也可以创建和运行容器。这为离线环境中的应用程序部署提供了便利。

   

四、DinD实践

1、宿主机的Docker安装与配置 

在Linux机器上安装Docker。如果还未安装Docker,请参考《在CentOS系统中轻松安装和配置Docker指南》这篇文章

2、编写Dockerfile

[root@localhost ~]# vim Dockerfile 
# 使用一个带有Docker二进制文件的镜像作为基础镜像
FROM docker:20.10.16-dind# 设置一些基本的环境变量,可以根据需要调整
ENV DOCKER_HOST unix:///var/run/docker.sock# 设置工作目录(可选)
WORKDIR /app# 安装额外的工具或复制必要的文件(如有需要)
# RUN apt-get update && apt-get install -y some-tool
# COPY . /app# 设置启动命令,这里示例中仅启动Docker守护进程
# 实际使用时可能需要根据情况调整,比如运行特定的命令或应用
CMD ["dockerd-entrypoint.sh"]

构建Docker镜像

[root@localhost ~]# docker build -t my-dind-image:v1  .

  

查看镜像

[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
my-dind-image   v1        7ee5691859ab   13 minutes ago   312MB

3、运行Docker容器

[root@localhost ~]# docker run -itd --privileged --name my-dind-container -p 80:80  my-dind-image:v1
  • docker run:运行一个新的容器。
  • -itd:这三个选项结合使用表示在后台以交互方式运行容器。-i表示以交互模式运行容器,-t表示为容器分配一个伪终端(pseudo-TTY),-d表示以后台(detached)模式运行容器。
  • --privileged:授予容器内部的进程特权,使其能够执行一些需要特权的操作,例如访问宿主系统的硬件设备。
  • --name my-dind-container:指定容器的名称为 my-dind-container。
  • -p 80:80:将容器的端口80映射到宿主系统的端口80。这个选项可以让容器内的应用程序通过宿主系统的端口80对外提供服务。
  • my-dind-image:v1:要运行的容器镜像的名称和版本号。

4、在Docker容器内运行一个新Docker容器 

进入到刚刚创建的容器内部

[root@localhost ~]# docker exec -it my-dind-container /bin/sh

拉取一个镜像,这里以nginx为例

/app # docker pull nginx

  

运行一个新的Docker容器,使用刚刚拉取的镜像

/app # docker run -itd --name nginx -p 80:80 docker.io/library/nginx:latest

 查看新容器状态

/app # docker ps

  

5、访问测试 

在浏览器输入宿主机IP加80端口,如果能访问到nginx,则Docker inDocker成功

  

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Docker的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

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

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

相关文章

使用 AI Assistant for Observability 和组织的运行手册增强 SRE 故障排除

作者:Almudena Sanz Oliv, Katrin Freihofner, Tom Grabowski 通过本指南,你的 SRE 团队可以实现增强的警报修复和事件管理。 可观测性 AI 助手可帮助用户使用自然语言界面探索和分析可观测性数据,利用自动函数调用来请求、分析和可视化数据…

windows系统安装Ubuntu子系统

安装前先在 控制面板 中打开 程序与功能选项 ,点击 启用或关闭Windows功能: 勾选 适用于 Linux的Windows子系统 和 虚拟机平台 、 Hyper-v 。 重启电脑后再 Microsoft Store Windows应用商店 中下载合适的Ubuntu版本。 运行Ubuntu程序,如出现…

【实战】算法思路总结

面试过程中,总是被拷打,信心都要没了。但是也慢慢摸索出一些思路,希望对大家有帮助。 (需要多用一下ACM模式,力扣模式提供好了模板,自己在IDEA里面写的话,还是会有些陌生) 0、基本…

Unity Editor 找物体助手

找啊找朋友~ 🍱功能介绍🥙使用方法 🍱功能介绍 💡输入相关字符串,它会帮你找到名称中带有该字符串的所有物体,还会找包含该字符串的Text、TextMeshProUGUI。 🥙使用方法 💡导入插…

小学拼音弄一下

import re from xpinyin import Pinyindef remove_middle_characters(text):# 仅保留汉字chinese_chars re.findall(r[\u4e00-\u9fff], text)cleaned_text .join(chinese_chars)# 如果字符数为偶数,则在中间添加空格if len(cleaned_text) % 2 0:middle_index le…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第5章 安装SSH

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

从0开始学python(七)

目录 前言 1 break、continue和pass函数 1.1 break 1.2 continue 1.3 pass 2、序列的索引及切片操作 2.1字符串的索引和切片 2.1.1 字符串索引 2.1.2 字符串切片 总结 前言 上一篇文章我们介绍了python中的循环结构,包括for和while的使用。本章接着往下讲。…

腾讯云服务器之ssh远程连接登录及转发映射端口实现内网穿透(实现服务器访问本地电脑端口)

目录 一、创建密钥绑定实例二、设置私钥权限三、ssh远程连接到服务器四、修改root密码五、端口转发(实现服务器访问本地电脑的端口) 一、创建密钥绑定实例 创建密钥会自动下载一个私钥,把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户…

免费剪辑的素材资源网站,超高清、可商用、不限速、无版权,迅速有效的解决您的视频剪辑难题!

在数字媒体时代,高质量的剪辑素材已成为视频制作的核心资源。下面为您推荐的优质视频剪辑素材网站,都提供超高清、无限速、无版权、可商用的素材,这些网站将大大提升您的视频制作效率和质量 01. 蛙学府 实用性:★★★★☆ 丰富性&…

记一些CISP-PTE题目解析

0x01 命令执行 直接payload: 127.0.0.1 & whoami,发现可以成功执行whoami命令 然后ls …/ ,发现有个key.php文件 尝试用cat命令查看 发现不行被拦截了。(其实题目过滤了常用的查看文件的命令 ) 这里有两种思路,第…

关于一致性,你该知道的事儿(下)

关于一致性,你该知道的事儿(下) 前言一、并发修改单个对象1.1 原子写操作1.2 显示加锁1.3 原子的TestAndSet1.4 版本号机制 二、 多个相关对象的一致性2.1 最大努力实现2.2 2PC && TCCC2.3.基于可靠消息的一致性方案2.4.Saga事务 三、…

HNCTF-PWN

1.ez_pwn 直接看危险函数,不能溢出,只能覆盖ebp。 后面紧接的又是leave,ret 很明显是栈迁移,通过printf打印出ebp,通过偏移计算出栈地址。 通过gdb调试,偏移是0x38 以下是payload: from pwn import * #i…

【自然语言处理】【大模型】DeepSeek-V2论文解析

论文地址:https://arxiv.org/pdf/2405.04434 相关博客 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58:1bit LLM时代 【自然语言处理】【长文本…

11.偏向锁原理及其实战

文章目录 偏向锁原理及其实战1.偏向锁原理2.偏向锁案例代码演示2.1.偏向锁案例代码2.2.1.无锁情况下状态2.1.2.偏向锁状态2.1.3.释放锁后的状态 2.2.偏向锁的膨胀和撤销2.2.1.偏向锁撤销的条件2.2.2.偏向锁的撤销 2.2.3.偏向锁的膨胀 2.3.全局安全点原理和偏向锁撤销性能问题2.…

EPAI手绘建模APP工程图顶部工具栏

7、工程图 图 302 工程图 工程图包括顶部常用工具栏、右侧工程图工具栏、左侧模型列表栏、中间的工程图。 (1) 常用工具栏 ① 删除,选中场景中工程图元素后,删除。可以选择多个工程图元素同时删除。 ② 设置,打开工程图设置页面&#xff0…

2024 年最新本地、云服务器安装部署 miniconda 环境详细教程(更新中)

Anaconda 概述 Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方便…

picoCTF-Web Exploitation-More SQLi

Description Can you find the flag on this website. Additional details will be available after launching your challenge instance. Hints SQLiLite 先随便输入个账号密码登录一下,得到查询SQL,接下来应该对SQL进行某些攻击来绕过密码登录成功 -- …

微信小程序踩坑,skyline模式下,简易双向绑定无效

工具版本 基础库版本 Skline模式 页面json设置 问题描述 skyline模式下,textarea,input标签设置简易双向绑定 model:value是无效的,关闭skyline模式就正常使用了 截图展示 这里只展示了textarea标签,input标签的简易双向绑定也是无效的 总结 我在文档里面是没找到skyline里面不…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机: 二.买卖股票的最佳时机含冷冻期: 三.买卖股票的最佳时期含⼿续费: 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍:动态规划买卖股票的最佳时机是一个经典的…

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用,然后启动应用,注意启动docker引擎 打开右上角的设置,进入Docker Engine设…