【问题标题】:how to make docker-compose access external Kafka/Zookeeper, network drives如何让 docker-compose 访问外部 Kafka/Zookeeper、网络驱动器
【发布时间】:2018-12-31 05:50:29
【问题描述】:

我是 Docker 新手,我有以下问题。

  1. 我的应用程序与 Kafka 通信,并且我了解为了测试需要 Kafka 容器。但是,真正的 Kafka 安装存在于 Docker 之外的自己的服务器上。我还需要 Kafka 和 Zookeeper Docker 容器吗?我可以将我的应用程序的 Docker 容器配置为指向真正的 Kafka 和 zookeeper 吗?如果没有,那么如何让 Kafka/Zookeeper 容器访问真正的 Kafka 安装?

  2. 我从 Docker 的文档中读到“network_mode:bridge”是默认值,但是当我明确地将它放入时,我得到了无法连接到主机的错误。这就是我将其注释掉的原因,如果有人能回答我为什么,我将不胜感激?

  3. 我的应用需要访问外部网络共享驱动器来处理文件并拥有这些驱动器的读/写权限。我如何给我的容器这样的访问权限?现在在我通过路径时进行测试,例如c:\myFolder\MyFile.txt,当我尝试读取文件时,它会被 /app/C:\myFolder\MyFile.txt

  4. 附加

这是我的 docker-compose.yml 文件。

version: '3.4'

services:
  my.app.api.producer:
    #network_mode: bridge
    image: ${DOCKER_REGISTRY}myappapiproducer
    build:
      context: .
      dockerfile: Source/My.App.Api.Producer/Dockerfile
    ports:
      - "8082:80"
    environment:
      KAFKA_ADVERTISED_LISTENERS: 'kafka:9092'
      #KAFKA_ADVERTISED_LISTENERS: 'kafka-manager.my.domain.com:9092'
      SCHEMA_REGISTRY_CONNECTION_URL: 'schema_registry:8081'
      KAFKA_DURABILITY_ACKS: '1'
      TOPIC_NAME_PUB: 'paas.my.app.v1.us-west.dev.in'
    depends_on:
      - kafka
      - schema_registry

  my.app.consoleapp:
    #network_mode: bridge
    image: ${DOCKER_REGISTRY}myappconsoleapp
    build:
      context: .
      dockerfile: Source/My.App.ConsoleApp/Dockerfile
    environment:
      KAFKA_ADVERTISED_LISTENERS: 'kafka:9092'
      #KAFKA_ADVERTISED_LISTENERS: 'kafka-manager.my.domain.com:9092'
      SCHEMA_REGISTRY_CONNECTION_URL: 'schema_registry:8081'
      KAFKA_DURABILITY_ACKS: '1'
      TOPIC_NAME_PUB: 'paas.my.app.v1.us-west.dev.out'
      TOPIC_NAME_SUB: 'paas.my.app.v1.us-west.dev.in'
      KAFKA_ENABLE_AUTO_COMMIT: 'false'
      KAFKA_SESSION_TIMEOUT_MS: '60000'
    depends_on:
      - kafka
      - schema_registry

  zookeeper:
    #network_mode: bridge
    image: confluentinc/cp-zookeeper
    hostname: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    #network_mode: bridge
    image: confluentinc/cp-kafka
    #hostname: kafka
    hostname: kafka-manager.my.domain.com
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:9092'
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

  schema_registry:
    #network_mode: bridge
    image: confluentinc/cp-schema-registry
    hostname: schema_registry
    depends_on:
      - zookeeper
      - kafka
    ports:
      - "8081:8081"
    environment:
      SCHEMA_REGISTRY_HOST_NAME: schema_registry
      SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181'

Dockerfile:

# Stage 1
FROM microsoft/dotnet:2.0-runtime-jessie AS base
WORKDIR /app

# Stage 2
FROM microsoft/dotnet:2.0-sdk-jessie AS builder
WORKDIR /src
COPY Source/My.App.ConsoleApp/My.App.ConsoleApp.csproj Source/My.App.ConsoleApp/
COPY Source/My.App.Schemas/My.App.Schemas.csproj Source/My.App.Schemas/
COPY Source/My.App.Domain/My.App.Domain.csproj Source/My.App.Domain/
COPY Source/My.App.PubSub/My.App.PubSub.csproj Source/My.App.PubSub/
RUN dotnet restore Source/My.App.ConsoleApp/My.App.ConsoleApp.csproj
COPY . .
WORKDIR /src/Source/My.App.ConsoleApp
RUN dotnet build My.App.ConsoleApp.csproj -c Release -o /app

# Stage 3 - Testing stage - This is not working, so spend time on making the test stage to work.
FROM builder AS test
WORKDIR /src/Tests/UnitTests/My.App.Domain.UnitTests
RUN dotnet test

# Stage 4
FROM builder AS publish
RUN dotnet publish My.App.ConsoleApp.csproj -c Release -o /app

# Stage 5
FROM base AS production
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "My.App.ConsoleApp.dll"]

【问题讨论】:

    标签: docker apache-kafka


    【解决方案1】:

    我可以将我的应用程序的 Docker 容器配置为指向真正的 Kafka 和 zookeeper 吗?

    是的。如果您想实际读写实际的生产 Kafka 环境,则需要这样做。

    理想情况下,您的应用不应该调用属性KAFKA_ADVERTISED_LISTENERS,因为这对于 Kafka 服务器本身来说意味着一些特殊的东西。生产者和消费者代码使用bootstrap.servers 的属性。

    "network_mode: bridge" 是默认值,但是当我明确将其放入时,我会收到无法连接到主机的错误。

    取决于您的主机操作系统,但理想情况下,您无论如何都不需要从容器内部访问主机上的进程/网络地址。 Docker Compose 服务可以通过它们的服务名称相互访问。因此,在您的应用程序代码中,您只需要 kafka:9092http://schema_registry:8083(假设这些容器也在运行)。

    否则,在使用实际的 Kafka 服务器时,您需要使用代码中的适当方法从环境变量中获取这些值。

    应用需要访问外部网络共享驱动器才能处理文件并拥有这些驱动器的读/写权限。我如何给我的容器这样的访问权限?

    您应该在 Windows 中挂载一个 NFS 文件系统,然后您可以为该路径使用 Docker 卷。

    (注意:我没有亲自测试过)

    volumes:
        - X:\SomeRemotePath:/path/inside/container
    

    当我尝试读取文件时,它会被 /app/C:\myFolder\MyFile.txt 附加

    从您的问题中不清楚这是在哪里发生的,因为我不相信 Confluent Docker 映像具有 /app 目录,并且我无法确定该文件复制到任何其他容器的位置。

    【讨论】:

    • 谢谢老兄。至于“/app”,我认为它来自生成的 Docker 文件中的 WORKDIR,如下所示。我认为这是相关的,因为我已经将我的 VS2017 项目设为 Linux Docker 实例,并且我正在传递 Windows 路径进行测试?除了从头开始重新创建项目之外,我找不到将 VS 项目从 Linux 切换到 Windows Docker 类型的简单方法。
    • 就连接到真正的 Kafka 而言,我需要设置哪些设置才能实现这一点?环境变量 KAFKA_ADVERTISED_LISTENERS 仅对我的应用程序已知,但感谢您指出,我将重命名它。但是,基本上这个环境变量的值会进入 bootstrap.servers,当我给它提供真实/生产 Kafka 服务器的主机名和端口时,它并没有连接到它。
    • 我需要访问外部网络的原因是因为还有其他遗留的独立服务可以管理某些网络位置上的文件,而我的新基于 Docker 的微服务需要访问这些位置才能执行某些操作与文件。
    • 但无论如何,BOOTSTRAP_SERVERS: 'external-kafka-1.fqdn.domain:9092,external-kafka-2.fqdn.domain:9092' 在容器中应该可以正常工作。至少从我在(来自 Mac)中所做的所有测试来看
    • BOOTSTRAP_SERVERS 将是环境变量键。你如何在 C# 中得到它,我不确定,但这只是你当前 KAFKA_ADVERTISED_LISTENERS 值的重命名
    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2019-11-14
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多