我使用来自wurstmeister的kafka的docker image
docker-compose文件定义了诸如/var/run/docker.sock:/var/run/docker.sock
上述unix socket的目的是什么?
泊坞窗图像何时应声明上述音量?
答案 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码头工人的一个例子。
在文件末尾,它将调用:
CMD ["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容器中执行下面的命令(找到映射到容器的端口......):
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容器中。