macOSでコンテナを動作させる3つのパターン

macOS上でコンテナを動作させるには3つのパターンがある。

コンテナを動作させる3つのパターン

Docker Desktopのみのパターン

Docker DesktopがVMの管理をし、VM内でdockerdデーモンを動作させる。

Docker CLI
 ↓
Docker Desktop
 ↓
Apple Virtualization Framework (AVF)
 ↓
Linux VM
 ↓
dockerd
 ↓
containerd
 ↓
OCI runtime (runcなど)
 ↓
コンテナプロセス

Colima と Docker daemon を組み合わせるパターン

Colima(Lima)がVMの管理をし、VM内ではdockerdデーモンを動作させる。

Docker CLI
 ↓
Colima
 ↓
Lima
 ↓
Apple Virtualization Framework (AVF)
 ↓
Linux VM
 ↓
dockerd
 ↓
containerd
 ↓
OCI runtime (runcなど)
 ↓
コンテナプロセス

Podman のみのパターン

PodmanがVMの管理をし、Podmanが直接OCI runtimeを利用する。

Podman CLI
 ↓
Podman Machine
 ↓
Apple Virtualization Framework (AVF)
 ↓
Linux VM
 ↓
Podman
 ↓
OCI runtime (runcなど)
 ↓
コンテナプロセス

準備

  1. Apple Silicon を使っている場合は、現在のターミナルが Apple Silicon ネイティブで起動されていることを確認する。環境によっては、Rosettaが有効でx86_64でターミナルを起動している場合があるので注意する。
    • uname -m の結果が arm64 であることを確認する。
    • 結果が x86_64 の場合は、現在のターミナルが Rosetta2 でエミュレートされたものになっているので、例えば、iTerm2 を使っているのなら、iTerm2 > Settings > Profiles > Command に /bin/sh などを指定して、ネイティブで実行されるようにする。
    • または、Activity Monitor > CPU > Kind に Apple または Intel が表示さるので、実行中のターミナルがApple Siliconネイティブで実行されていれば Apple になる。
  2. Homebrewをインストールしておく。

ColimaとDocker daemonで使う方法

  1. Colimaをインストール
    • brew install colima
    • colima start でVMが作成され、dockerdがインストールされ、起動する
      • colima start --cpu 4 --memory 8
    • colima status
    • colima list
    • colima stop
  2. Docker CLIをインストール
    • brew install docker docker-compose
  3. コンテナが動作する
    • docker run hello-world

Podmanを使う方法

  1. Podmanをインストール
    • brew install podman podman-compose
    • podman --version
    • podman machine init
    • podman machine start でVMが作成される
    • podman info
  2. コンテナが動作する
    • podman run hello-world
  3. Docker Hubのimageも使える
    • podman run -d --name nginx -p 80:80 --network pasta docker.io/library/nginx
      • Podmanはnetworkにpasst(pasta)が使える。passtを使うと、コンテナ内のネットワークで完結させるのではなく、ホスト側のユーザ空間にネットワークを晒すことが可能であり、コンテナネットワークのNATとのやりとりを介さず、ホスト側のネットワークと直接やりとりするようになる。

Podmanを使う理由

  • DockerもPodmanもrootlessで動作できるので、正しく使う分にはどちらも安全だが、ある側面ではPodmanが優位。
    • Podmanの場合はVM内にデーモンを持たないが、Dockerの場合はVM内にroot権限のdockerdデーモンを持つ。dockerdデーモンは/var/run/docker.sockを介してホストのCLIとやりとりしており、通常はVM内のコンテナにはマウントされないが、万が一コンテナにマウントした場合は、そのコンテナからdockerdを操作することが可能になるため、この視点だと、DockerよりもPodmanの方が安全性が高いということになる。
    • rootで動作しているdockerdをrootlessで動作させることも可能だが、dockerdをrootで動作させてきた都合上、rootless化に伴うオーバーヘッドがある。
  • --priviledged でコンテナを起動した場合は、PodmanであろうがDockerであろうが、コンテナにrootレベルでのカーネルのアクセスを許すため、VM内部のカーネル経由でのセキュリティーのリスクが生じる。

関連記事 Related Posts

B!