Skip to content

Instantly share code, notes, and snippets.

@ww24
Last active November 13, 2022 07:20
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ww24/7c6c722bbd842657b9cebfe600972904 to your computer and use it in GitHub Desktop.
Save ww24/7c6c722bbd842657b9cebfe600972904 to your computer and use it in GitHub Desktop.
Docker Engine on Multipass for macOS

Multipass を導入して Docker Desktop を卒業する

Zenn に記事として投稿 https://zenn.dev/ww24/articles/7e576d6f01a366

Install Multipass

https://multipass.run/

or

$ brew install --cask multipass

Launch

$ multipass launch --name docker-vm --cpus 4 --mem 8G --disk 20G --cloud-init cloud-config-$(uname -m).yaml 20.04

cloud-init

cloud-init によって VM 作成時に次の処理を行っている。

  • Docker Engine のインストール
  • 設定ファイルを修正し TCP port 2375 で listen
  • default user を docker group に追加して docker cli 実行時の sudo 不要に
  • マウントしたディレクトリに VM ゲスト側から socket file が作成できない問題のワークアラウンドとして containerd 用に XDG_RUNTIME_DIR を設定

次のように modules-final: SUCCESS と表示されていたら cloud-init の実行が完了し、成功している。

$ multipass exec docker-vm -- tail -1 /var/log/cloud-init.log
2021-12-07 12:37:24,572 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final

Mount macOS home directory

macOS 上のファイルを Docker 上にマウントするために VM にマウントする。

$ multipass mount /Users docker-vm:/Users
$ multipass mount /private/tmp docker-vm:/tmp
$ multipass info docker-vm

Switch docker context

DOCKER_HOST 環境変数を追加する方法もあるが、docker context を使うと切り替えが便利。

$ docker context create docker-vm --docker "host=tcp://$(multipass info docker-vm --format json | jq -r '.info["docker-vm"].ipv4[0]'):2375"
$ docker context list
$ docker context use docker-vm

何かで VM の IP が変わった際には、次のように docker context update を実行する。

$ docker context update docker-vm --docker "host=tcp://$(multipass info docker-vm --format json | jq -r '.info["docker-vm"].ipv4[0]'):2375"

usage

$ docker run -it --rm alpine:edge sh

References

#cloud-config
# install docker engine
apt:
sources:
docker.list:
source: deb [arch=arm64 signed-by=$KEY_FILE] https://download.docker.com/linux/ubuntu $RELEASE stable
keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
packages:
- docker-ce
- docker-ce-cli
- containerd.io
runcmd:
- [
sed,
-ie,
's/ExecStart=\/usr\/bin\/dockerd -H fd:\/\//ExecStart=\/usr\/bin\/dockerd -H tcp:\/\/0.0.0.0:2375 -H fd:\/\//',
/lib/systemd/system/docker.service,
]
# Workaround: [docker: Error response from daemon: failed to create OCI runtime console socket: listen unix /tmp/pty833253340/pty.sock: bind: operation not permitted: unknown.] error occurred if /tmp mounted.
- [
sed,
-ie,
's/ExecStart=\/usr\/bin\/containerd/ExecStart=\/usr\/bin\/containerd\nEnvironment=XDG_RUNTIME_DIR=\/run\/user\/1000/',
/lib/systemd/system/containerd.service,
]
- [systemctl, daemon-reload]
- [systemctl, restart, docker, containerd]
# add default_user (ubuntu) into docker group
system_info:
default_user:
groups: [docker]
snap:
commands:
- [install, multipass-sshfs]
#cloud-config
# install docker engine
apt:
sources:
docker.list:
source: deb [arch=amd64 signed-by=$KEY_FILE] https://download.docker.com/linux/ubuntu $RELEASE stable
keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
packages:
- docker-ce
- docker-ce-cli
- containerd.io
runcmd:
- [
sed,
-ie,
's/ExecStart=\/usr\/bin\/dockerd -H fd:\/\//ExecStart=\/usr\/bin\/dockerd -H tcp:\/\/0.0.0.0:2375 -H fd:\/\//',
/lib/systemd/system/docker.service,
]
# Workaround: [docker: Error response from daemon: failed to create OCI runtime console socket: listen unix /tmp/pty833253340/pty.sock: bind: operation not permitted: unknown.] error occurred if /tmp mounted.
- [
sed,
-ie,
's/ExecStart=\/usr\/bin\/containerd/ExecStart=\/usr\/bin\/containerd\nEnvironment=XDG_RUNTIME_DIR=\/run\/user\/1000/',
/lib/systemd/system/containerd.service,
]
- [systemctl, daemon-reload]
- [systemctl, restart, docker, containerd]
# add default_user (ubuntu) into docker group
system_info:
default_user:
groups: [docker]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment