docker から podman 雑感と備忘録

Environment
Photo by hyt.

docker から podman 雑感と備忘録です.

結論から記すと,

とても良いです.私の使い方だと docker と使い勝手ほぼ変わりません.あと cockpit-podman が使いやすくて Good !

です.

Amazon.co.jp

podman ってなに?

podman は RedHat が開発する Linux コンテナ管理ツールです.docker と同様です.違いは,

Podman とは
Podman は、Linux システムでコンテナを開発、管理、実行するためのオープンソースツールです。

公式の説明によると「root 権限を必要としないルートレスコンテナが使えてセキュリティ的に有利」だそうですが……個人的に使う分にはあまり刺さらない人が多いんじゃないかなと思います.

個人的にはそれよりも,

Alma Linux や Ubuntu とかの一般的なディストリビューションだと Cockpit から操作ができる!

のが良いところだと思います.と言うか,私の場合,Cockpit KVM on Ubuntu 24.04.1 な環境の Mac mini を KVM 仮想マシンだけじゃなくて,docker コンテナに対応させようとして Podman って選択肢に気がつきました.

Mac mini (Late 2014) を Cockpit KVM サーバーにする備忘録
Mac mini (Late 2014) を Cockpit KVM サーバーにする備忘録です.2024/12/16追記:優先LAN が安定しない場合は以下の記事の内容をお試し下さい.はじめにいままで無償で利用できていた VMWare ES...

あと 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 と一般ユーザーのどちらでコンテナを実行しているのかが明確に区別される

ことに注意が必要です.

Amazon.co.jp
CentOS7 に docker を入れる備忘録
CentOS7 に docker を入れる備忘録です.今回はホントに単なる備忘録です.CentOS7 の最小構成からの導入です.入れるだけなら簡単ですね.念のため,依存パッケージの情報も載せておきます.$ cat /etc/centos-r...

保存領域

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) もほぼそのまま使えます.注意しなければならないところは以下くらいです.

  1. version は書いてあっても良いですがワーニングがでます.
  2. 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
Docker 版 Wordpress に GMP extension を追加する備忘録
Docker 版 Wordpress に GMP extension を追加する備忘録です.いつもの通り結論から記すと,Wordpress on Docker 公式が用意している library / extension 追加機能を使うと比較...

上の例を見て頂くとわかる通り,podman-compose でも docker-compose でも同じように起動できますが,起動時のメッセージの量が全く違います.どちらを使うかは好みですが,いまのところ,起動エラーが起きたときの原因の分かりやすさは docker-compose の方が上だと思います.正直 podman-compoose は情報量多くて分かりにくいです.

Cockpit からの操作

cockpit-podman パッケージを導入すれば Cockpit から podman を操作できますが,docker 時代の portainer などと比べると,

操作できる内容は基本的なものに限られる

ことに注意が必要です.

Photo by hyt.

しかし,私の場合,コンテナを直接起動することはあまりなく,docker-compose から起動することがほとんどだったので,結局,コマンドラインを使っていましたので,portainer は動作中のコンテナの一覧表示や状態の確認,停止,再起動くらいしか使っていませんでした.

Cockpit の Podman コンテナアプリでも,動作中のコンテナの一覧表示や再起動等は行えます.できることが少ない分,画面構成がシンプルで分かりやすいので,少なくとも私の場合は Cockpit の方が portainer よりも使いやすいです.

Docker を GUI で管理する portainer.io を入れてみた備忘録
Docker を GUI で管理する Portainer.io を入れてみた備忘録です.Docker を使い始めたは良いのですが,所詮個人的なサーバーで使うだけで,そんなしょっちゅう使うって訳でもないので,コマンドラインの管理だとちょっと辛...
複数の Docker サーバーを portainer.io で管理する備忘録
ひさしぶりの更新になりますが,複数の Docker サーバーを portainer.io で管理する備忘録です.まず結論から書くと,portainer.io の左側のメニューにある「Environments」から設定!できます.Docker...

まとめ

と言うことで,コンテナ管理と言えば docker が有名だし一般的だけど,podman でも普通に使う分には全く同じように使えるし困ることはないと思います.特に Cockpit で,KVM 仮想マシンと合わせて管理できるのは魅力的かなと思います.一度お試しあれ.

以上!

Amazon.co.jp
EnvironmentServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました