11
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

(M1)Limaを使ってDockerを爆速化する(VScodeのremote-containerとの連携も)

Posted at

はじめに

Docker Desktop for Mac よりも Docker + Lima の方が速いらしいので実装してみました.

Limaは仮想環境の一つです.windowsでWSLを使用したことがある人は似たようなものらしいです(詳しくは分からん).

MacBook Air(M1, 2020), macOS Monterey バージョン12.1で動作確認しました.

パッケージのインストール

最初に必要なパッケージをインストールします.

  • wget

    brew install wget

  • Lima

    brew install lima

  • Docker, Docker Compose

    brew install docker

    brew install docker-compose

Limaのyamlファイルを作成

Limaは「構築したい環境」についてyamlファイルに記述します.
yaml2Lima.png
今回は「Dockerの環境を記述したyamlファイル」を準備します.
一からyamlファイルを作成することもできますが,あらかじめ用意してあるサンプルが存在するので, docker.yamlをダウンロード、一部を編集して使用することにします.

  1. 適当な場所に docker.yaml をダウンロードします.

    wget https://github.com/lima-vm/lima/raw/master/examples/docker.yaml
    
  2. ダウンロードした docker.yaml に下記を追記します.

    • リソースを変更します.皆さんの使用したい環境によって適切な値を設定してください

      cpus: 2
      memory: "8GiB"
      disk: "20GiB"
      

- sshによるエラーが起こる可能性があるらしいので `loadDotSSHPubKeys: false` を設定して回避します.また, `localPort` でポートの番号を指定します.
    ```yaml
    ssh:
      loadDotSSHPubKeys: false
      localPort: 60006
    ```

- Limaの仮想環境内の「指定したディレクトリ配下にあるファイル」に書き込み権限を与えます.(**デフォルトでは読み込み権限しか与えられていないので,編集できません**)
    下の例では, `~` 以下全てのディレクトリ内のファイルに書き込み権限を与えています ( `~` をtrueにするのは、あまり推奨されていないので、気になる人は `location` に指定するディレクトリを細かく決めましょう)
    
    ```yaml
    mounts:
    	- location: "~"
          writable: true # ダウンロードした時点では,この行がないと思うので追記
    ```

最終的な `docker.yaml` は以下になります
# Example to use Docker instead of containerd & nerdctl
# $ limactl start ./docker.yaml
# $ limactl shell docker docker run -it -v $HOME:$HOME --rm alpine

# To run `docker` on the host (assumes docker-cli is installed):
# $ export DOCKER_HOST=$(limactl list docker --format 'unix://{{.Dir}}/sock/docker.sock')
# $ docker ...

# This example requires Lima v0.8.0 or later
images:
# Hint: run `limactl prune` to invalidate the "current" cache
- location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.img"
  arch: "x86_64"
- location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-arm64.img"
  arch: "aarch64"
mounts:
- location: "~"
  writable: true
- location: "/tmp/lima"
  writable: true
containerd:
  system: false
  user: false
provision:
- mode: system
  script: |
    #!/bin/sh
    sed -i 's/host.lima.internal.*/host.lima.internal host.docker.internal/' /etc/hosts
- mode: system
  script: |
    #!/bin/bash
    set -eux -o pipefail
    command -v docker >/dev/null 2>&1 && exit 0
    export DEBIAN_FRONTEND=noninteractive
    curl -fsSL https://get.docker.com | sh
    # NOTE: you may remove the lines below, if you prefer to use rootful docker, not rootless
    systemctl disable --now docker
    apt-get install -y uidmap dbus-user-session
- mode: user
  script: |
    #!/bin/bash
    set -eux -o pipefail
    systemctl --user start dbus
    dockerd-rootless-setuptool.sh install
    docker context use rootless
probes:
- script: |
    #!/bin/bash
    set -eux -o pipefail
    if ! timeout 30s bash -c "until command -v docker >/dev/null 2>&1; do sleep 3; done"; then
      echo >&2 "docker is not installed yet"
      exit 1
    fi
    if ! timeout 30s bash -c "until pgrep rootlesskit; do sleep 3; done"; then
      echo >&2 "rootlesskit (used by rootless docker) is not running"
      exit 1
    fi
  hint: See "/var/log/cloud-init-output.log". in the guest
portForwards:
- guestSocket: "/run/user/{{.UID}}/docker.sock"
  hostSocket: "{{.Dir}}/sock/docker.sock"
message: |
  To run `docker` on the host (assumes docker-cli is installed), run the following commands:
  ------
  docker context create lima --docker "host=unix://{{.Dir}}/sock/docker.sock"
  docker context use lima
  docker run hello-world
  ------

ssh:
  loadDotSSHPubKeys: false
  localPort: 60006

cpus: 2
memory: "8GiB"
disk: "20GiB"

環境構築

docker.yaml に定義されたLimaの仮想環境を構築します.
lima_start.png

limactl start ./docker.yaml

yamlファイルを編集する時の注意点

一度構築した仮想環境は,yamlファイル(今回の場合 docker.yaml)を修正しただけでは反映されません.yamlファイルを変更した場合は,仮想環境を再作成する必要があります.
具体的には, limactl stop docker で仮想環境を停止し、limactl rm docker で仮想環境を削除した後に再作成してください.

DOCKER_HOST 環境変数の上書き

ここまでで,おおよその設定は完了しました.
しかし,毎回「 docker.yamlのLimaの仮想環境」に入ってから、dockerのデーモンを起動するのは面倒です.

そこで、 docker コマンドを使用した時に、「Docker Desktop for MacのDockerデーモン(下図左)」ではなく、「Limaの仮想環境内のDockerデーモン(下図右)」にアクセスされるようにします.
※ この辺りは詳しくないので,解釈が間違っているかも知れません.詳しい構成についてはyoichiwo7さんの記事に詳しくまとめてあります.
lima.png

具体的には, DOCKER_HOSTのURLを変更するとことで「Limaの仮想環境内のDockerデーモン(上図右)」にアクセスされるようになります.

また,毎回 DOCKER_HOST を書き換えるのは面倒なので.zshrc に追記しておくといいと思います.
今回の場合は,.zshrc に下記を追記すればOKです.

export DOCKER_HOST=unix:///${HOME}/.lima/docker/sock/docker.sock

シェル起動時に仮想環境を起動

パソコンの再起動を行うと仮想環境はstopの状態になります.そのため,パソコンを再起動するごとに,仮想環境をstartする必要がありこれまた面倒です.

そこで,先程と同様に.zshrcに仮想環境を立ち上げるように追記することで、自動起動するようにします.
具体的には,.zshrc に下記を追記してください.

limactl start docker

ここまでで,Lima + Docker の環境構築は完了です. docker builddocker-compose build などのコマンドが使用できるようになっているはずです.

VScodeでRemote-Containers + Lima を実現する方法

VScodeで,Remote-Containersを使うとコンテナ内での作業が捗ります.
これを Lima でも実現したいので Remote-Containers + Lima を実現する手順を説明します.

Remote-Containers そのものの使い方は特段触れません.「VScode Remote-Containers」などで調べれば使い方が出てくると思います.

  1. VScodeの拡張機能である「Docker」「Remote - Containers」をインストールします
a a
  1. VScodeの setting.json に下記を追記して, DOCKER_HOST のURLを変更します.
{
 "docker.host": "unix:///Users/<ユーザー名>/.lima/docker/sock/docker.sock"
}

ここでは,DOCKER_HOST=unix:///${HOME}/.lima/docker/sock/docker.sock のような環境変数を含んだ記述は使えず,ベタうちする必要があるので注意してください(もしかしたら他に方法があるかも).

上記の手順を実施することで Remote-Containersも使用することができ,Lima+Dockerを使用した開発が更に快適になりました.

まとめ

Lima + Docker により高速なDocker環境を実現することができました.

Docker Desktop for Mac も有料化(個人用途なら問題なし)するらしいので,気になった人はやってみてください.

参考サイト

11
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?