如何让docker编写访问外部Kafka/Zookeeper、网络驱动器

如何让docker编写访问外部Kafka/Zookeeper、网络驱动器,docker,apache-kafka,Docker,Apache Kafka,我是Docker的新手,我有以下问题 我的应用程序与卡夫卡对话,我理解为了测试需要一个卡夫卡容器。但是,真正的卡夫卡安装在Docker之外的服务器上。我还需要卡夫卡和动物园管理员码头集装箱吗?我可以将应用程序的Docker容器配置为指向真正的Kafka和zookeeper吗?如果没有,那么如何让Kafka/Zookeeper容器访问真正的Kafka安装 我从Docker的文档中读到“network_mode:bridge”是默认值,但当我明确地将其放入时,会出现无法连接到主机的错误。这就是我把它

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

  • 我的应用程序与卡夫卡对话,我理解为了测试需要一个卡夫卡容器。但是,真正的卡夫卡安装在Docker之外的服务器上。我还需要卡夫卡和动物园管理员码头集装箱吗?我可以将应用程序的Docker容器配置为指向真正的Kafka和zookeeper吗?如果没有,那么如何让Kafka/Zookeeper容器访问真正的Kafka安装

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

  • 我的应用程序需要访问外部网络共享驱动器才能处理文件,并具有这些驱动器的读/写权限。我如何给我的容器这样的访问权限?现在,当我通过一个路径(例如c:\myFolder\MyFile.txt)进行测试时,当我尝试读取附加在/app/c:\myFolder\MyFile.txt上的文件时,它会被附加

  • 这是我的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容器配置为指向真正的Kafka和zookeeper吗

    对。如果您想要实际地读写您的实际生产卡夫卡环境,您需要这样做

    理想情况下,您的应用程序不应该调用属性
    KAFKA\u侦听器
    ,因为这意味着KAFKA服务器本身有一些特殊的功能。生产者代码和消费者代码使用
    bootstrap.servers的属性

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

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

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

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

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

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

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


    你的问题不清楚发生在哪里,因为我不相信汇合Docker图像有一个
    /app
    目录,我也不知道该文件复制到任何其他容器中的位置

    谢谢你,巴德。至于“/app”,我认为它来自生成的Docker文件中的WORKDIR,如下所示。我认为这是相关的,因为我把我的VS2017项目变成了Linux Docker实例,并且我正在传递Windows路径进行测试?除了从头开始重新创建项目之外,我找不到一种简单的方法将VS项目从Linux切换到Windows Docker类型。至于连接到真正的Kafka,我需要设置什么设置才能实现这一点?环境变量KAFKA_advised_LISTENERS仅在我的应用程序中已知,但感谢您指出,我将重命名它。但是,基本上,这个环境变量的值进入bootstrap.servers,当我给它real/prod Kafka服务器的主机名和端口时,它没有连接到它。我之所以需要连接到外部网络,是因为有其他传统的独立服务管理某些网络位置上的文件,我的基于Docker的新微服务需要访问这些位置才能处理文件。但无论如何,
    BOOTSTRAP\u服务器:'external-kafka-1.fqdn.domain:9092,external-kafka-2.fqdn.domain:9092'
    在容器中应该可以正常工作。至少从我所做的所有测试来看,(在Mac上)
    BOOTSTRAP\u服务器
    将是环境变量键。我不确定你是如何在C#中得到这个结果的,但这只是你当前的
    KAFKA_播发的听众的一个重命名
    
    volumes:
        - X:\SomeRemotePath:/path/inside/container