启动监听特定端口的 docker 守护程序的正确方法

Correct way to start docker daemon listening to specific port

我是 docker 的新手,想以守护进程模式启动它,监听特定的 IP 地址和端口。在documentation中据说可以通过写sudo /usr/bin/docker daemon -H 0.0.0.0:5555来完成。然后它说我可以使用此命令 docker ps 列出 运行ning 容器。如果我尝试这样做,我会收到以下消息:

Get http:///var/run/docker.sock/v1.20/containers/json?all=1: dial unix /var/run/docker.sock: no such file or directory.

  • Are you trying to connect to a TLS-enabled daemon without TLS?
  • Is your docker daemon up and running?

我无法与之互动。我在寻找解决方案,但没有运气。有什么建议吗?

P.S。我如何在后台 运行 这个守护进程?我尝试附加一个 & 但我一直停留在输出上,直到按下 ctrl+c。

提前致谢

Mac OSX 你会 运行 Docker Quickstart Terminal App 看到:

Machine default already exists in VirtualBox.
Starting machine default...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
Setting environment variables for machine default...

...

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

现在

docker ps

应该可以

Linux 例如Ubuntu 可能需要在前面加上 sudo。 例如。

docker ps

将导致:

Get http:///var/run/docker.sock/v1.20/containers/json: dial unix /var/run/docker.sock: permission denied.
* Are you trying to connect to a TLS-enabled daemon without TLS?
* Is your docker daemon up and running?

但是

sudo docker ps

会起作用。

https://docs.docker.com/articles/basics/

要检查您的 docker 服务是否 运行ning 您可以调用

 sudo service --status-all 2>&1 | grep docker

它应该显示:

[ - ]  docker

有时您的 docker 安装可能已损坏 参见:Docker daemon does not start or restart

我找到了解决问题的方法。我在 IP x 和端口 y 上指定了 docker 运行,但是 docker 然后只监听那个套接字。为了监听本地请求,我不得不在 unix 套接字中添加另一个 -H 标志:

sudo /usr/bin/docker daemon -H tcp://0.0.0.0:5555 -H unix:///var/run/docker.sock

出于某种原因,Phoenix 的解决方案给我错误。所以我找到了另一种方法-

我编辑了 /etc/sysconfig/docker 并更改了 OPTIONS 参数

OPTIONS='--selinux-enabled -H=unix:///var/run/docker.sock -H=0.0.0.0:2375'

然后我重新启动了 docker 守护程序

systemctl restart docker

成功了。

在 Ubuntu (16.04 LTS) 上使用 docker-ce (17.03.1~ce-0~ubuntu-xenial) 执行以下操作以使 docker 监听 TCP 端口而不是套接字。

添加一个文件/etc/systemd/system/docker.service.d/override.conf,内容如下:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

添加一个文件/etc/docker/daemon.json,内容如下

{
    "hosts": [
        "tcp://127.0.0.1:2375"
    ] 
}

重新加载 (systemctl daemon-reload) 并重新启动 (systemctl restart docker.service) docker.

供参考:https://github.com/moby/moby/issues/25471

编辑:

小心,恶魔只会监听那个网络端口而忽略本地请求。 要使 docker 同时监听远程和本地,请编辑 daemon.json 但保留标准 unix 套接字

{
        "hosts" : [
                "unix:///var/run/docker.sock",
                "tcp://<docker-host-ip-or-localhost>:2375"
        ]
}

Docker 守护程序连接选项 docs

这个线程非常有用,所以我想贡献如何让它在 Ubuntu 14.04.1 LTS 和 docker 1.12.6-cs13 上工作( 可能 也可以与 docker-ce 版本一起使用)。 systemd 方法(也 /etc/sysconfig/docker)对于这个 Ubuntu 年份是不可能的,官方 docker 文档在撰写本文时没有 post 安装指南使用 upstart 为 Ubuntu 14.04.1 LTS 使 docker 守护程序在网络上侦听。我发现以下方法效果很好:

创建/etc/default/docker 包含内容的文件 DOCKER_OPTS = "-H tcp://MACHINE-IP:2375 -H unix:///var/run/docker.sock"

重新启动 docker 服务 sudo service docker restart。这样做之后,docker 守护进程开始监听网络并且守护进程日志看起来很干净。如果有更好的方法,也许更有经验的 docker 用户可以提出意见。