docker-tcp.socket 实际上是如何在 CoreOS 上启用 Docker 的远程 API 的?

docker-tcp.socket 实际上是如何在 CoreOS 上启用 Docker 的远程 API 的?

我正在阅读 CoreOS 上 Docker 的 systemd 配置,试图弄清楚如何启用 Docker 的 TCP 端口(端口 2375)。当我查看 docker.service 配置文件时,我得到的印象是 Docker 仅在监听文件描述符 ( --host=fd://)。

# /usr/lib64/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
Requires=docker.socket
After=docker.socket

[Service]
Environment="TMPDIR=/var/tmp/"
ExecStartPre=/bin/mount --make-rprivate /
Environment=DOCKER_OPTS='--insecure-registry="0.0.0.0/0"'
LimitNOFILE=1048576
LimitNPROC=1048576
# Run docker but don't have docker automatically restart
# containers. This is a job for systemd and unit files.
ExecStart=/usr/bin/docker --daemon --storage-driver=btrfs --host=fd:// $DOCKER_OPTS

[Install]
WantedBy=multi-user.target

但是,当我通过检查监听端口时netstat,看到以下内容:

# sudo netstat -apn

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name 
tcp6       0      0 :::2375                 :::*                    LISTEN      1/systemd        
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  2      [ ACC ]     STREAM     LISTENING     1841     1/systemd            /var/run/docker.sock

因此我深入挖掘并找到了 Docker 的 systemd 套接字配置文件:

# /etc/systemd/system/docker-tcp.socket

[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=2375
Service=docker.service
BindIPv6Only=both

[Install]
WantedBy=sockets.target

这似乎是在端口 2375(默认 Docker 端口)提供监听服务的原因,因为当我停止它(使用systemctl stop docker-tcp.socket)并重新启动 Docker 服务(使用systemctl restart docker.service)时,端口 2375 不再显示在中netstat

所以,我的问题是……docker-tcp.socket配置是否实际上将本地 TCP 接口作为 Docker 的一个选项启用,或者在指定 aa选项--host时 Docker 是否默认在本地 TCP 接口上监听,或者配置是否以某种方式在操作系统级别设置了从到的映射?fd://--hostdocker-tcp.socket0.0.0.0:2375/var/run/docker.sock

答案1

如果启动了 docker-tcp.socket,systemd 会监听 tcp 端口 2375。如果收到连接,它会通过 docker.service 启动 docker,并将此 tcp 套接字的文件描述符传递给 docker 守护进程。这样,docker 只会响应 tcp 套接字,而不会响应 unix 套接字上的请求/var/run/docker.sock

相关内容