Debian 11 bullseyeでpodmanとdocker-composeを使ってみた

このnofuture.tvのサービスは全部dockerで動かしてますが「Debian bullseyeはpodmanがあったな」と思い出したので試してみました。
動かしている環境はDebian 11 Bullseyeのデスクトップ環境です。検索すると、ごちゃごちゃ設定している記事がひっかかりますがbullseyeでpodmanを使うときはリポジトリの設定以外必要ありません。
podmanはaptでインストールできます。
$ sudo apt install podman
bash-completionでコマンド補完をするために下のコマンドで設定を追加します。
$ sudo podman completion bash -f /etc/bash_completion.d/podman
これで、インストールが終わったのでイメージを検索してみます。ちゃんとオプションの補完も効くのでいいですね。
$ podman search hello-world
しーん…。イメージのリポジトリが登録されてなくて検索できないようなので/etc/containers/registries.conf
の末尾にdocker.ioを検索するように以下の内容を追記します。
unqualified-search-registries=["docker.io"]
これで、もう一度検索します。
$ podman search hello-world
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/library/hello-world Hello World! (an example of minimal Dockeriz... 1688 [OK]
docker.io docker.io/rancher/hello-world 1
docker.io docker.io/okteto/hello-world 0
以下略
こんどはちゃんと検索されたので、みんな大好きHello worldコンテナを起動してみます。
$ podman run --rm hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
以下略
おおー、何も設定しなくてもユーザーで使えている。素晴らしい。(余談。デスクトップだと普通にdbus-user-sessionは入っていますが、サーバーだと入ってないので自分で入れておく必要があるようです。)
では、nginxを起動して動くか見てみます。
$ podman run -d -p 8080:80 nginx
bee964a697674a8f77e444341e002995980bcb09f78eaad8d023272a2934e80a
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bee964a69767 docker.io/library/nginx:latest nginx -g daemon o... 39 seconds ago Up 39 seconds ago 0.0.0.0:8080->80/tcp priceless_cannon
ブラウザで8080ポートにアクセスしても普通に動いてます。素晴らしい。動くことがわかったので止めて除去します。
$ podman stop priceless_cannon
bee964a697674a8f77e444341e002995980bcb09f78eaad8d023272a2934e80a
$ podman rm priceless_cannon
bee964a697674a8f77e444341e002995980bcb09f78eaad8d023272a2934e80a
dockerと同じコマンドで使えますね。
ここまで使えたらdocker-composeも使いたくなるので、docker-compose v1を使ってみます(v2はdocker-cliのプラグインに変わったので使えません)。 docker-composeは https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 を使います。
以下のような簡単な docker-compose.yml
ファイルを作成します。
version: '3'
services:
nginx:
image: nginx
ports:
- 8080:80
そしてファイルのある場所で docker-compose up -d
を実行すると…。
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
[4309] Failed to execute script docker-compose
エラーが出ました。調べるとpodmanではソケットの場所と名前が/run/podman/podman.sock
に変わっているので環境変数DOCKER_HOST
でソケットを指定する必要があるようです。(ずっと使う人は~/.bashrc
にでも追記してください)
$ export DOCKER_HOST=unix:///run/podman/podman.sock
curlでテストしてみます。
$ sudo curl -v --unix-socket /run/podman/podman.sock http://localhost/_ping
* Trying /run/podman/podman.sock:0...
* Connected to localhost (/run/podman/podman.sock) port 80 (#0)
> GET /_ping HTTP/1.1
> Host: localhost
> User-Agent: curl/7.74.0
> Accept: */*
中略
OK
では、改めてdocker-compose up -d
を実行すると…。
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', PermissionError(13, 'Permission denied'))
[4687] Failed to execute script docker-compose
あれ。またエラーが。しかし、今度はNo such file or directory
がPermission denied
に変わってます。ソケットを見てみると、rootグループに入っていないと使えないみたいです。podmanグループ作って欲しい…
$ ls -la /run/podman/podman.sock
srw-rw---- 1 root root 0 3月 26 13:26 /run/podman/podman.sock
それはさておき、ユーザーのままdocker-composeは使えないことがわかったのでsudo
をつけて実行ですが、そのままでは環境変数DOCKER_HOST
が引き継がれません。なので-E
オプションをつけて実行すると良さそうです。
$ sudo -E docker-compose up -d
Creating network "src_default" with the default driver
Pulling nginx (nginx:)...
f2f70adc5d89aa922836e9cc6801980a12a7ff9012446cc6edf52ef8798a67bd: pulling image () from docker.io/library/nginx:latest (Download complete)
Creating src_nginx_1 ... done
おおー、うまくいきました。podman-composeを使うと、もしかすると完全ユーザー環境だけで使えるかもしれませんが、ひとまずpodmanもdocker-composeもいい感じに使えますね。
podmanといえば、WindowsやMacの人はDocker Desktop有料化で慌てて移行しようとしてますが(この行為、オープンソースに対して敬意もなく金を踏み倒そうとしている態度で自分は好きじゃないです)、Linuxには関係ないですし移行する必要は無いけれど、ロックインされずに移行できる環境が整っていることは素晴らしいと思います。