【问题标题】:why does kafka docker need to listen on unix socket为什么kafka docker需要监听unix socket
【发布时间】: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


    【解决方案1】:

    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 套接字访问权限时所做的事情。

    【讨论】:

      【解决方案2】:

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

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

      1. Docker file:

      在文件末尾,它会调用:

       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 容器内执行以下命令(查找到容器的端口映射...):

      docker port `hostname` $KAFKA_PORT 
      

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

      来自Docker website的引用(搜索Socket关键字)

      【讨论】:

        【解决方案3】:

        上面的unix socket的用途是什么?

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

        docker 镜像何时应该声明上述卷?

        很少。如果您正在运行需要在容器内访问 API 的 docker 管理工具,则需要挂载(或可访问 via TCP),以便该工具可以管理托管 docker 守护进程。

        作为larsks mentioned,docker-kafka 使用套接字进行配置发现是非常值得怀疑的。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-22
            • 2010-11-08
            • 1970-01-01
            • 1970-01-01
            • 2021-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多