我是docker的新手,我有以下问题。
我的应用程序与kafka对话,我理解为了测试需要一个kafka容器。但是,真正的Kafka安装存在于docker之外的服务器上。我还需要Kafka和zookeeper docker集装箱吗?我可以配置我的应用程序的docker容器来指向真正的kafka和zookeeper吗?如果没有,那么如何让kafka/zookeeper容器访问真正的kafka安装?
我从docker的文档中看到,“network\u 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"]
1条答案
按热度按时间q1qsirdb1#
我可以配置我的应用程序的docker容器来指向真正的kafka和zookeeper吗?
对。如果您真的想读写您的实际生产Kafka环境,您需要这样做。
你的应用最好不要调用属性
KAFKA_ADVERTISED_LISTENERS
,因为这对kafka服务器本身意味着一些特殊的东西。生产者和消费者代码使用bootstrap.servers
.“network\u mode:bridge”是默认值,但当我显式地将其放入时,会出现无法连接到主机的错误。
取决于您的主机操作系统,但理想情况下,您不需要从容器内部访问主机上的进程/网络地址。docker compose服务可以通过它们的服务名称相互联系。所以,在你的应用程序代码中,你只需要
kafka:9092
或者http://schema_registry:8083
(假设这些容器也在运行)。否则,在使用实际的kafka服务器时,需要使用代码中的适当方法从环境变量中获取这些值。
应用程序需要访问外部网络共享驱动器才能处理文件,并且对这些驱动器具有读/写权限。我如何给我的容器这样的访问权限?
您应该在windows中挂载nfs文件系统,然后可以使用docker卷作为该路径。
(注:我没有亲自测试过)
当我尝试读取文件时,它会附加/app/c:\myfolder\myfile.txt
你的问题不清楚发生在哪里,因为我不相信融合的docker图像有一个
/app
目录,我不知道该文件复制到任何其他容器的位置。