【问题标题】:How to communicate between docker container including localhost machine [duplicate]如何在包括本地主机机器的docker容器之间进行通信[重复]
【发布时间】:2025-12-19 20:45:12
【问题描述】:

我的问题:

version: '2'
services:
  zookeeper:
    container_name: zookeeper
    image: debezium/zookeeper:${DEBEZIUM_VERSION}
    ports:
     - 2181:2181
     - 2888:2888
     - 3888:3888
  kafka:
    container_name: kafka
    image: debezium/kafka:${DEBEZIUM_VERSION}
    ports:
     - 9092:9092
    links:
     - zookeeper
    environment:
     - ZOOKEEPER_CONNECT=zookeeper:2181  
  connect:
    container_name: connect
    image: debezium/connect:${DEBEZIUM_VERSION}
    ports:
     - 8083:8083
    links:
     - kafka
    environment:
     - BOOTSTRAP_SERVERS=kafka:9092
     - GROUP_ID=1
     - CONFIG_STORAGE_TOPIC=my_connect_configs
     - OFFSET_STORAGE_TOPIC=my_connect_offsets
     - STATUS_STORAGE_TOPIC=my_connect_statuses

这里我希望connect 容器调用我的本地主机 PostGres

但它是 throws cannot connect to jdbs:postgresql//localhost:5432/test error

那么我该如何设置connect的网络以便

  1. 可以发现zookeeperkafka
  2. 它也可以连接到我的本地主机

PS 我尝试在连接中添加 network_mode: host,但它没有发现kafka和zookeeper

【问题讨论】:

标签: docker docker-compose docker-networking docker-network


【解决方案1】:

connect 的本地主机是 docker 的专用网络,而不是你的计算机本地主机,显然你的 postgres 是。

您需要使用network_mode: host,但当然其他 2 个容器在专用网络上将无法访问。所以解决方案是对所有容器使用network_mode: host,或者将您的 postgres 带到与 docker 容器相同的 docker-compose 文件中,以便它也在专用网络上

【讨论】:

  • 或者只是在连接字符串中使用 DNS 主机名或 IP。也就是说,如果 Postgres 本身不在容器中。
  • network_mode: host 通常会禁用 Docker 网络,我通常不会推荐它。上面链接的规范问题描述了一些其他有效的路径(特别是在 MacOS 或 Windows 主机上)。