podmanの使い方入門その1 (インストールと動作確認)

CentOS8で新たに開発環境構築しました。ついでにDockerも使うかということで調べていたのですが、どうもRedHat系OSはDocker非推奨になっている様子。
無理やり入れればDockerもインストール可能なようですが、代わりにpodmanというアプリがあるようなので、試しにこちらを使ってみることにしました。
一応、dockerを使ったことがない人向けに書いていますので、基本的なことから記述しています。

podmanとは?Dockerとの違い

RedHat社が開発したコンテナ管理ツールです。こんな感じのロゴ

アザラシかな?なんかかわいい。
Podmanは、Dockerと互換性があり、引数などの指定方法は、Dockerと同じようなので、知識はあまり無駄にならなくて済みそうです。

podmanの良いところ・悪いところ

podmanの良いところは、まずコマンドがDockerと互換性があるためDockerの使い方を知っていれば、podmanを使うことができます。
また、ルートレス、つまりroot権限不要で動作します。Dockerはホストのサーバー自体のroot権限が必要なので、気軽に使ってもらうということができませんでしたが、podmanはユーザー権限で動作しますし、セキュリティー的にも安全です。

半面、完全に互換があるわけではなく、例えばネットワーク周りなどで複数コンテナを連携させるのは独自の仕組みが必要です。この辺りはdockerの上意の管理アプリであるdocker-composeで設定していることが多いのですが、この方法はpodmanでは使えません。非公式のpodman-composeというのが一応あるにはあるようなのですが、現状はまだ実用というわけではないようです。

これからpodmanを使う場合、複数コンテナの連携周りの仕様が違うことを念頭に置いたうえで、わからないことはとりあえずDockerの使い方で調べるのがよさそうです。
書籍なども調べてみましたが、Docker関連の入門書は結構ありますが、podmanについてはまだないようです。
このあたりの書籍が定番のようです。

Amazon.co.jp
Amazon.co.jp

複数のLinuxディストリビューションでDockerの公式サポートが切られている状態なので、今後コンテナはpodmanが利用されていくのではないかと思われます。よって、今からやるのであればDockerよりもpodmanを使っていったほうが良いかもしれません。

podmanのインストールと動作確認

とりあえず、念のためシステム全体を更新して、podmanとpodman-dockerをインストールします。
podman-dockerはなくてもいいですが、podmanのエイリアスみたいな感じのようで、dockerコマンドで入力するとpodmanに変換して渡してくれるようになるみたいです。
ついdockerって入力しちゃってもファイルがありません見たいなことにならなくて安心です?

# dnf -y update
# dnf -y install podman
# dnf -y install podman-docker

とりあえずバージョン確認

podman -v
podman version 1.6.4

ヘルプ(コマンド一覧)

#podman --help

それぞれのコマンドのオプションは

podman [command] --help

コンテナシステムの概念としては
まず環境設定としてまずイメージというのがあり、これは使いたいアプリと設定などが入ったのがイメージ。
イメージは公式サイトなどから引っ張ってくることもできるし、自分でビルドして作成することもできます。

そのイメージから名前を付けてコンテナを作ります。アプリ自体はコンテナの中で動作します。
コンテナは名前を変えれば同じコンテナから複数作れるので、自由に環境を構築できるというわけです。

ということで、まずはイメージの取得の取得します。
とりあえず、イメージは公式のhttpd(apache)を使って動作確認をします。
イメージの取得はpullコマンドを使います。

# podman pull httpd

確認してみる

# podman images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY              TAG          IMAGE ID       CREATED      SIZE
docker.io/library/httpd   latest   0a30f4c29d25   2 weeks ago   142 MB

取得したイメージでhttpd-srvというコンテナ名を付けて起動してみます(初回起動)
続けて、コンテナの一覧を表示してみます。

# podman run -d --name "httpd-srv" docker.io/library/httpd 
# podman ps
CONTAINER ID  IMAGE                         COMMAND  CREATED        STATUS                    PORTS  NAMES
2fb192c6acd7  docker.io/library/httpd:latest  httpd-foreground  7 seconds ago  Up 6 seconds ago         httpd-srv

STATUSがUpになっている場合は起動しています。
因みに、nameオプションで名前を付けないと、勝手にいい感じの名前が付くようです(NAMESのところ)
一度コンテナを終了させて、プロセスの確認をしてみましょう

# podman stop httpd-srv
# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

表示が消えたので終了したようです。
終了済みのものも含めて表示したい場合は

podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS                    PORTS  NAMES
2fb192c6acd7  docker.io/library/httpd:latest  httpd-foreground  5 minutes ago  Exited (0) 2 minutes ago         httpd-srv

とします。
状態を確認したい場合は、とりあえず終了済みのものも含めてpodman ps -aを使うのが良いかと思います。

2回目以降の起動は、startコマンドにコンテナ名(コンテナIDでもOK)を付けます

podman start httpd-srv
httpd-srv
$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED             STATUS                 PORTS  NAMES
2a6d9074c8a7  docker.io/library/httpd:latest  httpd-foreground  About a minute ago  Up About a minute ago         httpd-srv

StatuがUPになっているので起動しているのが分かるかと思います。

ここが変だよpodman/docker

ちょっと脱線します
コンテナを起動するのに、run と start の二つのコマンドがあります。ここがコンテナシステムをわかりにくくしているポイントの一つだと思います。
runコマンドは、コンテナをRUN(起動)させるコマンドかと思いきや、実は”イメージからコンテナを生成して起動する”というコマンドです。
一方startはコンテナを起動するコマンドです。
だいたいの初心者向けの説明ブログだとrunで起動してstopで終了してめでたしめでたしで終わっているので、いざ本格的に使おうとして躓くポイントです。
runはまぁあってもいいけど、コンテナを作るというコマンドは別にあったほうがいいんじゃないかなという気はします
※ありました、createコマンドでできるようです。

じゃあ、どっち使えばいいんだよという話になるかと思いますが、基本的にstartかなぁ…。
runを使わない理由は、終了したプロセスが大量に残るのと、コンテナ生成時、ダウンロードはキャッシュからなので大丈夫ですが、そのほかの設定をしているから若干起動に時間がかかるような気がします。
ただ、プロセスに関しては”–rm”オプションを付けることで終了時に削除されるようなので、ちょっと試すとかワンタイムで使う場合にはrunコマンドでもいい気がします。

本番サーバー用途で使う場合は、systemctl に統合する方法があるようなのでこちらを使えばよさそうです。
PODMAN を使用した SYSTEMD へのコンテナーの移植

コンテナごとの設定

さて、podman上では動作していますが、内部のHTTPDにが動いているかどうかはどうやって確認したらいいのかというと、現在の設定では無理です。
コンテナ内部のネットワーク空間で動いているので、外からアクセスできないんです。
どうするかというと、コンテナ生成時にホストとコンテナの間でポートフォワーディングする設定を追加します。
そのほか、使用するメモリ量の割り当てなど、コンテナに依存するような設定もコンテナ生成時に行います。
使いそうなオプションを下記にまとめましたが、詳しくは

# podman run --help

で一覧を参照できます

主なコンテナ生成オプション

オプション 説明
–name コンテナ名を指定
podman run -it --name "contenaname" httpd
-d バッググラウンド実行
podman run -d httpd
-it コンソールに結果を出力
podman run -it --name "contenaname" httpd
-p host:cont ポートフォワーディング
podman run -d -p 8080:80 httpd
–add-host ホスト名とIPを指定
podman run -it --add-host=hoge.com:192.168.1.1 httpd
–dns DNSサーバを指定
podman run --dns=192.168.1.1 httpd
–mac-address MACアドレスを指定
podman run -it --mac-address="92:d0..." httpd
–cpu-shares CPU配分 (全体で1024)
podman run --cpu-shares=512 httpd
–memory メモリの上限
podman run --memory=512m httpd
-v ディレクトリの共有
podman run -v /c/Users/src:/var/www/html httpd
-e 環境変数を設定
podman run -it -e foo=bar httpd /bin/bash
–env-file 環境変数リストから設定
podman run -it --env-file=env_list httpd /bin/bash
-w 作業ディレクトリを指定
podman run -it -w=/tmp/work httpd /bin/bash

次回は、より実践的な使い方として、コンテナの扱い方を掘り下げて解説します。

podmanの使い方入門その2 (コンテナの作成と基本的な使い方)
前回はインストールと簡単な動作確認を行いました。 今回はより本格的な使い方として、コンテナの扱い方と環境依存の設定をしてみたいと思います。 設定を付けてコンテナを起動 80ポートを見れるように設定したコンテナを起動してみたいと思います。 と...
タイトルとURLをコピーしました