🐡

macOSでPodmanをDockerの代わりに使う

2021/09/13に公開

Docker Desktopが大規模企業に対して有料になるということで、代替を探している方も多いのではないでしょうか。macOSはLinux実行環境が標準で用意されていないこともあり対応が面倒ですが、一つの解決策としてPodmanというものがあります。
この記事ではライトユーザー向けとしてPodmanを使えるようになるための手順だけを簡潔に示します。解説記事というよりは、やってみた系の記事に近いかもしれません。
PodmanやPodman machineについての詳しい説明は公式ドキュメントや、他の方によるいくつかの解説記事があるので、そちらをお読みください。

検証環境

  • MacBook Pro(13-inch, 2020)
  • macOS Catalina 10.15.7
  • zsh

インストール

Homebrewで簡単にインストールできます。

% brew install podman

執筆時(2021年9月12日)にはv3.3.1が入りました。

% podman --version
podman version 3.3.1

Podman machineの起動

Podmanを実行する前に、Podmanを実行するためのLinux環境であるPodman machineを起動する必要があります。

まず、初期化が必要です。

# Podman machineの初期化
# VMイメージをダウンロードしてくる
% podman machine init

メモリ等の設定を変えることも可能です。参考

初期化が完了したらPodman machineを起動しましょう。Podmanを使う時には必ずPodman machineを起動する必要があります。

# Podman machineの起動
% podman machine start

私が試したところ初回実行時にはErrorが出ましたが問題なく起動できました。既にissue化されており、PRもマージされているようです。
https://github.com/containers/podman/issues/11421

起動確認は

% podman machine ls
NAME                     VM TYPE     CREATED      LAST UP
podman-machine-default*  qemu        3 hours ago  4 minutes ago

のようにできます。
停止する際にはpodman machine stopを実行してください。

Podmanの実行

公式サイト

Simply put: alias docker=podman

と書かれているように、dockerコマンドをpodmanに置き換えることでDockerと同じことができます。

% podman pull nginx
# 起動するが、v3.3.1ではポートフォワードがうまくいかない(後述)
% podman run --rm -d --name nginx -p 8080:80 nginx
% podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS                 NAMES
109dc70571dd  docker.io/library/nginx:latest  nginx -g daemon o...  7 seconds ago  Up 7 seconds ago  0.0.0.0:8080->80/tcp  nginx

v3.3.1では自動ポートフォワード機能周りにバグがあるらしく、runする際に--network bridgeをつけるなどの対応が必要なようです。詳しくは参考記事2をご覧ください。既にPRがマージされているので、リリースを待ってからPodmanを試した方が良いかもしれません。

(おまけ)従来のdockerコマンドを使う

詳細

以下の手順でdockerコマンドが使えます。ただし、使えない機能もあります。例えば、docker-composedocker composeは使えないと思います(よくわかってません)。
前提条件として、caskでない方のdockerが入っているとします。

% brew uninstall --cask docker
% brew install docker

まず、podman system connection listコマンドで出てきた情報をもとに~/.ssh/configを編集します。

% podman system connection list 
Name                         Identity                                           URI
podman-machine-default*      /Users/takumiishikawa/.ssh/podman-machine-default  ssh://core@localhost:57271/run/user/1000/podman/podman.sock
podman-machine-default-root  /Users/takumiishikawa/.ssh/podman-machine-default  ssh://root@localhost:57271/run/podman/podman.sock
~%
Host podman
  HostName localhost
  Port 57271
  User root
  IdentityFile /Users/takumiishikawa/.ssh/podman-machine-default

sshでPodman machineに入れることを確認しましょう。私は一度この手順を踏まないとdockerコマンドが使えませんでした。

% ssh podman
# (省略)Are you sure you want to continue connecting (yes/no/[fingerprint])?などが出る
Fedora CoreOS 34.20210904.1.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/c/server/coreos/

最後に、環境変数DOCKER_HOSTを設定します。

% export DOCKER_HOST=ssh://podman

するとdocker imagesdocker pullなどのコマンドが使えると思います。
docker-compseもpipでinstallすれば使えそうな気がしますが、ssh: connect to host localhost port 22: Connection refusedというメッセージが出てきて使えず、これ以上は調べられていません。
ただし、私は試していませんが、Podman APIソケットというものを使うとdocker-composeコマンドが使えるようになるようです。詳しくは参考記事3をご覧ください。

参考記事・サイト

  1. https://podman.io
    公式サイト。ドキュメント等もこちらから飛べます。
  2. https://rheb.hatenablog.com/entry/podman-machine
    PodmanとPodman machineに関して日本語でわかりやすく書かれています。この方の他の記事もおすすめです。
  3. https://rheb.hatenablog.com/entry/podman3_docker_compose
    2と同じブログです。Podmanを使ったdocker-composeの利用方法について書かれています。
  4. https://medium.com/nttlabs/docker-podman-28ced4f7cb90
    DockerとPodmanの性能を比較しています。Podman v3.0.0での比較なので今は違う結果かもしれません。

Discussion