为什么kafka docker需要监听unix socket
why does kafka docker need to listen on unix socket
我正在使用来自 wurstmeister 的 docker kafka 图像
docker-compose 文件定义了一个卷,例如 /var/run/docker.sock:/var/run/docker.sock
上述unix socket的用途是什么?
docker 图像何时应声明上述体积?
kafka-docker 项目正在(有疑问,见下文)使用 docker
命令 运行 在 kafka
容器,以便检查您的 docker 环境。例如,它会像这样确定通告的 kafka 端口:
export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)//g")
有一个 broker-list.sh
脚本可以像这样查找 kafka 代理:
CONTAINERS=$(docker ps | grep 9092 | awk '{print }')
为了 运行 容器内的 docker
cli,它需要访问主机上的 /var/run/docker.sock
套接字。
好的,事实就是这样。以下仅代表个人观点:
我认为坦率地说这是一个糟糕的想法,唯一应该有权访问 docker 套接字的容器是那些显式管理容器的容器。还有其他机制可用于执行容器配置和发现,这些机制不涉及授予容器对主机的根访问权限,这正是您授予对 docker 套接字的访问权限时所做的事情。
默认情况下,Docker 守护程序侦听 unix:///var/run/docker.sock 以仅允许 root 用户进行本地连接。所以,一般来说,如果我们可以从其他地方访问这个套接字,我们可以与 Docker 守护进程对话或提取有关其他容器的信息。
如果我们希望我们容器内的某些进程访问由 Docker 守护进程(我们主机上的运行)管理的其他容器的信息,我们可以像上面那样声明卷。
让我们看一个来自 wurstmeister docker.
的例子
在文件末尾,它会调用:
CMD ["start-kafka.sh"]
我们从第6行来看:
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)//g")
fi
当启动他的 Kafka 容器时,他想在 Kafka 容器内执行以下命令(找到映射到容器的端口...):
docker port `hostname` $KAFKA_PORT
请注意,他确实挂载了上述卷以便能够执行这样的命令。
引用自Docker website(搜索 Socket 关键字)
What is the purpose of the above unix socket?
在容器中安装 /var/run/docker.sock
套接字可以访问 docker 守护程序托管的 Docker Remote API。任何有权访问此套接字的人都可以完全控制 docker 和主机 运行 docker(基本上是根访问)。
When should a docker image declare the above volume?
很少。如果您是 运行 需要 API 访问容器内部的 docker 管理工具,则需要安装(或可访问 via TCP)以便该工具可以管理托管 docker守护进程。
与一样,docker-kafka使用套接字进行配置发现是非常值得怀疑的。
不需要挂载 docker.sock 文件,可以通过在 kafka-docker/Dockerfile & start-kafka.sh 中注释掉适当的行来避免。无需将 broker-list.sh 添加到 kafka 容器。
我正在使用来自 wurstmeister 的 docker kafka 图像
docker-compose 文件定义了一个卷,例如 /var/run/docker.sock:/var/run/docker.sock
上述unix socket的用途是什么?
docker 图像何时应声明上述体积?
kafka-docker 项目正在(有疑问,见下文)使用 docker
命令 运行 在 kafka
容器,以便检查您的 docker 环境。例如,它会像这样确定通告的 kafka 端口:
export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)//g")
有一个 broker-list.sh
脚本可以像这样查找 kafka 代理:
CONTAINERS=$(docker ps | grep 9092 | awk '{print }')
为了 运行 容器内的 docker
cli,它需要访问主机上的 /var/run/docker.sock
套接字。
好的,事实就是这样。以下仅代表个人观点:
我认为坦率地说这是一个糟糕的想法,唯一应该有权访问 docker 套接字的容器是那些显式管理容器的容器。还有其他机制可用于执行容器配置和发现,这些机制不涉及授予容器对主机的根访问权限,这正是您授予对 docker 套接字的访问权限时所做的事情。
默认情况下,Docker 守护程序侦听 unix:///var/run/docker.sock 以仅允许 root 用户进行本地连接。所以,一般来说,如果我们可以从其他地方访问这个套接字,我们可以与 Docker 守护进程对话或提取有关其他容器的信息。
如果我们希望我们容器内的某些进程访问由 Docker 守护进程(我们主机上的运行)管理的其他容器的信息,我们可以像上面那样声明卷。 让我们看一个来自 wurstmeister docker.
的例子在文件末尾,它会调用:
CMD ["start-kafka.sh"]
我们从第6行来看:
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)//g")
fi
当启动他的 Kafka 容器时,他想在 Kafka 容器内执行以下命令(找到映射到容器的端口...):
docker port `hostname` $KAFKA_PORT
请注意,他确实挂载了上述卷以便能够执行这样的命令。
引用自Docker website(搜索 Socket 关键字)
What is the purpose of the above unix socket?
在容器中安装 /var/run/docker.sock
套接字可以访问 docker 守护程序托管的 Docker Remote API。任何有权访问此套接字的人都可以完全控制 docker 和主机 运行 docker(基本上是根访问)。
When should a docker image declare the above volume?
很少。如果您是 运行 需要 API 访问容器内部的 docker 管理工具,则需要安装(或可访问 via TCP)以便该工具可以管理托管 docker守护进程。
与
不需要挂载 docker.sock 文件,可以通过在 kafka-docker/Dockerfile & start-kafka.sh 中注释掉适当的行来避免。无需将 broker-list.sh 添加到 kafka 容器。