为什么kafka docker需要监听unix套接字

ukxgm1gy  于 2021-06-08  发布在  Kafka
关注(0)|答案(4)|浏览(369)

我正在使用wurstmeister中的docker image for kafka docker compose文件定义一个卷,例如 /var/run/docker.sock:/var/run/docker.sock 以上unix套接字的用途是什么?
docker映像应该何时声明上述卷?

jdzmm42g

jdzmm42g1#

不需要挂载docker.sock文件,可以通过在kafka docker/dockerfile&start-kafka.sh中注解掉适当的行来避免。无需向kafka容器添加broker-list.sh。

olmpazwi

olmpazwi2#

Kafka码头工程正在利用 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 在容器中,它需要访问 /var/run/docker.sock 主机上的插座。
好吧,事实就是这样。以下只是我个人的看法:
坦率地说,我认为这是一个糟糕的想法,应该能够访问docker套接字的容器只有那些显式管理容器的容器。还有其他机制可用于执行容器配置和发现,这些机制不涉及向主机授予容器根访问权限,这正是您在向docker套接字授予某种访问权限时所做的。

wqnecbli

wqnecbli3#

默认情况下,docker守护进程在unix:///var/run/docker.sock上侦听,以仅允许根用户进行本地连接。所以,一般来说,如果我们可以从其他地方访问这个套接字,我们就可以与docker守护进程对话,或者提取关于其他容器的信息。
如果我们希望容器中的一些进程访问docker守护进程(在我们的主机上运行)管理的其他容器的信息,我们可以像上面那样声明卷。让我们看一个来自wurstmeister docker的例子。
docker文件:
在文件末尾,它将调用:

CMD ["start-kafka.sh"]

开始-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容器内执行以下命令(以查找到容器的端口Map…):

docker port `hostname` $KAFKA_PORT

注意,他确实装载了上面的卷,以便能够像这样执行命令。
docker网站的参考(搜索socket关键字)

ars1skjm

ars1skjm4#

以上unix套接字的用途是什么?
安装 /var/run/docker.sock 容器中的套接字提供对docker守护程序托管的docker远程api的访问。任何访问此套接字的人都可以完全控制docker和运行docker的主机(基本上是根访问)。
docker映像应该何时声明上述卷?
很少。如果您正在运行一个docker管理工具,该工具需要在容器内具有api访问权限,那么需要将其装载(或通过tcp访问),以便该工具可以管理托管docker守护程序。
正如larsks提到的,docker kafka使用socket进行配置发现是非常值得怀疑的。

相关问题