【发布时间】:2016-12-03 14:37:08
【问题描述】:
我正在使用来自wurstmeister 的 kafka docker 映像
docker-compose 文件定义了一个卷如/var/run/docker.sock:/var/run/docker.sock
上面的unix socket的用途是什么?
docker 镜像何时应该声明上述卷?
【问题讨论】:
标签: docker apache-kafka docker-compose
我正在使用来自wurstmeister 的 kafka docker 映像
docker-compose 文件定义了一个卷如/var/run/docker.sock:/var/run/docker.sock
上面的unix socket的用途是什么?
docker 镜像何时应该声明上述卷?
【问题讨论】:
标签: docker apache-kafka docker-compose
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 套接字的容器是那些明确管理容器的容器。还有其他机制可用于执行容器配置和发现,不涉及授予容器 root 访问主机的权限,这正是您授予 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/.*:(.*)/\1/g")
fi
当启动他的 Kafka 容器时,他想在 Kafka 容器内执行以下命令(查找到容器的端口映射...):
docker port `hostname` $KAFKA_PORT
请注意,他确实安装了上述卷以便能够执行这样的命令。
来自Docker website的引用(搜索Socket关键字)
【讨论】:
上面的unix socket的用途是什么?
在容器中安装 /var/run/docker.sock 套接字可以访问由 docker 守护进程托管的 Docker Remote API。任何有权访问此套接字的人都可以完全控制 docker 和运行 docker 的主机(本质上是 root 访问)。
docker 镜像何时应该声明上述卷?
很少。如果您正在运行需要在容器内访问 API 的 docker 管理工具,则需要挂载(或可访问 via TCP),以便该工具可以管理托管 docker 守护进程。
作为larsks mentioned,docker-kafka 使用套接字进行配置发现是非常值得怀疑的。
【讨论】:
不需要挂载 docker.sock 文件,可以通过注释掉 kafka-docker/Dockerfile 和 start-kafka.sh 中的相应行来避免。无需将 broker-list.sh 添加到 kafka 容器。
【讨论】: