【问题标题】:Docker networking cannot connect to local IP in ContainerDocker 网络无法连接到容器中的本地 IP
【发布时间】:2020-12-17 20:54:05
【问题描述】:

在网络方面有点新手......

  • 我有一个使用 Docker Swarm 在笔记本电脑上的 2 个 Vbox 虚拟机上运行的 Kafka 集群(1 个主节点和 1 个工作节点)。此 VM 具有设置为单个 IP 地址的网桥适配器。确切的 YAML 是
enp0s8:
      dhcp4: no
      renderer: networkd
      addresses: [192.168.0.50/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
  • 我尝试运行连接到我的 Kafka 集群的本地 Python 脚本。当我在笔记本电脑上执行此操作时,此方法有效,但是当我在 Docker 容器中运行相同的 Python 脚本时,它不起作用!

这几乎可以将其范围缩小到网络问题。我尝试使用--net=host 运行容器,但它仍然无法正常工作。困惑为什么我的 Docker 容器无法连接到虚拟机的 IP 地址,但在我的 macbook 本地运行良好。

编辑:

为了进一步说明 Python 脚本... 整个脚本在这里:

from kafka.consumer import KafkaConsumer

def create_kafka_consumer(topic, group_id, brokers):
    return KafkaConsumer(topic,
                         bootstrap_servers=brokers,
                         auto_offset_reset='earliest',
                         enable_auto_commit=True,
                         group_id=group_id,
                         value_deserializer=lambda x: x.decode('utf-8'))

GROUP_ID = 'test'
def main():
    topic ='airbnb'
    c = create_kafka_consumer(topic, 'tester', '192.168.0.51:9093')
    for msg in c:
        print(msg)

if __name__ == '__main__':
    main()

IP 地址和端口用于 Kafka WORKER 节点(在 Virtual Box 中运行),而不是主节点(上面列出的 IP 地址)。我在VM中设置了IP,并且在docker-compose文件中手动设置了端口。

成功输出示例(只打印所有kafka日志):

ConsumerRecord(topic='airbnb', partition=0, offset=169, timestamp=1598650807052, timestamp_type=0, key=None, value='adivinen quien cogio un airbnb para salir de la rutina y tiene que trabajar el周末? ', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=111, serialized_header_size=-1) ConsumerRecord(topic='airbnb', partition=0, offset=170, timestamp=1598650821359, timestamp_type=0, key=None, value='This x100%', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=10, serialized_header_size=-1)

不成功的输出:

Traceback(最近一次调用最后一次): 文件“tmp/consumer-kafka.py”,第 21 行,在 主要的() 文件“tmp/consumer-kafka.py”,第 16 行,在 main c = create_kafka_consumer(主题,“测试者”,“192.168.0.51:9093”) 文件“tmp/consumer-kafka.py”,第 11 行,在 create_kafka_consumer value_deserializer=lambda x: x.decode('utf-8')) init 中的文件“/usr/local/lib/python3.6/site-packages/kafka/consumer/group.py”,第 355 行 self._client = KafkaClient(metrics=self._metrics, **self.config) init 中的文件“/usr/local/lib/python3.6/site-packages/kafka/client_async.py”,第 242 行 self.config['api_version'] = self.check_version(timeout=check_timeout) 文件“/usr/local/lib/python3.6/site-packages/kafka/client_async.py”,第 925 行,在 check_version 引发 Errors.NoBrokersAvailable() kafka.errors.NoBrokersAvailable: NoBrokersAvailable

Kafka worker netstat -ntl 命令输出:

【问题讨论】:

  • 您能说明一下您使用的是什么操作系统吗?同样重申一下,您正在尝试将您的 python 脚本所在的 docker 容器连接到 VirtualBox kafka 集群;对吗?
  • 除上述之外,查看命令运行和输出(包括错误)会很有帮助。另外,您能否显示ss -ntlnetstat -ntl 的输出,以便我们可以看到Kafka 监听套接字?通常,如果您正在运行 Docker for Mac 或 Docker for Windows,您可以从 host.docker.internal 的容器访问主机上的服务。
  • 为什么不在容器中运行 Kafka?此外,根据主机操作系统,容器无论如何都会在自己的 VM 中运行
  • @khariSeeng - Mac OSx Mojave。是的,带有脚本的容器正在尝试连接到 Vbox Kafka 集群(kafka 也在 vbox 中的 docker swarm 上运行)。
  • @AndyShinn - 我将为此问题添加更多详细信息

标签: docker networking apache-kafka


【解决方案1】:

您是否尝试过在运行 docker 容器时使用 --link 选项与 2 个容器通信,这将在 /etc/hosts 文件中添加一个条目(或者您可以手动尝试并检查)

我认为这可能会对您有所帮助:https://docs.docker.com/network/links/

youtube:https://www.youtube.com/results?search_query=docker+linking+multiple+containers

如果两者都不适合您在 docker 中使用一些 DNS 进行的适合研究,这可能与 DNS 相关 :-)

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多