1. 程式人生 > 其它 >如何在 Docker 容器中執行 Docker?

如何在 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命令。