Api 如何在centos下用systemd让docker监听unix和TCP套接字

Api 如何在centos下用systemd让docker监听unix和TCP套接字,api,docker,tcp,centos,systemd,Api,Docker,Tcp,Centos,Systemd,我已经使用systemd在CentOS下安装了docker(v17.06.2-ce)。 Docker工作正常,可以监听unix套接字。现在我想让docker监听Unix套接字和TCP套接字2375。因为这是一个内部开发机器,所以安全性没有问题 我浏览了一下互联网,发现了几篇文章,但仍然有一些问题 我的理解是,我有一个systemd文件(docker.service),它在没有任何参数的情况下启动dockerd。 ExecStart=/usr/bin/dockerd 然后这里有demon.json

我已经使用systemd在CentOS下安装了docker(v17.06.2-ce)。 Docker工作正常,可以监听unix套接字。现在我想让docker监听Unix套接字和TCP套接字2375。因为这是一个内部开发机器,所以安全性没有问题

我浏览了一下互联网,发现了几篇文章,但仍然有一些问题

我的理解是,我有一个systemd文件(docker.service),它在没有任何参数的情况下启动dockerd。 ExecStart=/usr/bin/dockerd

然后这里有demon.json文件,我可以列出我要听的内容。 我的问题是在这里输入什么。可能是

{
   "hosts": [  "unix:///var/run/docker.sock",
                "tcp://0.0.0.0:2375"
            ]
}
或者对于套接字激活来说是这样的吗

{
       "hosts": [  "unix:///var/run/docker.sock",
                    "fd://"
                ]
    }
然后我发现的第二件事是准备systemd socket,方法是提供一个文件docker.sockst,如下所示

[Unit] Description=Docker Socket for the API
PartOf=docker.service 

[Socket] 
ListenStream=tcp://0.0.0.0:2375 
SocketMode=0660 
SocketUser=root 
SocketGroup=docker 

[Install] 
WantedBy=sockets.target
但这将只定义一个TCP套接字。根据一篇文章,docker将响应TCP端口,但不再响应unix套接字


如果有人能指出细节就好了。

所以不要碰docker.socket文件或任何东西。Systemd有一个dropin的概念,您可以使用dropin文件覆盖部分服务

因此,首先为服务创建dropin文件夹

mkdir -p /etc/systemd/system/docker.service.d/
然后创建一个配置文件

cat > /etc/systemd/system/docker.service.d/90-docker.conf <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:2375
现在您的服务也将在2375收听。我认为目前无法使用
/etc/docker/daemon.json
控制主机选项。有关更多详细信息,请参阅下面的链接

  • cd/lib/systemd/system/
  • vim docker tcp.socket
  • 将其粘贴到
    docker tcp.socket

    [Unit]
    Description=Docker Socket for the API
    PartOf=docker.service
    
    [Socket]
    ListenStream=2375
    
    BindIPv6Only=both
    Service=docker.service
    
    [Install]
    WantedBy=sockets.target
    
  • systemctl后台程序重新加载

  • systemctl停止docker.service
  • systemctl启用docker tcp.socket
  • systemctl启动docker tcp.socket
  • systemctl启动docker.service
  • 验证2375端口是否已打开 docker-H 127.0.0.1 ps 容器ID映像命令已创建状态端口名称

  • 事实上,我刚刚在Github上为PhotonOS发布了一个公开问题的答案。我用doc markdown的说明以及等效的shell脚本创建了一个要点

    它允许维护本地unix套接字以及对API的基于TCP的远程访问。与大多数指令不同,它遵循Docker支持的方法,创建Docker.socket服务并将其作为依赖项绑定到Docker服务,而不是在命令行上硬编码/或TCP或unix fd sock,或黑客攻击在每次升级时被覆盖的任何系统文件


    GIST是:

    关于空白ExcStase=行的好提示。我以前没有注意到这种行为,但现在我看到了
    mansystemd.service
    中记录的。上面写着
    Jan 29 17:06:09 talis dev pc docker[21522]:docker:“daemon”不是docker命令。
    并且不会启动。Docker版本18.09.1,内部版本4c52b90。修正:不要使用
    /usr/bin/docker守护进程…
    而使用
    /usr/bin/dockerd…
    。如果稍微更改ExecStart命令,这些指令或多或少适用于ubuntu。模拟
    /etc/systemd/system/multi-user.target.wants/docker.service
    中的表单,但使用额外的
    -H
    标志:
    ExecStart=/usr/bin/dockerd-H fd://--containerd=/run/containerd/containerd.sock-Htcp://0.0.0.0:2375
    [Unit]
    Description=Docker Socket for the API
    PartOf=docker.service
    
    [Socket]
    ListenStream=2375
    
    BindIPv6Only=both
    Service=docker.service
    
    [Install]
    WantedBy=sockets.target