我正在尝试手动使用docker:19.03.5-dind如“如何使用此图像”部分所示的图像。
首先我运行守护进程
$ docker run --privileged -d --rm --name=docker-daemon \ --network=test docker:19.03.5-dind e1f8544d30df5bc010d67e38b38be0f47306b29ab0fdeb32861c5716582c9917
我看到它已启动并监听端口 2376
$ docker logs docker-daemon ... time="2019-11-28T11:31:40.266976728Z" level=info msg="Daemon has completed initialization" time="2019-11-28T11:31:40.550083421Z" level=info msg="API listen on [::]:2376" time="2019-11-28T11:31:40.550169911Z" level=info msg="API listen on /var/run/docker.sock"
接下来我启动docker客户端:
$ docker run -it --rm --name=my-docker \ --network=test --link=docker-daemon:docker docker:19.03.5
从客户端我可以 pingdocker 守护进程和它的码头工人别名
# ping docker-daemon -c1 PING docker-daemon (172.20.0.2): 56 data bytes 64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.146 ms ... # ping docker -c1 PING docker (172.20.0.2): 56 data bytes 64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.177 ms ...
但我仍然无法运行docker:
# docker ps Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
它不应该尝试连接端口 2376 吗?我在这里遗漏了什么?
我的主机运行的是 Ubuntu 18.04,Docker 版本为 18.09.7,内部版本为 2d0083d
答案1
您需要按照链接文档中的步骤进行操作,包括将证书目录作为卷挂载在两个容器中,并在客户端容器上传递环境变量:
$ docker run --privileged --name some-docker -d \
--network some-network --network-alias docker \
-e DOCKER_TLS_CERTDIR=/certs \
-v some-docker-certs-ca:/certs/ca \
-v some-docker-certs-client:/certs/client \
docker:dind
$ docker run --rm --network some-network \
-e DOCKER_TLS_CERTDIR=/certs \
-v some-docker-certs-client:/certs/client:ro \
docker:latest version
第一个映像填充了卷挂载,第二个映像使用这些证书通过 2376 进行通信。如果没有证书,它将尝试连接到未加密的 2375 端口,而该端口在 19.03 dind 映像中默认未启用。