Docker 设置 - 多个容器之间的网络

Docker Setup - Networking between multiple containers

在我的 linux 服务器上,我有 运行 3 张图像 -

A) Docker 和 Zookeeper 使用此 docker-compose 文件 -

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    ports:
     - "2181:2181"
  kafka:
    image: wurstmeister/kafka:2.11-2.0.0
    ports:
     - "9092:9092"
    expose:
     - "9093"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 

这将为主机打开 kafka 代理。

B) JupyterHub

docker run -v /notebooks:/notebooks -p 8000:8000 jupyterhub

C) Confluent Schema Registry(我还没有尝试过,但在我的最终设置中我也会有一个 schema registry 容器)

docker run confluentinc/cp-schema-registry

两者都可以正常启动,没有任何问题。但是我如何打开 jupyterhub 容器到 kafka 容器和模式注册表端口,以便我的 python 脚本可以访问代理。

我假设您想 运行 按需使用您的 jupyter notebook 容器,而您的 zookeeper 和 kafka 容器将始终 运行 分开?您可以创建一个 docker network 并将所有容器加入该网络。然后您的容器将能够通过它们的名称相互解析。

  1. Create a network
  2. Specify this network in compose file
  3. 使用 docker run 启动其他容器时,请使用 --network 选项。

如果你 运行 docker network ls 那么你可以找到 Compose creates for you 的网络名称;它将被命名为 directoryname_default。然后您可以启动连接到该网络的容器,

docker run --net directoryname_default confluentinc/cp-schema-registry

如果您可以将这些文件包含在同一个 docker-compose.yml 文件中,那么您就不需要做任何特殊的事情。特别是这对于 Confluent 模式注册表可能有意义,如果您使用 Avro 消息,您可以将其视为 Kafka 堆栈的核心部分。

您可以在此处使用 Docker Compose 服务名称 kafka 作为主机名,但由于您需要连接到“内部”侦听器,因此您需要配置一个非默认的端口 9093。(Docker Compose expose: 指令作用不大,您可以安全地删除它。)