【发布时间】:2020-05-10 00:04:50
【问题描述】:
纯属偶然,我注意到通过docker-compose 作为服务启动的容器包含两个连接到主机的dockerd 进程的套接字,但似乎不是用于联系Docker 守护程序API 的“Docker 套接字”。这些套接字不会出现在以纯 docker run ... 开头的容器中。
要重现,首先创建一个 docker-compose yaml 文件,composer-woes.yaml,其中包含以下内容:
version: '3'
services:
ubuntu:
image: 'ubuntu'
pid: host
command: ['/bin/sleep', '100000000']
接下来,启动“ubuntu”服务:docker-compose -f composer-woes.yaml up。
然后进入服务容器,安装工具,查看打开的内容:
$ docker exec -it ${PWD##*/}_ubuntu_1 /bin/bash
# apt-get update && apt-get install -y net-tools iproute2
# netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:39627 0.0.0.0:* LISTEN -
udp 0 0 127.0.0.11:58047 0.0.0.0:* -
# ss -tulp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.11:58047 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.11:39627 0.0.0.0:*
# cat /proc/self/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 0B00007F:9ACB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 139272 1 0000000000000000 100 0 0 10 0
请注意netstat 和ss 如何找不到打开这些套接字的进程。我们看到奇怪的套接字有 inode #139272。我们现在需要它来扫描主机以查找具有引用此 inode 的 fd 的进程。
在您的主机中,最后执行这个神奇的 bash 代码;请记住替换您在测试中看到的 inode #:
sudo bash -c "sock=socket:[139272]; for proc in /proc/*; do for fd in \$proc/fd/*; do readlink \$fd | grep -q -F \$sock && echo \$proc: \$sock ... \$(cat \$proc/cmdline|sed 's/\o0/ /g'); done; done"
/proc/1375: socket:[139272] ... /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
所以,docker-compose带来的Docker容器内部的两个UDP/TCP套接字实际上属于宿主机的dockerd进程外部 Docker容器。
- 问题第 1 部分:这些套接字是做什么用的?我能找到的对
127.0.0.11的唯一引用是关于 Embedded DNS server in user-defined networks。 - 问题部分 #2:这些套接字实际上是如何进入容器的?请注意,它们属于
dockerd,而不是containerd-shim。
【问题讨论】:
标签: linux docker sockets dns docker-compose