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