Open4

M1 Mac で Dockerを使う話

yocyoc

経緯

Mac OS 上で Docker を使おうと思ったら Docker Desktop が必須
https://www.docker.com/products/docker-desktop

また、2022年2月から Docker Desktop は条件付きで有料になった。

あと、Docker Desktop だと遅く感じることがあったりする。

なので Docker Desktop から離れようって思った のが話の経緯

yocyoc

解決策

どうやって離れるかだが、単純に Linux 上で動かせばDocker Desktop が要らなくなるのでいろんな柵から開放される。

仮想マシンの話

とりあえず良く使っていたし、有名なので virtualbox を使おうとしたところインストールができない…
ググって調べたところ M1 にはvirtualbox が対応しておらず、そもそもインストールできないようになったらしい
https://www.virtualbox.org/wiki/Changelog

macOS host: show message indicating the unsupported CPU on M1 based Macs and abort installation

Linuxの仮想マシンを動かせるツールが無いか色々と調べたところ、Multipass というツールを発見
https://ubuntu.com/blog/canonical-transforms-linux-on-mac

Developers can now launch Linux instances on Apple M1 with Multipass 1.8

どうやらUbuntuが公式で作成している仮想マシンツールっぽいのでUbuntu を使うには問題なさそう。
※ CentOSを使うことはできない

yocyoc

使い方

クジラ飛行机 さんが使い方をまとめてくださっていたので、この記事を参考にしながら導入する
https://zenn.dev/kujirahand/articles/7cf343b6dbea18

とりあえず試すだけなら、仮想環境内に入って公式サイトに従ってDockerをインストールする
https://docs.docker.com/engine/install/ubuntu/

適当にコマンド打ってdocker コマンドが multipass 経由で macの端末から使えることを確認する

multipass exec ${ラベル}  -- docker --version 
yocyoc

運用

ちゃんと使っていくために cloud-init.yaml を作っておく

#cloud-config
groups:
  - docker

system_info:
  default_user:
    groups: ["docker"]
package_update: true
packages:
  - apt-transport-https
  - ca-certificates
  - curl
  - gnupg-agent
  - software-properties-common

runcmd:
  # 名前解決ができなかったので追加した。理由をちゃんと調べていないので不要なら消す。
  - sudo sed -e '$a nameserver 8.8.8.8' -i /etc/resolv.conf
  - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  - add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  - sudo apt-get update -y
  - sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  - systemctl start docker
  - systemctl enable docker
  - sudo apt install -y snapd
  - sudo snap install multipass-sshfs
  - sudo apt install -y docker-compose

作成したyamlを指定して仮想マシンを起動する

multipass launch --name ${任意のラベル} --cloud-init cloud-init.yaml

ローカル内のディレクトリをマウントしたい場合このコマンドも実行しておく

multipass mount ${マウントしたいディレクトリ}  ${任意のラベル}:${マウント先}

あとはDocker が入ったUbuntu のイメージを使って快適なDocker ライフを続けるだけ