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
然後就成功了,嘿嘿嘿嘿