用WSL2+Docker Desktop部署InLong的坑和经验

WSL的网络坑死了 ————题记

看到腾讯在搞开源,邂逅了Apache InLong,觉得很有意思,就开始研究。

考虑到这是和性能有关的东西,以后说不定还要压测什么的,所以就决定用WSL2+Docker Desktop,不用虚拟机了,

感觉这样性能会好一点,正好也熟悉熟悉命令行,毕竟打CTF虽然天天用Linux但基本能用GUI就GUI哈哈哈哈。

具体方法

先把官网上的源代码下载到WSL虚拟机里面,然后解压,cd到解压的目录下。进入/docker/docker-compose
,执行docker-compose up -d。输入docker ps,看到至少有这几个在跑就没问题了

image
————credit Tencent Rhino Bird

然后按照这个上面的一步一步来:
https://inlong.apache.org/zh-CN/docs/quick_start/data_ingestion/file_pulsar_clickhouse_example

然后大坑就来了,到了添加数据节点那一步,我以为用localhost就可以了,然后我是WSL,localhost并不管用,
所以这时需要 cmd -> ipconfig -> 找到以太网适配器 vEthernet (WSL (Hyper-V firewall)):下面的 IPv4 地址,才是WSL的localhost地址。然而并没有任何作用,死活连不上,后来lsof -i :8123,一看,好家伙,端口都没开,但明明docker在跑啊。看了下,config.xml的listen-port全被注释了,于是我把0.0.0.0取消注释了,没有任何用处。结果一看clickhouse的errlog,更加有意思了,显示端口全被占了,啥玩意🤣?
然后就在这里被困了很久。于是尝试用自带的mysql,结果发现好的,肯定了是起clickhouse docker时候的问题。
但这是官方给的啊,能有啥问题啊? 问题就是官方用的ssh远程Linux主机,我是WSL,后来问了GPT,说是有网络隔离,官方给的指令是docker run -d --rm --net=host --name clickhouse -e CLICKHOUSE_USER=admin -e CLICKHOUSE_PASSWORD=inlong -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 clickhouse/clickhouse-server:22.8
问题出在--net=host 上面,

WSL 和 Docker Desktop 的网络环境

  1. WSL 网络隔离

    • WSL 为 Linux 子系统提供了一个虚拟化的网络环境,这个网络是与 Windows 主机系统隔离的。这意味着,即使在 WSL 中运行的应用程序监听某个端口,这个端口也只是在 WSL 的虚拟网络环境中开放,并不直接映射到 Windows 主机的网络环境上。
  2. Docker Desktop 和 Hyper-V/WSL2 虚拟化

    • Docker Desktop 在 Windows 上使用 Hyper-V (或者在更新的版本中使用 WSL2) 来运行 Docker 引擎和容器。这些容器实际上运行在一个由 Hyper-V 或 WSL2 提供的虚拟机中。与 WSL 类似,这种设置在网络层面上也实现了与 Windows 主机的隔离。
    • 当使用 --net=host 时,在纯 Linux 系统上,容器会直接使用宿主机的网络堆栈。但在 Windows 上,由于 Docker 容器实际上运行在一个虚拟化环境中,--net=host 并不会使容器网络直接与 Windows 主机网络堆栈合并。相反,它只会使容器访问到虚拟机(或 WSL2 环境)的网络堆栈。
  3. 网络端口映射和访问限制

    • 因此,在使用 Docker Desktop 时,即便设置了 --net=host,容器监听的端口也只在虚拟化层面(即 Hyper-V 或 WSL2)内部可见,而不是在 Windows 主机的网络环境中。这就是为什么你在 Windows 或 WSL 环境中用常规方法检查端口时,找不到相应的监听端口的原因。

解决方案和最佳实践

  • 在 Windows 上使用 Docker 时,最好避免使用 --net=host,因为它不会像在 Linux 系统上那样工作。相反,推荐使用 -p--publish 参数来映射容器内部端口到 Windows 主机上的端口。这种方式能确保端口映射正确,且容器服务可从外部网络访问。
  • 确保了解和适应 Docker 在不同操作系统上的网络行为差异,特别是在复杂的开发环境或多操作系统环境中使用 Docker 时。

通过采用这些策略,你可以更有效地在 Windows 上利用 Docker,同时避免常见的网络配置问题。
所以亲测可以使用的docker启动命令为 docker run -d --name clickhouse -p 8123:8123 -p 9000:9000 -p 9004:9004 -p 9009:9009 -e CLICKHOUSE_USER=admin -e CLICKHOUSE_PASSWORD=inlong -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 clickhouse/clickhouse-server:22.8

然后就成功了,嘿嘿嘿嘿。注意clickhouse的ip需要用wsl中ifconfig eth0的ip,而不是windows cmd中ipconfig以太网适配器 vEthernet (WSL (Hyper-V firewall))的地址

有的时候会碰到运行docker命令卡死的情况,一般运行一会儿之后才会出现这个问题,只需要进入docket的setting把Resource Saver关了就行
image

这Pulsar不停地挂掉,我发现网上也有这个问题

Caused by: org.asynchttpclient.handler.MaxRedirectException: Maximum redirect reached: 5
2024-07-04 00:00:42 16:00:42.192 [pulsar-io-29-1] INFO  org.apache.pulsar.broker.service.ServerCnx - New connection from /172.18.0.7:56686
2024-07-04 00:00:42 16:00:42.209 [pulsar-io-29-1] INFO  org.apache.pulsar.broker.service.ServerCnx - Closed connection from /172.18.0.7:56686
2024-07-04 00:01:10 16:00:48.246 [Thread-0] INFO  org.apache.pulsar.broker.service.GracefulExecutorServicesTerminationHandler - Starting termination handler for 4 executors.
2024-07-04 00:01:10 16:00:48.332 [Thread-0] INFO  org.apache.pulsar.broker.service.GracefulExecutorServicesTerminationHandler - Shutdown completed.
2024-07-04 00:01:10 16:00:51.957 [globalEventExecutor-2-5] INFO  org.apache.pulsar.broker.service.GracefulExecutorServicesTerminationHandler - Starting termination handler for 7 executors.
2024-07-04 00:01:10 16:00:51.972 [globalEventExecutor-2-5] INFO  org.apache.pulsar.broker.service.GracefulExecutorServicesTerminationHandler - Shutdown completed.
2024-07-04 00:01:10 16:00:56.729 [BookKeeperClientWorker-OrderedExecutor-0-0] ERROR org.apache.bookkeeper.client.MetadataUpdateLoop - UpdateLoop(ledgerId=615,loopId=70fad7cc) Error writing metadata to store
posted @ 2024-07-03 22:02  peterzh6  阅读(102)  评论(0编辑  收藏  举报