如何在 Docker 容器中執行 Docker?
在本部落格中,我將向您介紹在docker中執行docker所需的三種不同方法。
Docker In Docker的用處
dockerIndocker的一個潛在用處是CI管道,在程式碼成功構建後,您需要在其中構建docker映象並將其推送到容器映象倉庫。
使用VM構建Docker映像非常簡單。但是,當您計劃將基於 Jenkins docker的動態代理用於CI/CD管道時,docker In docker是必備功能。
沙盒環境。
出於實驗目的,在您的本地開發工作站上。
在Docker容器中執行Docker
在Docker中實現Docker的三種方法
通過掛載docker.sock(DooD方法)執行docker
dind 方法
使用Nestybox sysbox Docker執行時
讓我們詳細瞭解每個選項。確保在主機中安裝了docker來嘗試此設定。
方法1:使用[/var/run/docker.sock]的Docker中執行Docker
什麼是/var/run/docker.sock?
/var/run/docker.sock是預設的Unix套接字。套接字用於在同一主機上的程序之間進行通訊。Docker守護程式預設情況下偵聽docker.sock。如果您在執行Docker守護程式的主機上,則可以使用/ var/run/docker.sock管理容器。
例如,如果您執行以下命令,它將返回docker engine的版本。
curl --unix-socket /var/run/docker.sock http://localhost/version
現在您已經瞭解了什麼是docker.sock,讓我們看看如何使用在docker中執行docker。
要在docker內部執行docker,要做的只是在預設Unix套接字docker.sock作為卷的情況下執行docker 。
例如,
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-ti docker-image
**請注意:**如果您的容器可以訪問docker.sock,則意味著它具有對docker守護程式的更多特權。因此,在實際專案中使用時,請了解並使用安全隱患。
現在,從容器中,您應該能夠執行docker命令來構建映象並將其推送到映象倉庫。在這裡,實際的docker操作發生在執行docker容器的VM主機上,而不是在容器內部進行。意思是,即使您正在容器中執行docker命令,也指示Docker客戶端通過以下docker.sock方式連線到VM主機docker-engine。
要測試他的設定,請使用來自docker hub 的官方docker映像。它具有docker二進位制檔案。
請按照以下步驟測試設定。
第1步:以互動方式啟動Docker容器,並掛載docker.sock卷。我們將使用官方的docker映象。
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti docker
步驟2:進入容器後,執行以下docker命令。
docker pull ubuntu
步驟3:列出Docker映像時,您應該看到ubuntu映像以及在主機VM中其他Docker映像。
docker images
步驟4:現在在測試目錄中建立一個Dockerfile。
mkdir test && cd test
vi Dockerfile
複製以下Dockerfile內容以從容器內部測試映像構建。
FROM ubuntu:18.04
LABEL maintainer="Bibin Wilson <[email protected]>"
RUN apt-get update && \
apt-get -qy full-upgrade && \
apt-get install -qy curl && \
apt-get install -qy curl && \
curl -sSL https://get.docker.com/ | sh
編譯Dockerfile
docker build -t test-image .
方法2:Docker In Docker
此方法實際上在容器內部建立一個子容器。僅當您確實要在容器中包含容器和影象時才使用此方法。否則,我建議您使用第一種方法。為此,您只需要使用帶有dind標籤的官方docker映象即可。該dind映像使用Docker所需的實用程式進行製作以在Docker容器中執行。
請按照以下步驟測試安裝程式。
注意:這要求您的容器以特權模式執行。
步驟1:建立dind-test以docker:dind圖片命名的容器
docker run --privileged -d --name dind-test docker:dind
步驟2:使用exec登入到容器。
docker exec -it dind-test /bin/sh
現在,從以前的方法執行步驟2到4,並驗證docker命令列說明和映像構建。
方法3:使用Sysbox執行時的Docker中的Docker
方法1和2在安全方面有一些缺點,因為在特權模式下執行容器。Nestybox嘗試通過使用sysbox Docker執行時來解決該問題。
如果使用Nestybox sysbox執行時建立容器,則它可以在能夠執行systemd,docker,kubernetes的容器內建立虛擬環境,而無需特權訪問基礎主機系統。解釋sysbox需要足夠的理解力,因此我不在本文的討論範圍之內。請參考此頁面以全面瞭解sysbox。
步驟1:安裝sysbox執行時環境。請參閱此頁面以獲取有關安裝sysbox執行時的最新官方說明。
第2步:一旦擁有sysbox執行時可用,您要做的就是使用sysbox執行時標誌啟動docker容器,如下所示。在這裡,我們使用的是官方docker dind映像。
docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind
步驟3:現在將exec會話帶到sysbox-dind容器。
docker exec -it sysbox-dind /bin/sh
現在,您可以嘗試使用Dockerfile構建映像,如先前方法所示。
關鍵注意事項
僅在必要時在Docker中使用Docker。在將任何工作流程遷移到Docker-in-Docker方法之前,請進行足夠的測試。
在特權模式下使用容器時,請確保您已獲得企業安全團隊有關計劃執行的必要批准。
在帶有kubernetes容器的Docker中使用Docker時,存在一些挑戰。請參閱此部落格以瞭解更多資訊。
如果您打算使用Nestybox(Sysbox),請確保已通過企業架構師/安全團隊的測試和批准。
常見問題
這是Docker問題中一些經常問到的Docker。
在Docker中執行Docker安全嗎?
使用docker.sock和dind方法在docker中執行docker的安全性較差,因為它具有對docker守護程式的完全特權
如何在Jenkins中的docker中執行docker?
您可以使用Jenkins動態docker代理設定並將docker.sock安裝到代理容器,以從代理容器內執行docker命令。