【问题标题】:How to detect a docker daemon port如何检测 docker 守护进程端口
【发布时间】:2014-10-25 11:41:55
【问题描述】:

我已经安装了 Ubuntu 和 Docker。我正在尝试启动 Raik 容器:

$ DOCKER_RIAK_AUTOMATIC_CLUSTERING=1 DOCKER_RAIK_CLUSTER_SIZE=5 DOCKER_RIAK_BACKEND=leveldb make start-cluster ./bin/start

并得到错误信息:

看起来环境变量 DOCKER_HOST 尚未设置。 除非已设置,否则无法启动 Riak 集群 适当地。例如:

导出 DOCKER_HOST="tcp://127.0.0.1:2375"

如果我设置

export DOCKER_HOST="tcp://127.0.0.1:2375"

我所有其他容器都停止工作并说,找不到 Docker 守护进程。

看起来我的 Docker damon 使用的不是 2375 端口。如何查看?

【问题讨论】:

    标签: docker


    【解决方案1】:

    默认情况下,docker daemon 将使用 unix socket unix:///var/run/docker.sock(你可以通过sudo netstat -tunlp 来检查你的情况,并注意没有 docker 守护进程在任何端口上监听)。出于安全原因,建议保留此设置,但听起来 Riak 要求守护程序在 TCP 套接字上运行。

    要使用任何人都可以连接的 TCP 套接字启动 docker 守护程序,请使用 -H 选项:

    sudo docker -H 0.0.0.0:2375 -d &
    

    警告:这意味着可以通过该 TCP 套接字与守护程序对话的机器可以获得对您主机的 root 访问权限。

    相关文档:

    http://basho.com/posts/technical/running-riak-in-docker/

    https://docs.docker.com/install/linux/linux-postinstall/#configure-where-the-docker-daemon-listens-for-connections

    【讨论】:

    • 实际上,您可以直接将其指向 unix 套接字:export DOCKER_HOST="unix:///var/run/docker.sock"
    • 克里斯,这不是问题,安装 riak 容器需要端口绑定。
    • 嗨@ChrisMcKinnel docker -H 0.0.0.0:2375 -d & 给我看'docker --help'。我是使用 docker 1.10。他们变了吗?
    • 然后你可以像这样使用守护进程: docker -H :2375 run -it [name]
    • 这在 17.12 对我有用 1) 停止服务 - sudo systemctl stop docker 2) 然后,sudo /usr/bin/dockerd -H 0.0.0.0:2375
    【解决方案2】:
    1. 准备额外的配置文件。创建一个名为/etc/systemd/system/docker.service.d/docker.conf 的文件。在文件docker.conf中,粘贴以下内容:
    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    

    请注意,如果没有像docker.service.d 这样的目录或名为docker.conf 的文件,那么您应该创建它。

    1. 重新启动 Docker。保存此文件后,通过systemctl daemon-reload重新加载配置并通过systemctl restart docker.service重新启动Docker。

    2. 检查您的 Docker 守护程序。重启docker服务后,可以在systemctl status docker.service的输出中看到端口 喜欢/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

    希望对你有帮助

    谢谢!

    【讨论】:

    • 请注意,可以访问主机上此端口的任何东西现在都具有远程根访问权限。没有加密,没有凭据,它在互联网上被主动扫描。
    【解决方案3】:

    由于我也遇到了“如何检测 docker daemon 端口”的相同问题,但是我在 OSX 上遇到了问题,经过一番挖掘后,我找到了答案。我想在这里为来自 osx 的人分享答案。

    如果你从 docker for mac 和 github issue 访问 known-issues,你会发现默认情况下 docker 守护进程只监听 unix socket /var/run/docker.sock 而不是 tcp。 docker 的默认端口是2375(未加密)和2376(加密)通过 tcp 通信(尽管您可以选择任何其他端口)。

    在 OSX 上,在 tcp 端口上运行守护进程并不直接。要做到这一点,一种方法是使用socat 容器将暴露在 unix 域套接字上的 Docker API 重定向到 OSX 上的主机端口。

    docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
    

    然后

    export DOCKER_HOST=tcp://localhost:2375
    

    但是对于 mac os 上的本地客户端,您不需要导出 DOCKER_HOST 变量来测试 api。

    【讨论】:

    【解决方案4】:

    docker的参考文档:https://docs.docker.com/install/linux/linux-postinstall/#configure-where-the-docker-daemon-listens-for-connections

    2种方式配置docker daemon端口

    1) 在/etc/default/docker文件中配置:

    DOCKER_OPTS="-H tcp://127.0.0.1:5000 -H unix:///var/run/docker.sock"
    

    2) 在/etc/docker/daemon.json进行配置:

    {
    "debug": true,
    "hosts": ["tcp://127.0.0.1:5000", "unix:///var/run/docker.sock"]
    }
    

    如果没有配置 docker 默认套接字,Docker 将无限期等待。即

    Waiting for /var/run/docker.sock
    Waiting for /var/run/docker.sock
    Waiting for /var/run/docker.sock
    Waiting for /var/run/docker.sock
    Waiting for /var/run/docker.sock
    

    注意:但不要在两个配置文件中配置,可能会出现以下错误:

    Waiting for /var/run/docker.sock
    unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [tcp://127.0.0.1:5000 unix:///var/run/docker.sock], from file: tcp://127.0.0.1:5000)
    

    同时添加用户端口[tcp://127.0.0.1:5000]默认docker socket[unix:///var/run/docker.sock]的原因 是用户端口启用对 docker API 的访问,而默认套接字启用 CLI。如果 /etc/default/docker 文件中没有提到默认端口[unix:///var/run/docker.sock],可能会出现以下错误:

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

    这个错误不是因为docker没有运行,而是因为默认docker socket没有启用。

    启用配置后,重启 docker 服务并验证 docker 端口是否启用:

    # netstat -tunlp | grep -i 5000
    tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      31661/dockerd 
    

    适用于 Docker 版本 17.04,可能因 docker 版本不同而异。

    【讨论】:

    • 您能否在答案中包括如何重新启动 Docker 守护程序服务?
    • @PetrusTheron systemctl restart docker
    【解决方案5】:

    如果您运行ps -aux | grep dockerd,您应该会看到它正在运行的端点。

    【讨论】:

    • 我得到了-H fd:// --containerd=/run/containerd/containerd.sock,那是容器化的 docker 连接文件吗?
    【解决方案6】:

    尝试添加-H tcp://0.0.0.0:2375(在Execstart 行的末尾)而不是-H 0.0.0.0:2375

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2018-04-25
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多