gpt4 book ai didi

sockets - fd ://mean exactly in dockerd -H fd://是什么意思

转载 作者:IT老高 更新时间:2023-10-28 12:38:50 25 4
gpt4 key购买 nike

Docker daemon documentation建议大多数设置使用以下 hosts 选项:

dockerd -H fd://

我猜 fd 代表文件描述符。我不明白 fd 如何用于套接字通信。

我了解以下选项:

-H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2

这些是 unix 域套接字和 tcp 套接字。我知道如何使用这些套接字调用 docker daemon:

docker -H tcp://0.0.0.0:2375 ps

但如果我使用 -H fd:// 启动 docker daemon,以下调用会报错:

$ docker -H fd:// ps
error during connect: Get http:///v1.26/containers/json: http: no Host in request URL

那么fd://是什么意思呢?有什么用吗?

最佳答案

当您启动 Docker 守护进程时,-H fd:// 将告诉 Docker 该服务正在由 Systemd 启动,并将使用套接字激活。 systemd 然后将创建目标套接字并将其传递给 Docker 守护程序以使用。这在 introduction to Systemd 中有描述。在 introduction to socket activation .博客很长,但确实值得一读,以下是理解这个问题的关键点的简短摘要:

  • Systemd 是一个新的 init 系统,旨在取代传统的 SysV 初始化系统。它的主要功能之一是更快的初始化过程。

  • Socket激活是Systemd中用来加速服务初始化的技术之一

  • 为了接收请求,服务需要一个套接字来监听。以 Docker 为例,它需要像 /var/run/docker.sock 这样的 unix domain socket 或 TCP socket。当然,这些套接字需要一些东西来创建它们,而且大多数时候它是服务本身在启动时。

  • 通过套接字激活,SystemD 将创建这些套接字并监听它们以获取服务,并在服务启动时使用 exec 将这些套接字传递给服务。一个好处是,一旦成功创建套接字,甚至在相关服务启动之前,客户端请求就可以在套接字缓冲区中排队。

  • Systemd 使用的某个服务的套接字信息在 socket 单元文件中,对于 Docker,它是 [docker.socket][3] 内容:

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

    [Socket]
    ListenStream=/var/run/docker.sock
    SocketMode=0660
    SocketUser=root
    SocketGroup=docker

    [Install]
    WantedBy=sockets.target

让我们看看整个事情是如何运作的。我在 /etc/systemd/system 下有文件 docker.socketdocker.servicedocker.serviceExecStart 行是:

ExecStart=/usr/bin/dockerd -H fd://
  1. 停止 Docker 服务:systemctl stop docker

    $> ps aux | grep 'docker' # the `grep` itself in the output is ignored
    $> lsof -Ua | grep 'docker'
    $>

    没有 docker 进程正在运行,也没有 docker.sock

  2. 执行systemctl start docker.socket:

    $> systemctl start docker.socket
    $> ps aux | grep 'docker'
    $> lsof -Ua | grep 'docker'
    systemd 1 root 27u unix 0xffff880036da6000 0t0 140748188 /var/run/docker.sock

    启动docker.socket后,我们可以看到仍然没有docker进程在运行,但是socket /var/run/docker.sock已经创建好了,并且它属于进程systemd

    (题外话:实际上套接字现在已经准备好接收请求了,即使 docker 还没有运行。systemd 将在此刻启动 docker.service第一个请求来了,将已经创建的套接字传递给 Docker。这就是所谓的按需自动生成)

  3. 启动docker.service

    $> systemctl start docker.service
    $> ps aux | grep 'docker'
    root 26302 0.0 1.8 431036 38712 ? Ssl 14:57 0:00 /usr/bin/dockerd -H fd://
    <....>

    正如您所见,Docker 现在正在运行。让我们退后一步,尝试从终端手动执行 /usr/bin/dockerd -H fd://:

    $> /usr/bin/dockerd -H fd://
    FATA[0000] no sockets found via socket activation: make sure the service was started by systemd

    现在您看到了不同之处;当您使用 -H fd:// 时,docker 将期望套接字由其父进程传递,而不是自己创建。当它由 Systemd 启动时,Systemd 将完成这项工作,但是当您在终端上手动启动它时,您不会执行这项工作,因此 docker 守护进程失败并中止。这是code of how docker process fd:// when docker daemon starts ,有兴趣的可以看看。

另一方面,对于 docker 客户端,docker cli 将从 -H 中指定的 host 中解析协议(protocol)/地址,并生成一个 http对 docker 守护进程的请求。默认主机是 unix:///var/run/docker.sock。支持的协议(protocol)包括tcpunixnpipefd。据我从源代码探索,fd 的传输配置与 tcp 相同,因此如果您有 tcp 套接字监听,则可以使用:

$> docker -H fd://localhost:4322 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

等同于:

docker -H tcp://localhost:4322 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

关于sockets - fd ://mean exactly in dockerd -H fd://是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43303507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com