如何使docker-compose访问外部Kafka / Zookeeper,网络驱动器

时间:2018-07-23 17:43:58

标签: docker apache-kafka

我是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"]

1 个答案:

答案 0 :(得分:1)

  

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

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

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

  

“ network_mode:bridge”是默认值,但是当我明确地将其放入时,出现无法连接主机的错误。

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

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

  

app要求访问外部网络共享驱动器以处理文件并具有这些驱动器的读/写权限。如何授予我的容器这种访问权限?

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

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

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

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

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