如何使docker compose访问外部kafka/zookeeper、网络驱动器

mbjcgjjk  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(572)

我是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文件。

  1. version: '3.4'
  2. services:
  3. my.app.api.producer:
  4. #network_mode: bridge
  5. image: ${DOCKER_REGISTRY}myappapiproducer
  6. build:
  7. context: .
  8. dockerfile: Source/My.App.Api.Producer/Dockerfile
  9. ports:
  10. - "8082:80"
  11. environment:
  12. KAFKA_ADVERTISED_LISTENERS: 'kafka:9092'
  13. #KAFKA_ADVERTISED_LISTENERS: 'kafka-manager.my.domain.com:9092'
  14. SCHEMA_REGISTRY_CONNECTION_URL: 'schema_registry:8081'
  15. KAFKA_DURABILITY_ACKS: '1'
  16. TOPIC_NAME_PUB: 'paas.my.app.v1.us-west.dev.in'
  17. depends_on:
  18. - kafka
  19. - schema_registry
  20. my.app.consoleapp:
  21. #network_mode: bridge
  22. image: ${DOCKER_REGISTRY}myappconsoleapp
  23. build:
  24. context: .
  25. dockerfile: Source/My.App.ConsoleApp/Dockerfile
  26. environment:
  27. KAFKA_ADVERTISED_LISTENERS: 'kafka:9092'
  28. #KAFKA_ADVERTISED_LISTENERS: 'kafka-manager.my.domain.com:9092'
  29. SCHEMA_REGISTRY_CONNECTION_URL: 'schema_registry:8081'
  30. KAFKA_DURABILITY_ACKS: '1'
  31. TOPIC_NAME_PUB: 'paas.my.app.v1.us-west.dev.out'
  32. TOPIC_NAME_SUB: 'paas.my.app.v1.us-west.dev.in'
  33. KAFKA_ENABLE_AUTO_COMMIT: 'false'
  34. KAFKA_SESSION_TIMEOUT_MS: '60000'
  35. depends_on:
  36. - kafka
  37. - schema_registry
  38. zookeeper:
  39. #network_mode: bridge
  40. image: confluentinc/cp-zookeeper
  41. hostname: zookeeper
  42. ports:
  43. - "2181:2181"
  44. environment:
  45. ZOOKEEPER_CLIENT_PORT: 2181
  46. ZOOKEEPER_TICK_TIME: 2000
  47. kafka:
  48. #network_mode: bridge
  49. image: confluentinc/cp-kafka
  50. #hostname: kafka
  51. hostname: kafka-manager.my.domain.com
  52. depends_on:
  53. - zookeeper
  54. ports:
  55. - "9092:9092"
  56. environment:
  57. KAFKA_BROKER_ID: 1
  58. KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
  59. KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:9092'
  60. KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
  61. schema_registry:
  62. #network_mode: bridge
  63. image: confluentinc/cp-schema-registry
  64. hostname: schema_registry
  65. depends_on:
  66. - zookeeper
  67. - kafka
  68. ports:
  69. - "8081:8081"
  70. environment:
  71. SCHEMA_REGISTRY_HOST_NAME: schema_registry
  72. SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181'

dockerfile文件:

  1. # Stage 1
  2. FROM microsoft/dotnet:2.0-runtime-jessie AS base
  3. WORKDIR /app
  4. # Stage 2
  5. FROM microsoft/dotnet:2.0-sdk-jessie AS builder
  6. WORKDIR /src
  7. COPY Source/My.App.ConsoleApp/My.App.ConsoleApp.csproj Source/My.App.ConsoleApp/
  8. COPY Source/My.App.Schemas/My.App.Schemas.csproj Source/My.App.Schemas/
  9. COPY Source/My.App.Domain/My.App.Domain.csproj Source/My.App.Domain/
  10. COPY Source/My.App.PubSub/My.App.PubSub.csproj Source/My.App.PubSub/
  11. RUN dotnet restore Source/My.App.ConsoleApp/My.App.ConsoleApp.csproj
  12. COPY . .
  13. WORKDIR /src/Source/My.App.ConsoleApp
  14. RUN dotnet build My.App.ConsoleApp.csproj -c Release -o /app
  15. # Stage 3 - Testing stage - This is not working, so spend time on making the test stage to work.
  16. FROM builder AS test
  17. WORKDIR /src/Tests/UnitTests/My.App.Domain.UnitTests
  18. RUN dotnet test
  19. # Stage 4
  20. FROM builder AS publish
  21. RUN dotnet publish My.App.ConsoleApp.csproj -c Release -o /app
  22. # Stage 5
  23. FROM base AS production
  24. WORKDIR /app
  25. COPY --from=publish /app .
  26. ENTRYPOINT ["dotnet", "My.App.ConsoleApp.dll"]
q1qsirdb

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卷作为该路径。
(注:我没有亲自测试过)

  1. volumes:
  2. - X:\SomeRemotePath:/path/inside/container

当我尝试读取文件时,它会附加/app/c:\myfolder\myfile.txt
你的问题不清楚发生在哪里,因为我不相信融合的docker图像有一个 /app 目录,我不知道该文件复制到任何其他容器的位置。

展开查看全部

相关问题