昨天在 Docker Desktop 2.3.0.2 (45183) 啟用 WSL 2 支援之後,我原本跑在本機 Docker 的 Elasticsearch 就無法啟動了。從 log 下去看,會感覺是記憶體不夠的問題,但是 Docker Desktop 搭配一個較為輕量的 WSL 2 核心引擎,因此從 Docker Desktop 的 Settings 介面卻怎樣也找不到調整 CPU & Memory 的地方,卡了十幾分鐘才找到解決辦法。
啟動 Elasticsearch 的錯誤訊息
以下是啟動過程中 Elasticsearch 意外退出的紀錄:
es01 | ERROR: [1] bootstrap checks failed
es01 | [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
es01 | ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/es-docker-cluster.log
乍看之下,還以為是 Docker Desktop 給 VM 的記憶體不夠,但新版啟用 WSL 2 之後,卻怎樣都找不到調整記憶體用量的地方!後來才發現原來要調整執行 Elasticsearch 時的記憶體參數設定,不過 Docker Desktop 改用 MobyLinuxVM 為一個輕量的 Linux 核心,平常是連不進去的,怎樣調整呢?
調整 MobyLinuxVM 系統參數
想要進入 MobyLinuxVM 可以參考以下步驟:
-
建立一個 Dockerfile
檔案
FROM alpine
RUN apk update && \
apk add util-linux && \
rm -rf /var/cache/apk/*
ENTRYPOINT ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid"]
-
建置 hostenter
容器映象 (image)
docker build . -t hostenter -f Dockerfile
-
執行容器並自動進入 MobyLinuxVM
系統
docker run -it --rm --privileged --pid=host hostenter
-
最後透過 sysctl
調整 vm.max_map_count
核心參數到 Elasticsearch 建議的數值
sysctl -w vm.max_map_count=262144
下次再執行的時候,也可以一行命令完成:
docker run -it --rm --privileged --pid=host hostenter sysctl -w vm.max_map_count=262144
調整完畢之後退出,然後我的 Elasticsearch 就可以順利啟動了!
相關連結