为什么kafka docker需要监听unix socket

时间:2016-07-29 01:50:15

标签: docker apache-kafka docker-compose

我使用来自wurstmeister的kafka的docker image docker-compose文件定义了诸如/var/run/docker.sock:/var/run/docker.sock

之类的卷

上述unix socket的目的是什么?

泊坞窗图像何时应声明上述音量?

4 个答案:

答案 0 :(得分:2)

kafka-docker项目正在制作(可疑,见下文)使用docker命令运行 kafka容器,以便对您的docker环境进行内省。例如,它将确定广告化的kafka端口,如下所示:

export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)/\1/g")

有一个broker-list.sh脚本可以找到像这样的kafka经纪人:

CONTAINERS=$(docker ps | grep 9092 | awk '{print $1}')

要在容器内运行docker cli,它需要访问主机上的/var/run/docker.sock套接字。

好的,这是事实。以下是我个人的意见:

我认为这是一个可怕的想法,并且唯一可以访问docker socket的容器​​是那些明确管理容器的容器。还有其他可用于执行容器配置和发现的机制,这些机制不涉及为容器提供对主机的访问权限,这正是您在对Docker套接字进行访问时所执行的操作。

答案 1 :(得分:1)

默认情况下,Docker守护程序侦听unix:///var/run/docker.sock以仅允许root用户进行本地连接。因此,一般来说,如果我们可以从其他地方访问此套接字,我们可以与Docker守护进程通信或提取有关其他容器的信息。

如果我们希望容器内的某些进程访问由Docker守护进程管理的其他容器的信息(在我们的主机上运行),我们可以像上面那样声明卷。 让我们看看wurstmeister码头工人的一个例子。

  1. Docker file
  2. 在文件末尾,它将调用:

     CMD ["start-kafka.sh"]
    
    1. start-kafka.sh
    2. 让我们看看第6行:

      if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
          export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)/\1/g")
      fi
      

      当启动他的Kafka容器时,他想在Kafka容器中执行下面的命令(找到映射到容器的端口......):

      docker port `hostname` $KAFKA_PORT 
      

      请注意,他确实安装了上面的卷,以便能够执行这样的命令。

      来自Docker website的参考(搜索Socket关键字)

答案 2 :(得分:1)

  

上述unix socket的目的是什么?

在容器中挂载/var/run/docker.sock套接字可以访问docker守护程序托管的Docker Remote API。有权访问此套接字的任何人都可以完全控制docker和运行docker的主机(基本上是root访问权限)。

  

泊坞窗图像何时应声明上述音量?

很少。如果您正在运行需要在容器内访问API的docker管理工具,则需要安装(或可访问via TCP),以便该工具可以管理托管docker守护程序。

作为larsks mentioned,docker-kafka使用套接字进行配置发现是非常值得怀疑的。

答案 3 :(得分:0)

没有必要挂载docker.sock文件,可以通过在kafka-docker / Dockerfile&中注释掉相应的行来避免它。 start-kafka.sh。无需将broker-list.sh添加到kafka容器中。