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.pswp.cn/web/10759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10759.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 AI Assistant for Observability 和組織的運行手冊增強 SRE 故障排除

作者:Almudena Sanz Oliv, Katrin Freihofner, Tom Grabowski 通過本指南,你的 SRE 團隊可以實現增強的警報修復和事件管理。 可觀測性 AI 助手可幫助用戶使用自然語言界面探索和分析可觀測性數據,利用自動函數調用來請求、分析和可視化數據…

Harmony 添加library依賴庫步驟

在Harmony添加library依賴庫步驟如下: 1、在library中定義名字 在library中的oh-package.json5中定義library對外的名字是什么:格式是 “name”:“ohos/名字” {"name": "ohos/library_name" //名字 }2、在項目目錄build-profi…

windows系統安裝Ubuntu子系統

安裝前先在 控制面板 中打開 程序與功能選項 ,點擊 啟用或關閉Windows功能: 勾選 適用于 Linux的Windows子系統 和 虛擬機平臺 、 Hyper-v 。 重啟電腦后再 Microsoft Store Windows應用商店 中下載合適的Ubuntu版本。 運行Ubuntu程序,如出現…

【實戰】算法思路總結

面試過程中,總是被拷打,信心都要沒了。但是也慢慢摸索出一些思路,希望對大家有幫助。 (需要多用一下ACM模式,力扣模式提供好了模板,自己在IDEA里面寫的話,還是會有些陌生) 0、基本…

僵尸進程111

Linux 系統中的進程可能處于如下狀態中的一種: D 不可中斷的休眠 I 空閑 R 運行中 S 休眠 T 被調度信號終止 t 被調試器終止 Z 僵尸狀態 Interruptible Sleep,可中斷睡眠,在 ps 命令中顯示 S。處在這種睡眠狀態的進程是可以通過給它…

OC中Block為什么不能為nil

在 Objective-C 中,向 nil 對象發送消息是完全有效的,這是因為 Objective-C 運行時對 nil 消息發送進行了特別的處理。當你向 nil 對象發送消息時,消息會被靜默地忽略,不執行任何操作,也不會返回任何值(或者…

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. 蛙學府 實用性:★★★★☆ 豐富性&…

您真的會高效使用 Mac 嗎?

文章目錄 屏幕的保養快捷鍵預覽修改文件名查看文件屬性搜索編輯復制,粘貼,剪切,撤銷刪除 跳轉窗口屏幕截圖聲音Dock強制退出查字典神奇的Option鍵鼠標與觸控板切換桌面與應用程序打開通知中心打開Mission Control 安裝與卸載Mac應用程序壓縮和…

記一些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…

python常用內置對象

1.字符串與字節串 對str 類型調用其encode()方法進行編碼得到byte字符串, 對byte字節串調用其encode()方法并指定正確的編碼格式得到str字符串 “房地產”,encode("utf-8") #對中文進行編碼-.decode("u…

【自然語言處理】【大模型】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.…

面試題-實例

1.什么是線程池? 線程池就是事先將創建好的線程進行整合,當需要使用的時候,直接拿出來進行使用,不用現去創建,可以節約開辟的時間,提高效率。 2.線程池有哪些種類? 在java.util.concurrent.Ex…