とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など
各種SNSのフォローもよろしくお願いいたします。

MacにインストールしたPodmanでdocker-composeを利用する / VSCodeでPodmanを使う

最近PodmanやPodman Desktopが気になっています。 これを使ったらDocker DesktopやRancher Desktopの代わりになるかなあと思い、試してみることにしました。

Web検索したら、まんまの内容が公開されていました。

Podman with docker-compose on MacOS. · GitHub

そうです。やりたいことはこれです。 というわけで、ちょっと補足しつつ試してみようと思います。

Podmanとその他のコンポーネントのインストール

この手順ではHomebrewを使って色々インストールしますので、まだインストールされていない場合はHomebrewをインストールしてください。

PodmanとPodman Desktopについてはインストーラーが公式からリリースされているので、Homebrewを使いたくない場合はインストーラーを使ってインストールしてください(その場合、アップデートは手動になります)。

その上で次のように実行すると、macOSにPodmanをインストールできます。正確にいうと、一緒にQEMUがインストールされてその中でFedoea Core OS VMが動き、その中でPodmanが動きます。MacからはPodmanクライアントがそのVM内のPodmanに対してリモートアクセスする形で動きます。

% brew install podman

インストール後は、Podmanを実行する仮想マシンの作成と起動が必要です。podman machine initのヘルプを見ると、CPU、メモリー、ストレージの指定ができるのがわかります。デフォルトよりもリソースを絞りたい場合はオプションで指定します。

% podman machine init
% podman machine start

もし、CLIだけでなくGUI画面もあったほうが良ければ、「Podman Desktop」をインストールします。

% brew install podman-desktop

Podman Desktopはこんな感じです。

GUIからpodmanマシンの作成や管理ができます。

Podman 3.x以降はdocker-composeを使うことができます(macOSでも)。というわけでインストールしましょう。 一点だけ注意事項ですが、docker-composeは当然ながら、デフォルトではDockerデーモンやDockerの設定を探しに行きます。従って、macOSで実行中のDocker DesktopやRancher Desktopなどは停止しておく必要があります(同居している場合)。また、~/.docker配下の設定が干渉してうまく動かない場合があります。

% brew install docker-compose

次に、Podmanの接続情報を確認します。 すると次のような結果が現れると思います。ポート番号は環境により異なります。

% podman system connection ls
Name                         URI                                                         Identity                                     Default
podman-machine-default       ssh://core@localhost:57347/run/user/501/podman/podman.sock  /Users/user/.ssh/podman-machine-default  true
podman-machine-default-root  ssh://root@localhost:57347/run/podman/podman.sock           /Users/user/.ssh/podman-machine-default  false

あとはそのポートへのフォワード ssh 接続を作成して、DOCKER_HOSTを設定します。

% ssh -fnNT -L/tmp/podman.sock:/run/user/501/podman/podman.sock -i ~/.ssh/podman-machine-default ssh://core@localhost:57347 -o StreamLocalBindUnlink=yes
% export DOCKER_HOST='unix:///tmp/podman.sock'

Podmanでdocker-composeを利用するにはmacOSの再起動毎に上記実行が必要なので、なにかうまい方法を使って自動で実行されるように設定してください。その方法は色々あると思います。

Podmanでdocker-composeを試す

いよいよ本番です。とりあえず適当なディレクトリー内にdocker-compose.yamlを作ってみてください。

version: '3'
services:
  web:
    image: docker.io/library/nginx:alpine
    ports:
        - "8080:80"

あとはつぎのように実行します。 少々時間が経過すると、http://localhost:8080へのアクセスすると、NGINX Webサーバーのデフォルトページが表示されるはずです。

% docker-compose up -d         
[+] Running 1/8
 ⠿ web Pulled                                                                                                                                 7.3s
   ⠙ e5a0a61a0146 Download complete                                                                                                           1.1s
   ⠙ 51048c2d0108 Download complete                                                                                                           1.1s
   ⠙ 9b18e9b68314 Download complete                                                                                                           1.1s
   ⠙ f61a6b717778 Download complete                                                                                                           1.0s
   ⠙ 3897c47760f3 Download complete                                                                                                           1.0s
   ⠙ 56ed090e0ec8 Download complete                                                                                                           1.0s
   ⠋ 43c5d640a017 Download complete                                                                                                           0.0s
[+] Running 2/2
 ⠿ Network test_default  Created                                                                                                              0.0s
 ⠿ Container test-web-1  Started                                                                                                              0.1s

% docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
test-web-1          "nginx -g daemon off;"   web                 running             80/tcp

% curl http://localhost:8080 |grep Welcome
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   615  100   615    0     0  39800      0 --:--:-- --:--:-- --:--:--  100k
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>

デプロイした環境はDockerでdocker-composeを使う時同様、docker-compose downで停止できます。

% docker-compose down
[+] Running 2/1
 ⠿ Container test-web-1  Removed   0.2s
 ⠿ Network test_default  Removed   0.0s

VSCodeでPodmanを使ってコンテナ開発する

VScodeの拡張機能の一覧からDockerの設定を開いて、つぎの設定を入力します。

  • Docker: DockerPath = podman
  • Docker: Host = unix:///tmp/podman.sock

Docker Pathをdockerからpodmanに変更

podman.sockを指定

あとはDocker DesktopとDocker拡張を使ったときのようにdocker-compose.yamlファイルなどから開発用の環境を作り、 アプリケーションを実行したり、色々なツールを使ってデバッグしたりが可能になります。

Dockerfileやdocker-compose.yamlにより、開発用のコンテナーが作成されました。

Podmanを使ったときのメリットとデメリット

Podmanは非常に軽量に動きます。また開発が活発なので、新しい機能をどんどん試せるといったメリットがあると思います。 特にPodman Desktopはできたばかりのソフトウェアなので、これから次々に機能を実装していき、使いやすくなると思います。 VSCodeとの連携についてはいずれもう少し使いやすくなりそうな気がします。

デメリットはあまりないと思いますが、しいてあげればVSCodeの設定変更がちょっと面倒というところです。 ただ単純にDocker Desktopの代わりとして、Podman+Podman DesktopをmacOSで動かすというのは特に問題なくできそうです。

追記 podman-mac-helperを使うと便利とのこと

このような情報を提供いただきました。ありがとうございます。

頂いた情報をもとに設定をしてみます(以下、Podman 4.2.1の例です)。

一旦マシンを停止します。

% podman machine stop

podman-mac-helper installを実行します。

% sudo podman-mac-helper install

マシンを開始(再開)します。すると、次のようなメッセージが現れました。

% podman machine start

Starting machine "podman-machine-default"
Waiting for VM ...
Mounting volume... /Users/ytooyama:/Users/ytooyama

This machine is currently configured in rootless mode. If your containers
require root permissions (e.g. ports < 1024), or if you run into compatibility
issues with non-podman clients, you can switch using the following command: 

    podman machine set --rootful

API forwarding listening on: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully

起動はしましたが、マシンにrootlessモードが設定されているようです。このままだと、この記事で書いたようにSSHを張ってDOCKER_HOSTを設定する必要があります。 そこで、rootfulをマシンに設定します...と言いたいところですが、無停止ではマシンの設定は変更できないのでした。

% podman machine set --rootful
Error: cannot change settings while the vm is running, run 'podman machine stop' first

マシンを停止してrootfulを設定、マシンを再開します。

% podman machine stop && podman machine set --rootful && podman machine start
Waiting for VM to exit...
Machine "podman-machine-default" stopped successfully
Starting machine "podman-machine-default"
Waiting for VM ...
Mounting volume... /Users/ytooyama:/Users/ytooyama
API forwarding listening on: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully

/var/run/docker.sockというソケットが自動でマウントされました。もし、DOCKER_HOSTをVSCodeやシェルで実行した場合は設定を書き換えます。

% ls -la /var/run/docker.sock
lrwxr-xr-x  1 root  daemon  66  9 21 13:32 /var/run/docker.sock@ -> /Users/ytooyama/.local/share/containers/podman/machine/podman.sock

VSCodeのDocker拡張(HOST)の設定例

なお、切り替える前にrootlessモードで作業していたときのイメージなどはrootfulモードでは使えないようですので、もしなにか気になる場合は次のように実行してコンテナやイメージを消してください。 まずは現在のコネクション一覧を出して...

% podman system connection ls

Name                         URI                                                         Identity                                     Default
podman-machine-default       ssh://core@localhost:57347/run/user/501/podman/podman.sock  /Users/ytooyama/.ssh/podman-machine-default  false
podman-machine-default-root  ssh://root@localhost:57347/run/podman/podman.sock           /Users/ytooyama/.ssh/podman-machine-default  true

rootlessのURIを指定してコマンドを実行。

% podman -H ssh://core@localhost:57347/run/user/501/podman/podman.sock image ls
REPOSITORY                            TAG           IMAGE ID      CREATED      SIZE
docker.io/ytooyama/multiarch-example  latest-arm64  22850a8f4709  2 hours ago  249 MB
docker.io/ytooyama/multiarch-example  latest-amd64  3265d23466b1  2 hours ago  231 MB
docker.io/redhat/ubi9                 latest        463080294554  7 days ago   249 MB

% podman -H ssh://core@localhost:57347/run/user/501/podman/podman.sock image rm <IMAGE IDs>