- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
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.socket
和 docker.service
。 docker.service
的 ExecStart
行是:
ExecStart=/usr/bin/dockerd -H fd://
停止 Docker 服务:systemctl stop docker
$> ps aux | grep 'docker' # the `grep` itself in the output is ignored
$> lsof -Ua | grep 'docker'
$>
没有 docker 进程正在运行,也没有 docker.sock
执行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。这就是所谓的按需自动生成)
启动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)包括tcp
、unix
、npipe
和fd
。据我从源代码探索,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/
通常在像这样执行标准 docker 进程之前: docker pull epgg/eg docker run -p 80:80 --name eg -it epgg/eg bash 您需要在后台运行
我在 nixos 上安装了 docker,使用: nix-env -i docker 之后,dockerd 没有运行,所以我手动启动了守护进程: dockerd 在日志中,我看到: WARN[2019
如果我运行 systemctl cat docker.service 来检查 docker.service 的单元文件,ExecStart=/usr/bin/dockerd -H fd://--con
当我使用以下命令运行 docker 容器时: docker run -ti -v /tmp/michael:/opt/jboss/wildfly/standalone/log jboss docker
我正在尝试运行此命令: docker daemon --insecure-registry 192.168.99.100:5000 但我遇到了以下错误: exec: "dockerd": execut
我想使用这样的开放 TCP 地址启动 docker 守护进程:docker daemon -H tcp://0.0.0.0:2375,但终端建议我使用 dockerd 相反,这显然不是 Mac 版 D
如何在gitlab-ci管道中为自己的docker注册表提供自己的CA根证书和SSL客户端证书(证书+ key )给dockerd? 我有虚拟机(CentOS 7)并安装了 docker 和 gitl
Docker daemon documentation建议大多数设置使用以下 hosts 选项: dockerd -H fd:// 我猜 fd 代表文件描述符。我不明白 fd 如何用于套接字通信。 我
使用kubespray安装kubernetes时发生上述错误。 安装失败,并且通过journal -xe我看到以下内容: ` node1 systemd[1]: Starting Docker
我使用的是 Ubuntu 18.04(运行模拟 Windows),并且是个新手。我按照以下步骤安装了 Docker,但无法让它运行。 我用来安装的命令( https://www.digitalocea
我正在遵循以下两个网站上提供的有关如何使 Linux 容器适用于 Windows Server 1709 的说明:https://github.com/linuxkit/lcow , https://
这东西现在真的很困惑。有人可以解释发生了什么。只是直线上的区别。 dockerd libcontainerd 容器 docker-containerd docker-runc docker-conta
我是一名优秀的程序员,十分优秀!