【问题标题】:Docker-compose: what are the listening sockets "injected" into containers on IP 127.0.0.11 are used for?Docker-compose:“注入”到 IP 127.0.0.11 上的容器中的侦听套接字有什么用途?
【发布时间】: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

请注意netstatss 如何找不到打开这些套接字的进程。我们看到奇怪的套接字有 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


    【解决方案1】:

    经过更多的挖掘,尝试了许多不同的搜索查询,我终于找到了两个帖子how does Docker Embedded DNS resolver work?Answer to: Forward incoming external DNS packets to the embedded docker DNS,它们间接解释了发生了什么,请参阅下面的参考资料了解详细信息。

    简而言之:我们看到的 udp 和 tcp 端口实际上是 Docker 引擎的嵌入式 DNS 服务器端口。额外的 iptables 端口转发规则确保与 127.0.0.11:53 通信的客户端“连接”到嵌入式 DNS 服务器的这些动态分配的端口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2017-09-03
      相关资源
      最近更新 更多