The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何進入 Docker Desktop 的 MobyLinuxVM 並調整系統參數 (WSL 2)

昨天在 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 可以參考以下步驟:

  1. 建立一個 Dockerfile 檔案

    FROM alpine
    
    RUN apk update && \
        apk add util-linux && \
        rm -rf /var/cache/apk/*
    
    ENTRYPOINT ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid"]
    
  2. 建置 hostenter 容器映象 (image)

    docker build . -t hostenter -f Dockerfile
    
  3. 執行容器並自動進入 MobyLinuxVM 系統

    docker run -it --rm --privileged --pid=host hostenter
    
  4. 最後透過 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 就可以順利啟動了!

相關連結

留言評論