正确的方式启动Docker守护进程以监听特定端口

11

我对docker不熟悉,想以守护进程模式启动它,并监听特定的IP地址和端口。在文档中提到可以通过编写sudo /usr/bin/docker daemon -H 0.0.0.0:5555来实现。然后它说可以使用此命令docker ps列出正在运行的容器。如果我尝试这样做,会收到以下消息:

获取http:///var/run/docker.sock/v1.20/containers/json?all=1:拨号unix /var/run/docker.sock时出错:没有此文件或目录。

  • 您是否尝试在没有TLS的情况下连接到启用了TLS的守护程序?
  • 您的docker守护程序是否已运行?

我无法与其交互。我搜索了解决方法,但没有找到。有什么建议吗?

P.S. 如何在后台运行此守护程序?我尝试附加&符号,但在按ctrl+c之前一直停留在输出上。

提前感谢


1
"nohup" 就是你正在寻找的内容。在这里查看 https://dev59.com/Xmkv5IYBdhLWcg3wtS8N - Luca Davanzo
行为取决于您的操作系统。您使用的是哪个操作系统? - Wolfgang Fahl
1
抱歉,我忘了提到我使用的是Ubuntu 14.04。 - EllisTheEllice
6个回答

9
在 Ubuntu(16.04 LTS)安装了 docker-ce(17.03.1~ce-0~ubuntu-xenial)后,按照以下操作使 docker 监听 TCP 端口而不是 sockets。
添加文件 /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 守护进程连接选项 文档


4
在Mac OSX上,您需要运行Docker Quickstart终端应用程序才能查看:
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服务是否正在运行,您可以调用

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

并且它应该显示:

[ - ]  docker

有时候,您的Docker安装可能会出现损坏的情况 参考链接:Docker daemon does not start or restart

我在前面加了sudo,但这并没有帮助。我收到以下消息:“无法连接到Docker守护程序。在此主机上运行'docker -d'吗?”然而,您的建议使用“sudo service --status-all 2>&1 | grep docker”给了我期望的输出。这是我安装docker的方法(我通过脚本执行):“sudo touch /etc/apt/sources.list.d/docker.list” “sudo -u root bash -c“echo 'deb https://apt.dockerproject.org/repo ubuntu-trusty main' >> /etc/apt/sources.list.d/docker.list” - EllisTheEllice
sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D sudo apt-get update sudo apt-get -y install docker-engine sudo service docker stop sudo /usr/bin/docker daemon -H 0.0.0.0:5555&注:如何在注释中换行? - EllisTheEllice

4
我找到了解决我的问题的方法。我指定了运行在IP地址x和端口y上的Docker,但是Docker只听取那个套接字。我必须添加另一个-H标志来监听本地请求的Unix套接字:
sudo /usr/bin/docker daemon -H tcp://0.0.0.0:5555 -H unix:///var/run/docker.sock

1
这个主题非常有用,所以我想贡献一下如何在Ubuntu 14.04.1 LTS上使用docker 1.12.6-cs13(可能也适用于docker-ce版本)。对于这个Ubuntu版本,systemd方法(也包括/etc/sysconfig/docker)是不可行的,根据官方docker文档,至少在本文写作时还没有关于使用upstart让docker守护进程监听网络的后安装指南。我发现以下方法效果相当好:创建/etc/default/docker文件,内容为DOCKER_OPTS =“-H tcp://MACHINE-IP:2375 -H unix:///var/run/docker.sock”,重新启动docker服务sudo service docker restart。这样做后,docker守护进程开始监听网络,并且日志看起来很干净。或许更有经验的docker用户可以提供更好的方法。

0

如果您正在运行最新版本的systemd,那么这可以很容易地完成。

在此之前,您需要为docker创建一个服务文件,并使用root登录并创建systemd的配置目录。

sudo mkdir -p /etc/systemd/system/docker.service.d

下一步需要创建一个服务配置文件来保存Docker配置。
sudo nano /etc/systemd/system/docker.service.d/options.conf

粘贴以下行

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375

重新加载并重启Docker守护进程

systemctl daemon-reload
systemctl restart docker

这里有一件重要的事情,那就是这将会带来docker守护进程的root用户,因此如果您有任何合规问题,需要在服务文件中调整用户设置。

完成后,您可以连接您的

root@5e5b1f264a1c:~# curl 172.31.112.67:2375/v1.38/containers/json 
[{"Id":"c3c68fc119595ca6a92fbcbdaddfaa294150ed76ba80c3ffbb072411d5979dac","Names":["/nginx"],"Image":"nginx","ImageID":"sha256:51086ed63d8cba3a6a3d94ecd103e9638b4cb8533bb896caf2cda04fb79b862f","Command":"/docker-entrypoint.sh nginx -g 'daemon off;'","Created":1666081825,"Ports":[{"PrivatePort":80,"Type":"tcp"}],"Labels":{"maintainer":"NGINX Docker Maintainers <docker-maint@nginx.com>"},"State":"running","Status":"Up 13 seconds","HostConfig":{"NetworkMode":"default"},"NetworkSettings":{"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"007a4ef79334ca4e38c80177b36e37275116e945612f7637cc9ee3baf72e741b","EndpointID":"39644cfe51205f14c0b88a4842dab817b2ea9fbd503d12dbf84265ba6b8987d5","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","DriverOpts":null}}},"Mounts":[]}]

0
由于某种原因,Phoenix的解决方案给我带来了错误。所以我找到了一种替代方法-
我编辑了/etc/sysconfig/docker并更改了OPTIONS参数。
OPTIONS='--selinux-enabled -H=unix:///var/run/docker.sock -H=0.0.0.0:2375'

然后我重新启动了Docker守护进程

systemctl restart docker

它起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接