Podman はかつて CRI-O プロジェクトの一部でしたが、後に独立したプロジェクトとして分離されました。 libpodPodman (Pod Manager) の目標は、Docker と同様の体験を提供するコンテナ CLI を提供し、ユーザーがコンテナを作成および実行できるようにすることです。
目次
始める前に
まずは一節を読んでみましょう 「All System Go Replacing Docker with Podman」での講演におけるの宣言文です
私は誓います
Docker レジストリではなく、コンテナレジストリと呼ぶことを
私は誓います
Docker イメージではなく、コンテナイメージと呼ぶことを
私は誓います
Docker コンテナではなく、コンテナまたは OCI コンテナと呼ぶことを
Podman のインストール
Fedora
Podman は現在すでに Fedora のリポジトリに含まれており、標準のパッケージマネージャーを使用してインストールするだけです。
sudo dnf install podman
Ubuntu
Ubuntu の場合はソースからビルドする必要があります。まず、必要なパッケージをいくつかインストールします:
sudo apt-get update
sudo apt-get install libdevmapper-dev libglib2.0-dev libgpgme11-dev golang libseccomp-dev \
go-md2man libprotobuf-dev libprotobuf-c0-dev libseccomp-dev python3-setuptools
次に conmon をビルドします:
export GOPATH=~/go
mkdir -p $GOPATH
git clone https://github.com/kubernetes-sigs/cri-o $GOPATH/src/github.com/kubernetes-sigs/cri-o
cd $GOPATH/src/github.com/kubernetes-sigs/cri-o
mkdir bin
make bin/conmon
sudo install -D -m 755 bin/conmon /usr/libexec/podman/conmon
必要な設定ファイルを作成します:
sudo mkdir -p /etc/containers
sudo curl https://raw.githubusercontent.com/projectatomic/registries/master/registries.fedora -o /etc/containers/registries.conf
sudo curl https://raw.githubusercontent.com/containers/skopeo/master/default-policy.json -o /etc/containers/policy.json
CNIプラグインのインストール:
git clone https://github.com/containernetworking/plugins.git $GOPATH/src/github.com/containernetworking/plugins
cd $GOPATH/src/github.com/containernetworking/plugins
./build.sh
sudo mkdir -p /usr/libexec/cni
sudo cp bin/* /usr/libexec/cni
runcのインストール:
git clone https://github.com/opencontainers/runc.git $GOPATH/src/github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc
make BUILDTAGS="seccomp"
sudo cp runc /usr/bin/runc
最後にpodmanをインストールします
git clone https://github.com/containers/libpod/ $GOPATH/src/github.com/containers/libpod
cd $GOPATH/src/github.com/containers/libpod
make
sudo make install PREFIX=/usr
Project Atomic PPA
もちろん、より簡単な方法もあります。Project AtomicのPPAを直接使用します:
sudo add-apt-repository ppa:projectatomic/ppa
sudo apt update
sudo apt install podman
Podman の使用方法
podmanの使用は非常に簡単です。あなたの にこの一行を追加するだけです:.bashrc
alias docker=podman
冗談抜きで、podmanのコマンドはdockerと87%同じです。この一行を追加すれば、基本的にはスムーズに移行できますが、注意が必要な細かい点については後ほど説明します。
なぜ Podman なのか?
肥大化したデーモンがない
PodmanはDocker Engineのようにデーモンを持ちません。
Docker CLIを使用する場合、Docker CLIはAPIを介してDocker Engineに「コンテナを起動したい」と伝えます。すると、Docker EngineがOCIコンテナランタイム(デフォルトはrunc)を介してコンテナを起動します。これは、コンテナのプロセスがDocker CLIの子プロセスではなく、Docker Engineの子プロセスになることを意味します。
Podmanはデーモンを使用せず、OCIランタイム(こちらもデフォルトはrunc)を介して直接コンテナを起動します。そのため、コンテナプロセスは直接podmanの子プロセスとなります。これは従来のLinuxのfork/execモデルに近いです。これにより、システム管理者はそのコンテナプロセスが誰によって起動されたのかを把握でき、同時にcgroupsを利用してpodmanコマンドに制限をかければ、すべてのコンテナにも同様の制限が適用されます。
このモデルにより、podmanをsystemdのユニットファイルに組み込むことで、systemdの高度な機能を利用できるようになります。例えば、systemdではnotifyを使用してサービスの起動順序を制御できます。コンテナ内のサービスを他のサービスより先に起動する必要がある場合、後続のサービスはコンテナがsystemdに通知信号(notify signal)を送り、コンテナの起動完了を確認してから実行を開始します。Docker CLIではこれを実現できませんが、Podmanはsystemdの情報を子プロセスに転送(forward)するため、コンテナプロセスは起動完了後にsystemdへ準備が整ったことを通知できます。
Restart が消えた?
多くの人がPodmanを使い始めた際、dockerコマンドにある フラグが削除されていることに気づくかもしれません。これはPodmanがデーモンを使用しないため、デーモンを介した自動再起動(auto restart)機能を実装できないからです。--restart
では、システムの再起動後にコンテナを自動的に起動するにはどうすればよいでしょうか?
簡単です。同じくsystemdを利用することで実現可能です。
Nginxを例に挙げると:
まず、Nginxコンテナを実行します。
sudo podman run -t -d -p 80:80 --name nginx nginx
rootで実行する理由は、rootレスコンテナが現在ポートバインディングをサポートしていないためです。
その後、 /etc/systemd/system<code> 下建立一個 </code>nginx_container.service
[Unit]
Description=Podman Nginx Service
After=network.target
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/podman start -a nginx
ExecStop=/usr/bin/podman stop -t 10 nginx
Restart=always
[Install]
WantedBy=multi-user.target
次に、このサービスを有効化します。
sudo systemctl daemon-reload
sudo systemctl enable nginx_container.service
sudo systemctl start nginx_container.service
statusコマンドでこのサービスの状態を確認できます。
sudo systemctl status nginx_container.service
● nginx_container.service - Podman Nginx Service
Loaded: loaded (/etc/systemd/system/nginx_container.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2018-10-20 05:59:24 UTC; 1min 41s ago
Main PID: 845 (podman)
Tasks: 16 (limit: 4915)
Memory: 37.6M
CGroup: /system.slice/nginx_container.service
└─845 /usr/bin/podman start -a nginx
Oct 20 05:59:24 fedora-dev.novalocal systemd[1]: Started Podman Nginx Service.
その後、システムを再起動するたびに、systemdがこのサービス(つまりコンテナ)を自動的に起動します。
結論
Podmanは現在のコンテナエコシステムにおけるコンポーネントの一つであり、他には以下のようなものがあります。 CRI-O, Buildah 跟 Skopeo。今後、機会があればBuildahについての紹介記事を書く予定です。Skopeoについてはこちらの記事を参考にしてください。 Skopeo:コンテナイメージとレジストリを管理する方法
参考文献
著作権表示:このブログのすべての記事は、 CC BY-NC-SA 4.0 特に明記されていない限り、以下のライセンスが適用されます。


管理人の説明はとても分かりやすいですが、一部理解できない箇所がありました。
もしPodmanがDocker EngineやCRI-Oなどのコンテナランタイムデーモンに依存しないのであれば、
どのように runc と通信しているのでしょうか?runc にはあまり詳しくないのですが、runc はデーモンではないように見えます。
例えば `sudo podman ps` を実行したとき、現在実行中のコンテナ情報をどこから取得しているのか気になります。