docker から podman 雑感と備忘録です.
結論から記すと,
とても良いです.私の使い方だと docker と使い勝手ほぼ変わりません.あと cockpit-podman が使いやすくて Good !
です.
podman ってなに?
podman は RedHat が開発する Linux コンテナ管理ツールです.docker と同じですね.docker と違うのは,
公式の説明によると「root 権限を必要としないルートレスコンテナが使えてセキュリティ的に有利」だそうですが……個人的に使う分にはあまり刺さらない人が多いんじゃないかなと思います.
個人的にはそれよりも,
Alma Linux とか Ubuntu とかの一般的なディストリビューションだと Cockpit から操作ができる!
のが良いところだと思います.と言うか,私の場合,Cockpit KVM on Ubuntu 24.04.1 な環境の Mac mini を KVM 仮想マシンだけじゃなくて,docker コンテナに対応させようとして Podman って選択肢に気がつきました.
あと Kubernetes と同様 Pod が使えるらしいのですが,私の場合は Kubernetes 使ったことないのでこれで何が嬉しいかはいまのところ理解できていません.
podman の導入
Ubuntu 24.04.1 だと以下のようにするだけで導入できます.
$ sudo apt install podman cockpit-podman podman-compose podman-docker $ sudo curl -L https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
パッケージ名見ればだいたい何かはわかると思いますが,念のため,導入パッケージの簡単な説明を以下に示しておきます.
- podman: podman 本体です
- cockpit-podman: Cockpit から Podman を操作できるようにするアプリ
- podman-compose: docker-compose の podman 版
- podman-docker: docker コマンドで podman を利用するためのコマンド
- sudo curl -L …: podman-compose ではなく docker-compose を利用したいとき用途
また,事前準備として /etc/containers/registries.conf に以下を設定しておきます.
$ sudo vi /etc/containers/registries.conf ... # # An array of host[:port] registries to try when pulling an unqualified image, in order. # unqualified-search-registries = ["example.com"] unqualified-search-registries = ["docker.io"] ...
それと Ubuntu 24.04.1 の場合,一般ユーザー権限で podman を利用する場合は apparmor が必要です.apparmor が動いているかどうかは以下の通りに確かめることができます.
$ sudo aa-status apparmor module is loaded. 106 profiles are loaded. 11 profiles are in enforce mode. /usr/lib/snapd/snap-confine ...
動いていない場合は,
$ systemctl enable apparmor $ systemctl start apparmor
としてください.
また,podman を導入した環境に docker は導入しない方が良いです.使えなくはないですが,実際使うと,どっちがどっちだか分からなくなってきますし,podman-docker を導入するとコマンドが実際にカチあって酷いことになりかねません.
docker から podman へ
結論から言うと,
docker と使い方はほぼ同じ
です.あと Docker Hub に登録されているコンテナも docker と全く同様に使えます.ただし,podman の場合 docker と異なり
root と一般ユーザーのどちらでコンテナを実行しているのかが明確に区別される
ことに注意が必要です.
保存領域
docker の場合,イメージやコンテナは,
- /var/lib/docker
以下に保存されますが,podman の場合は,
- root: /var/lib/containers
- 一般ユーザー: ~/.local/share/containers
となります.私の場合は,これに合わせて,永続ストレージ (Volumes) 用の領域として,
- root: /var/lib/containers/volumes
- 一般ユーザー: ~/.local/share/containers/volumes
以下を使用しています.
podman コマンドの使用方法
podman コマンドの使用方法は docker とほぼ同じです.永続ストレージの場所の変更に気をつけるくらいしか変わるところはありません.podman-docker パッケージを導入済みの場合はコマンド名も変える必要はありません.実例は以下の通りです.
$ sudo podman ps [sudo] password for hytsutsumi: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c8dd9ec6a3a2 docker.io/pawelmalak/flame:latest sh -c chown -R no... 26 hours ago Up 25 hours 5005->5005/tcp flame 817e8bf94261 docker.io/troglobit/inadyn:latest 26 hours ago Up 25 hours inadyn 81c315f29260 docker.io/pihole/pihole:latest 25 hours ago Up 25 hours (healthy) 53->53/tcp, 4080->80/tcp, 53->53/udp pihole e27046f4bf18 docker.io/jc21/nginx-proxy-manager:latest 23 hours ago Up 23 hours 80-81->80-81/tcp, 443->443/tcp nginxproxymanager a4871afc4c67 localhost/wordpress:latest apache2-foregroun... 23 hours ago Up 23 hours 9080->80/tcp wordpress cc53f8d40885 docker.io/library/mysql:5.7 mysqld 23 hours ago Up 23 hours mysql $ sudo podman network ls NETWORK ID NAME DRIVER a069f2afad27 compose.default bridge 8ac236e11be8 nginxproxymanager bridge d01dafefa7f1 pihole bridge 2f259bab93aa podman bridge $ sudo podman run -d -p 5005:5005 --name flame --restart=always -v /var/lib/containers/volumes/flame_data:/app/data -e PASSWORD="xxxxxxx" pawelmalak/flame # podman-docker パッケージを導入済みだと podman ではなく docker で良い $ sudo docker network ls Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. NETWORK ID NAME DRIVER a069f2afad27 compose.default bridge 8ac236e11be8 nginxproxymanager bridge d01dafefa7f1 pihole bridge 2f259bab93aa podman bridgeな
なお,上の例は全てコマンドを sudo を付け起動しているので,root ユーザー権限でコンテナを操作していることに注意して下さい.実際以下の例のように,root 権限の場合と一般ユーザー権限の場合は root ユーザー権限で動いているコンテナ等の操作(表示)はできません.
# 注)podman はデフォルトで作成される podman 用の bridge ネットワークです $ sudo podman network ls NETWORK ID NAME DRIVER a069f2afad27 compose.default bridge 8ac236e11be8 nginxproxymanager bridge d01dafefa7f1 pihole bridge 2f259bab93aa podman bridge $ podman network ls NETWORK ID NAME DRIVER 2f259bab93aa podman bridge
podman-compose の使用方法
podman-compose の場合も docker-compose とほぼ使い方同じです.Dockerfile と docker-compose.yaml (compose.yaml) もほぼそのまま使えます.注意しなければならないところは以下くらいです.
- version は書いてあっても良いですがワーニングがでます.
- services の restart: unless-stopped は使えません.
実際の使用例は以下の通りです.
# WordPress with GMP extension の起動例 $ cat DockerFile FROM wordpress:latest RUN apt-get update RUN apt-get install -y gcc RUN apt-get install -y curl RUN apt-get install -y libgmp-dev RUN docker-php-ext-install gmp RUN docker-php-ext-enable gmp $ cat docker-compose.yaml services: wordpress: image: wordpress container_name: wordpress build: context: . dockerfile: DockerFile restart: always ports: - 9080:80 environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: xxxxxxxxxxxxxxxxxxx WORDPRESS_DB_NAME: wordpress volumes: - /var/lib/containers/volumes/wordpress/html:/var/www/html db: image: mysql:5.7 container_name: mysql restart: always environment: MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: DuY0wVvmtgqSr6ZEX!bqUtXb MYSQL_RANDOM_ROOT_PASSWORD: MYSQL_RANDOM_ROOT_PASSWORD volumes: - /var/lib/containers/volumes/wordpress/db:/var/lib/mysql networks: default: external: name: compose.default $ sudo podman-compose up -d podman-compose version: 1.0.6 ['podman', '--version', ''] using podman version: 4.9.3 ** excluding: set() ['podman', 'inspect', '-t', 'image', '-f', '{{.Id}}', 'wordpress'] ['podman', 'ps', '--filter', 'label=io.podman.compose.project=wordpress', '-a', '--format', '{{ index .Labels "io.podman.compose.config-hash"}}'] ['podman', 'network', 'exists', 'compose.default'] podman run --name=wordpress -d --label io.podman.compose.config-hash=6ae8ba093c9fb5581feae00baaf254f8627ec598b79ccc3d9adea52a1a166c4e --label io.podman.compose.project=wordpress --label io.podman.compose.version=1.0.6 --label [email protected] --label com.docker.compose.project=wordpress --label com.docker.compose.project.working_dir=/home/hytsutsumi/composes/wordpress --label com.docker.compose.project.config_files=docker-compose.yaml --label com.docker.compose.container-number=1 --label com.docker.compose.service=wordpress -e WORDPRESS_DB_HOST=db:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=DuY0wVvmtgqSr6ZEX!bqUtXb -e WORDPRESS_DB_NAME=wordpress -v /var/lib/containers/volumes/wordpress/html:/var/www/html --net compose.default --network-alias wordpress -p 9080:80 --restart always wordpress cf286f4f88d98b07bc86ab3941cf1dabdb4f777590c38e7a49403484dd3d4b6e exit code: 0 ['podman', 'network', 'exists', 'compose.default'] podman run --name=mysql -d --label io.podman.compose.config-hash=6ae8ba093c9fb5581feae00baaf254f8627ec598b79ccc3d9adea52a1a166c4e --label io.podman.compose.project=wordpress --label io.podman.compose.version=1.0.6 --label [email protected] --label com.docker.compose.project=wordpress --label com.docker.compose.project.working_dir=/home/hytsutsumi/composes/wordpress --label com.docker.compose.project.config_files=docker-compose.yaml --label com.docker.compose.container-number=1 --label com.docker.compose.service=db -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=DuY0wVvmtgqSr6ZEX!bqUtXb -e MYSQL_RANDOM_ROOT_PASSWORD=MYSQL_RANDOM_ROOT_PASSWORD -v /var/lib/containers/volumes/wordpress/db:/var/lib/mysql --net compose.default --network-alias db --restart always mysql:5.7 4c816948f54cd8b466e70a7f23411b7504fa71ba474f60811f148fcacaaa4903 exit code: 0 $ sudo podman-compose down podman-compose version: 1.0.6 ['podman', '--version', ''] using podman version: 4.9.3 ** excluding: set() podman stop -t 10 mysql mysql exit code: 0 podman stop -t 10 wordpress wordpress exit code: 0 podman rm mysql mysql exit code: 0 podman rm wordpress wordpress exit code: 0 $ sudo docker-compose up -d WARN[0000] networks.default: external.name is deprecated. Please set name and external: true [+] Running 2/2 ✔ Container wordpress Started 0.6s ✔ Container mysql Starte
上の例を見て頂くとわかる通り,podman-compose でも docker-compose でも同じように起動できますが,起動時のメッセージの量が全く違います.どちらを使うかは好みですが,いまのところ,起動エラーが起きたときの原因の分かりやすさは docker-compose の方が上だと思います.正直 podman-compoose は情報量多くて分かりにくいです.
Cockpit からの操作
cockpit-podman パッケージを導入すれば Cockpit から podman を操作できますが,docker 時代の portainer などと比べると,
操作できる内容は基本的なものに限られる
ことに注意が必要です.
しかし,私の場合,コンテナを直接起動することはあまりなく,docker-compose から起動することがほとんどだったので,結局,コマンドラインを使っていましたので,portainer は動作中のコンテナの一覧表示や状態の確認,停止,再起動くらいしか使っていませんでした.
Cockpit の Podman コンテナアプリでも,動作中のコンテナの一覧表示や再起動等は行えます.できることが少ない分,画面構成がシンプルで分かりやすいので,少なくとも私の場合は Cockpit の方が portainer よりも使いやすいです.
まとめ
と言うことで,コンテナ管理と言えば docker が有名だし一般的だけど,podman でも普通に使う分には全く同じように使えるし困ることはないと思います.特に Cockpit で,KVM 仮想マシンと合わせて管理できるのは魅力的かなと思います.一度お試しあれ.
以上!