簡體   English   中英

在Docker容器中訪問Docker

[英]Access Docker inside Docker container

我有一個非常特定的開發環境用例。 在某些代碼中,我啟動了一個容器以刮取頁面並檢索在容器中運行的服務(Gitlab)的令牌。

現在,我希望對運行此代碼的代碼進行Docker化。 具體來說,類似於:

out, err := exec.Output("docker", "run", "--net=host", "--rm", "-e", "URL=http://127.0.0.1:8081", "-e", "USER=root", "-e", "PWD=adminadmin", "some image")

但是,當在容器中運行它時,顯然我的代碼會引發panic: exec: "docker": executable file not found in $PATH因為在容器中無法識別docker

如何在Docker容器中安裝Docker? 我可以以某種方式與主機綁定嗎? 這是否應該在Dockerfile發生,還是可以通過我用來啟動它docker-compose.yml文件來定義這種行為?

我在OSX上。 which docker/usr/local/bin/docker

是的,有可能在Docker中稱為DinD。

甚至不必介意自己安裝docker-docker有一個帶有各種標簽的正式dind映像

所以,我剛剛在docker for windows使用docker for windows的Mac上嘗試過:

docker-compose.yaml:

version: '3'
services:
  app:
    image: ubuntu:16.04
    volumes:
      - /usr/local/bin/docker:/usr/local/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
    command: docker version

執行:

MAC-MINI:try guest$ docker-compose up
Starting try_app_1 ... done
Attaching to try_app_1
app_1  | Client: Docker Engine - Community
app_1  |  Version:           18.09.2
app_1  |  API version:       1.39
app_1  |  Go version:        go1.10.8
app_1  |  Git commit:        6247962
app_1  |  Built:             Sun Feb 10 04:11:44 2019
app_1  |  OS/Arch:           linux/amd64
app_1  |  Experimental:      false
app_1  |
app_1  | Server: Docker Engine - Community
app_1  |  Engine:
app_1  |   Version:          18.09.2
app_1  |   API version:      1.39 (minimum version 1.12)
app_1  |   Go version:       go1.10.6
app_1  |   Git commit:       6247962
app_1  |   Built:            Sun Feb 10 04:13:06 2019
app_1  |   OS/Arch:          linux/amd64
app_1  |   Experimental:     false
try_app_1 exited with code 0

使用docker守護進程和主機的docker客戶端似乎都可以。

如果您介意使用從主機掛載的docker client ,還可以使用靜態二進制文件,請參閱如何安裝靜態二進制文件

更新:

另外,我嘗試運行一個真正的容器,而不僅僅是docker version如下所示:

services:
  app:
    image: ubuntu:16.04
    volumes:
      - /usr/local/bin/docker:/usr/local/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
    command: docker run --rm hello-world

It's still ok as next:

$ docker-compose up
Recreating try_app_1 ... done
Attaching to try_app_1
app_1  | Unable to find image 'hello-world:latest' locally
app_1  | latest: Pulling from library/hello-world
app_1  | 1b930d010525: Pulling fs layer
app_1  | 1b930d010525: Download complete
app_1  | 1b930d010525: Pull complete
app_1  | Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
app_1  | Status: Downloaded newer image for hello-world:latest
app_1  |
app_1  | Hello from Docker!
app_1  | This message shows that your installation appears to be working correctly.
app_1  |
app_1  | To generate this message, Docker took the following steps:
app_1  |  1. The Docker client contacted the Docker daemon.
app_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
app_1  |     (amd64)
app_1  |  3. The Docker daemon created a new container from that image which runs the
app_1  |     executable that produces the output you are currently reading.
app_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
app_1  |     to your terminal.
app_1  |
app_1  | To try something more ambitious, you can run an Ubuntu container with:
app_1  |  $ docker run -it ubuntu bash
app_1  |
app_1  | Share images, automate workflows, and more with a free Docker ID:
app_1  |  https://hub.docker.com/
app_1  |
app_1  | For more examples and ideas, visit:
app_1  |  https://docs.docker.com/get-started/
app_1  |
try_app_1 exited with code 0

根據@PierreB的建議進行第二次更新,以添加有關如何使用靜態二進制文件的更多信息:

  1. https://download.docker.com/下載,選擇一個適合您的目標映像的軟件包,例如,如果目標映像是linux,則從此處下載。

  2. 將二進制文件解壓縮到當前文件夾,您會看到名稱為docker Docker客戶端,這是一個獨立的二進制文件。

  3. 將docker-compose.yaml更改為next以將該靜態二進制文件從主機安裝到容器:

     services: app: image: ubuntu:16.04 volumes: - ./docker:/usr/local/bin/docker - /var/run/docker.sock:/var/run/docker.sock command: docker run --rm hello-world 

這里發生2種不同的事情:

  • 您將需要在golang容器中使用一個docker客戶端
  • 您將需要一個可訪問的docker守護程序(服務器)

為了在運行中的容器中安裝客戶端,您似乎使用了基於debian的golang映像,您可以: apt-get update && apt-get install -yq docker

此時,如果您嘗試執行docker run命令,您將獲得類似以下內容的信息:

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.

這意味着您現在必須為Docker客戶端提供一個工作的docker服務器。 Efrat Levitan的回答所述,可以通過運行另一個容器(稱為服務)並運行dind (在dind )來完成此操作。 然后,您將必須定義變量DOCKER_HOST: tcp://<docker_server_address>:2375/地址將取決於您的設置以及如何啟動容器。

可以用另一種方式替換主機docker套接字(不建議這樣做,因為它可能會導致數據損壞)。

要了解其含義,您可能需要閱讀JérômePetazzoni關於docker中的docker的文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM