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

昨天在 [Docker Desktop](https://hub.docker.com/editions/community/docker-ce-desktop-windows) 2.3.0.2 (45183) [啟用 WSL 2 支援](https://docs.docker.com/docker-for-windows/wsl/)之後，我原本跑在本機 Docker 的 [Elasticsearch](https://www.elastic.co/elasticsearch/) 就無法啟動了。從 log 下去看，會感覺是記憶體不夠的問題，但是 Docker Desktop 搭配一個較為輕量的 WSL 2 核心引擎，因此從 Docker Desktop 的 **Settings** 介面卻怎樣也找不到調整 CPU & Memory 的地方，卡了十幾分鐘才找到解決辦法。

### 啟動 Elasticsearch 的錯誤訊息

以下是啟動過程中 Elasticsearch 意外退出的紀錄：

```log
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` 檔案
    
    ```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)
    
    ```bash
    docker build . -t hostenter -f Dockerfile
    ```
    
3.  執行容器並自動進入 `MobyLinuxVM` 系統
    
    ```bash
    docker run -it --rm --privileged --pid=host hostenter
    ```
    
4.  最後透過 `sysctl` 調整 `vm.max_map_count` 核心參數到 Elasticsearch 建議的數值
    
    ```bash
    sysctl -w vm.max_map_count=262144
    ```
    

下次再執行的時候，也可以一行命令完成：

```bash
docker run -it --rm --privileged --pid=host hostenter sysctl -w vm.max_map_count=262144
```

調整完畢之後退出，然後我的 Elasticsearch 就可以順利啟動了！

### 相關連結

-   [How can I SSH into the Beta's MobyLinuxVM](https://forums.docker.com/t/how-can-i-ssh-into-the-betas-mobylinuxvm/10991)
-   [vm.max\_map\_count \[65530\] is too low in Docker-Windows. · Issue #92 · elastic/elasticsearch-docker](https://github.com/elastic/elasticsearch-docker/issues/92)
