为什么kafka docker需要在unix socket上监听

我使用wurstmeister的kafka的docker -image docker -compose文件定义了一个卷,例如/var/run/docker.sock:/var/run/docker.sock

上面的unix socket的目的是什么?

docker图像何时应该声明上述音量?

kafka-docker项目使kafka容器中运行的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套接字的容器是那些明确pipe理容器的容器。 还有其他一些机制可用于执行容器configuration和发现,而不涉及向容器提供容器根访问权限,这正是您在访问Docker套接字时正在执行的操作。

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

如果我们想让容器中的某些进程访问由Docker守护进程pipe理的其他容器的信息(在我们的主机上运行),我们可以像上面那样声明这个容器。 我们来看一个wurstmeister docker的例子。

  1. Docker文件 :

在文件末尾,它会调用:

  CMD ["start-kafka.sh"] 
  1. start-kafka.sh

我们来看看第6行:

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

当启动他的Kafka容器时,他想要在Kafka容器内执行下面的命令(find映射到容器的端口…):

 docker port `hostname` $KAFKA_PORT 

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

来自Docker网站的参考(searchSocket关键字)

上面的unix socket的目的是什么?

/var/run/docker.sock套接字装载到容器中,可以访问由docker守护程序托pipe的Docker Remote API 。 任何有权访问此套接字的人都可以完全控制docker和运行docker的主机(实质上是root访问)。

docker图像何时应该声明上述音量?

非常稀有。 如果您正在运行需要在容器中访问API的Dockerpipe理工具,则需要将其装载(或通过TCP访问),以便工具可以pipe理托pipeDocker守护进程。

正如前面提到的 , docker -kafka使用套接字来进行configuration发现是非常有问题的。

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