docker-in-docker:“无法连接到 tcp://docker:2375 上的 Docker 守护进程”

docker-in-docker:“无法连接到 tcp://docker:2375 上的 Docker 守护进程”

我正在尝试手动使用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 映像中默认未启用。

相关内容