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

Posted by nogajun - 2022/03/26

この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 directoryPermission 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には関係ないですし移行する必要は無いけれど、ロックインされずに移行できる環境が整っていることは素晴らしいと思います。