[英]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的建議進行第二次更新,以添加有關如何使用靜態二進制文件的更多信息:
從https://download.docker.com/下載,選擇一個適合您的目標映像的軟件包,例如,如果目標映像是linux,則從此處下載。
將二進制文件解壓縮到當前文件夾,您會看到名稱為docker
Docker客戶端,這是一個獨立的二進制文件。
將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種不同的事情:
為了在運行中的容器中安裝客戶端,您似乎使用了基於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.