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についてはまだないようです。
このあたりの書籍が定番のようです。
複数の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 |
次回は、より実践的な使い方として、コンテナの扱い方を掘り下げて解説します。