我正在阅读 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://
--host
docker-tcp.socket
0.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