こんにちは。サイオステクノロジー OSS サポート担当 山本 です。
突然ですが、皆さんはコンテナを扱えているでしょうか?
私は…正直、さっぱりです。
と言いますか、なかなか機会を作らず「コンテナってよく聞くけど、結局どういうものなんだろうな…」とぼんやりとは思うものの、概要から少し調べてみようと思うたびに用語や概念の多さに撃沈する…という有り様でした。
今回は Podman をとりあえず使ってみる形で、私のように「コンテナの入口に向かおうとしたけれど、入口ってどこにあるの…」となってしまっている人の足掛かりとなるような記事になればいいな、と思って書いています。
■とりあえず Podman を使ってみる
今回使う Podman は、コンテナを扱うための “コンテナエンジン” と呼ばれるものの一種…というのはひとまず置いておいて、深く考えずに動かしてみましょう。
なお、以下の手順は RHEL8 上で行うことを想定しています。
・インストール
RHEL8 では以下の 2つのコマンドを実行することで、Podman をインストールできます。
[ ~]$ sudo dnf module enable -y container-tools:rhel8 : (略) [ ~]$ sudo dnf module install -y container-tools:rhel8 : Complete! [ ~]$
他の OS、ディストリビューションを使用する場合はこちらのマニュアルを参照してください。
・Podman で Apache HTTPD を動かしてみる
ではとりあえず Podman を使ってみましょう。
今回は docker.io で公開されている Apache HTTPD を使ってみます。
その前に、curl コマンドで今回使う 8080番ポートに接続してもエラーが出ることを確認しておきましょう。
[ ~]$ curl http://localhost:8080 curl: (7) Failed to connect to localhost port 8080: Connection refused
さて、Podman で HTTPD を動かす方法ですが…以下のコマンドを実行してみてください。
実行にはちょっと時間がかかるかもしれません。
[ ~]$ podman run -dt -p 8080:80/tcp docker.io/library/httpd Trying to pull docker.io/library/httpd:latest... : Storing signatures : [ ~]$
これで HTTPD の起動ができました。ただ動かすだけなら驚くほど簡単ですね。
先と同じ curl コマンドで確認してみましょう。
[ ~]$ curl http://localhost:8080
It works!
[ ~]$
きっとこのように “It works!” と返ってくるはずです。
・もう一つ Apache HTTPD を動かしてみる?
続けて以下のコマンドを実行してみてください。
先の実行コマンドの “8080” の部分を “8081” に変えただけのコマンドです。
[ ~]$ podman run -dt -p 8081:80/tcp docker.io/library/httpd : [ ~]$
こちらも特に問題なく、そして恐らく先ほどよりも早く実行できるはずです。
この状態で curl で 8081番ポートを確かめてみると、やはり “It works!” と返ってくるはずです。
[ ~]$ curl http://localhost:8081
It works!
[ ~]$
そりゃそうだろう、という感じもしますが、ちょっと待ってください。
特に細かい設定などを何もしていないのに、なんかたった 2つのコマンドで同じ環境に 2つの HTTPD が別々に動いているっぽいですね。
・Podman の状態を確認してみる
最後に、”podman ps” コマンドで Podman の状態を確認してみましょう。
以下のような、”PORTS” が 8080 のものと 8081 のものの2行が表示されている状態になっているはずです。
[ ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d114fcaf4962 docker.io/library/httpd:latest httpd-foreground About a minute ago Up About a minute ago 0.0.0.0:8080->80/tcp cool_faraday 63d6febb3db7 docker.io/library/httpd:latest httpd-foreground 25 seconds ago Up 25 seconds ago 0.0.0.0:8081->80/tcp elegant_brattain [ ~]$
・Podman で動かした Apache HTTPD を片づける
さて、ここからは今回使った HTTPD を片づけていきましょう。
まずは “podman stop” コマンドで停止させます。引数として、先ほど確認した “podman ps” コマンドの結果から、8080 のほうの行の “CONTAINER ID” を渡しましょう。
[ ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d114fcaf4962 docker.io/library/httpd:latest httpd-foreground About a minute ago Up About a minute ago 0.0.0.0:8080->80/tcp cool_faraday 63d6febb3db7 docker.io/library/httpd:latest httpd-foreground 25 seconds ago Up 25 seconds ago 0.0.0.0:8081->80/tcp elegant_brattain [ ~]$ [ ~]$ podman stop d114fcaf4962 d114fcaf4962 [ ~]$
その後 “podman ps” コマンドを再実行すると “PORTS” が 8080 の行が消えており、curl で 8080番ポートを確認してもエラーが返ってくるはずです。
[ ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 63d6febb3db7 docker.io/library/httpd:latest httpd-foreground 2 minutes ago Up 2 minutes ago 0.0.0.0:8081->80/tcp elegant_brattain [ ~]$ [ ~]$ curl http://localhost:8080 curl: (7) Failed to connect to localhost port 8080: Connection refused [ ~]$
もう片方も以下のコマンドで停止しましょう。
CONTAINER ID を指定する代わりに “-l” オプションを使えば、最も最近起動したものを選んで停止してくれます。
[ ~]$ podman stop -l 63d6febb3db70dc97e0be597364f800b8d63d373109e52c02eba5254227be821 [ ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
さて、これで今回使った HTTPD は停止できました。しかし、まだこれらは「停止状態」で残っています。
停止状態のものを含めて Podman の状態を確認する場合、”podman ps” コマンドに “-a” オプションをつけることで確認できます。
[ ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d114fcaf4962 docker.io/library/httpd:latest httpd-foreground 3 minutes ago Exited (0) 53 seconds ago 0.0.0.0:8080->80/tcp cool_faraday 63d6febb3db7 docker.io/library/httpd:latest httpd-foreground 2 minutes ago Exited (0) 10 seconds ago 0.0.0.0:8081->80/tcp elegant_brattain [ ~]$
今回の確認のためだけに作ったものを残していても仕方がないので、これらは削除してしまいましょう。
削除する場合は “podman rm” コマンドです。”podman stop” と同じく CONTAINER ID 指定や “-l” オプションも使えますが、ここは纏めて削除するため以下のコマンドを実行してみてください。
[ ~]$ podman rm -a 63d6febb3db70dc97e0be597364f800b8d63d373109e52c02eba5254227be821 d114fcaf4962b2d1aa1617b7d127e8ba5cd5eacb276c15cd0dd92cabd216054c [ ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [ ~]$
これで今回使った HTTPD はきっちり削除できました。
ここまででなんとなく Podman を使ってみましたが、「思ったより簡単に使えそうだなー」とぼんやり感じられたのではないでしょうか。
■で、結局コンテナって何?
さて、なんとなく Podman を使って HTTPD を動かしてみましたが、コンテナはどこに出てきたのでしょう?
…と言っても “CONTAINER ID” などと出てきていますし、バレバレですね。
コンテナは Podman で管理しているもの、今回の例で言えば HTTPD (と HTTPD を動かすために Podman が作成した隔離空間) のことです。
コンテナの内容はコンテナイメージと呼ばれるものを基に作成されます。
Podman などのコンテナエンジンは、アプリケーションの動作に必要な最低限のものを纏めたコンテナイメージを基に、隔離空間 “コンテナ” にそのアプリケーションが動作するためだけの環境を作成・管理するもの…と思っておけば概ね間違いはないはずです。
今回の例で言えば、実行する際に使ったコマンドにあった “docker.io/library/httpd” がコンテナイメージに該当します。
[ ~]$ podman run -dt -p 8080:80/tcp docker.io/library/httpd
なお、Podman で扱うことのできるコンテナ・コンテナイメージは、
・同じくコンテナエンジンの一種である docker で元々使われていた形式
・OCI (Open Container Initiative) という団体が定めた基準に従った形式
の2種類です。
今回使ったコンテナイメージは、URI から見ると一見 docker 向けのもののように見えますが、Podman では docker のコンテナイメージを扱えるので問題なく動作した、ということになります。
もっとコンテナなどについて詳細に知りたい!という方はこちらの記事や Podman や docker などのマニュアル等を参照してください。
・【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜
■最後に
今回はとりあえずなんとなくで Podman を動かしてみました。
Podman やコンテナって、なんとなく、ぼんやりとだけどこんな感じなのかなぁ…とりあえず動かせはしたなぁ…くらいの感触を持ってもらえたなら幸いです。
なお余談ですが、Podman の公式によると Podman は docker のコマンドとの互換性がある、とされており、例えば
・”docker run” → “podman run”
・”docker ps” → “podman ps”
などのように Podman では、多くの docker で使用できるコマンドの “docker” を “podman” に置き換えた形でほぼ同じ機能を使うことができます。
そのため、docker に慣れている方は、特に難なく Podman を扱えるかと思います。
今回は非常にざっくりとした記事ですが、同じくらいのざっくり感でまたいずれ少し Podman について書いていこうと思っていますので、よろしければその時もお付き合いください。
(他の回)
(今回)わからないなりに理解したい Podman ① ~ 何をするもの?
わからないなりに理解したい Podman ② ~ コンテナを書き換える
わからないなりに理解したい Podman ③ ~ 可搬性とは?
わからないなりに理解したい Podman ④ ~ 可搬性とは?その2
わからないなりに理解したい Podman ⑤ ~ レジストリと TAG
わからないなりに理解したい Podman ⑥ ~ Pod って何だ?
わからないなりに理解したい Podman ⑦ ~ Pod の可搬性