用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
,看到至少有这几个在跑就没问题了
————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 的网络环境
-
WSL 网络隔离:
- WSL 为 Linux 子系统提供了一个虚拟化的网络环境,这个网络是与 Windows 主机系统隔离的。这意味着,即使在 WSL 中运行的应用程序监听某个端口,这个端口也只是在 WSL 的虚拟网络环境中开放,并不直接映射到 Windows 主机的网络环境上。
-
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 环境)的网络堆栈。
-
网络端口映射和访问限制:
- 因此,在使用 Docker Desktop 时,即便设置了
--net=host
,容器监听的端口也只在虚拟化层面(即 Hyper-V 或 WSL2)内部可见,而不是在 Windows 主机的网络环境中。这就是为什么你在 Windows 或 WSL 环境中用常规方法检查端口时,找不到相应的监听端口的原因。
- 因此,在使用 Docker Desktop 时,即便设置了
解决方案和最佳实践
- 在 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关了就行
这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