次世代コンテナエンジンの一つ「Podman」と、そのデスクトップツールである「Podman Desktop」でコンテナ管理を進める方法を解説する本連載。今回は、Podmanでコンテナイメージを取得し、コンテナイメージからコンテナを起動したり、停止したりする方法を解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
次世代コンテナエンジンの一つ「Podman」と、そのデスクトップツールである「Podman Desktop」でコンテナ管理を進める方法を解説する本連載。前回は、次世代コンテナ管理ツールとしてPodmanやPodman Desktopが注目される理由や、コンテナエンジンとして有名なDockerとの違いを整理しました。
今回は、Podmanでコンテナイメージを取得し、コンテナイメージをもとにコンテナを起動したり、停止したりする方法を解説します。
コンテナを実行するには、まずコンテナイメージを取得する必要があります。Podmanの場合、次のいずれかのコマンドを実行することで、コンテナイメージを取得できます。
$ podman pull <イメージ取得元>
$ podman image pull <イメージ取得元>
例えば、Apache httpdのコンテナイメージを取得するコマンドは次のようになります。
$ podman pull docker.io/library/httpd
Dockerに慣れ親しんでいる人は、前述のコマンドでコンテナイメージの取得元に「docker.io/library/」という文字が追加されている点に、少し違和感を覚えるかもしれません。
Dockerの場合、コンテナイメージは「Docker Hub」から取得することが前提でした。これに対し、Podmanはさまざまなレジストリからコンテナイメージを取得することを前提としています。
そのため、取得するコンテナイメージ名が短縮されたもの(docker.io/library/といった細かい指定がないもの)を指定した場合、以下のように、どのレジストリからイメージをダウンロードするか選択する必要があります。
$ podman pull httpd ? Please select an image: registry.access.redhat.com/httpd:latest registry.redhat.io/httpd:latest docker.io/library/httpd:latest
ちなみに、ここで選択肢として表示されているレジストリは、/etc/containers/registries.confで、以下のように設定されていて、必要に応じて変更することもできます。
unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
取得したコンテナイメージは、次のいずれかのコマンドを実行することで表示、確認できます。
$ podman images
$ podman image list
httpdコンテナイメージを取得した後に、podman imagesコマンドを実行すると、次のように出力されます。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/httpd latest 494b2b45fd74 5 months ago 151 MB
なお、前回言及したように、Podmanは非特権ユーザー、つまりroot以外のユーザーで利用することを前提としています。ここで紹介したコンテナイメージの一覧表示は、そのコマンドを実行したユーザーの管理下にあるコンテナイメージが表示されています。
そのため、例えばsudoコマンドを使ってrootユーザーでこのコマンドを実行すると、次のように何もイメージがないように表示される点には注意が必要です。
$ sudo podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
取得したコンテナイメージを使用してコンテナを実行するには、次のいずれかのコマンドを実行します。
$ podman run <コンテナイメージ>
$ podman container run <コンテナイメージ>
先述したhttpdコンテナイメージを実行する場合の例は、次のようになります。
$ podman run httpd AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.15. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.15. Set the 'ServerName' directive globally to suppress this message [Fri Dec 20 14:44:57.282772 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.62 (Unix) configured -- resuming normal operations [Fri Dec 20 14:44:57.286627 2024] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND'
このように、Apache HTTPDをフォアグラウンドで実行した状態となります。せっかくWebサーバを立ち上げたので、curlコマンドを使ってアクセスしたいと思います。先ほどのコンテナを実行したターミナルとは別のターミナルを起動し、次のコマンドを実行すればレスポンスが返ってくるはず……ですが、接続できません。
$ curl http://localhost/ curl: (7) Failed to connect to localhost port 80: 接続を拒否されました
これは、コンテナが使用しているネットワークと、コンテナを起動したホスト側のネットワークが切り離されているためです。正確には名前空間が分離されている状態にあるため、接続できません。
そこで、コンテナ側の80番ポートを公開(publish)設定にして、コンテナを起動します。まず、起動していたhttpdコンテナを[Ctrl]+[C]キーでいったん終了し、ポートを公開して再度コンテナを実行します。今回の例は、コンテナ側の80番ポートを、ホスト側で12345番ポートとして公開します。
$ podman run -p 12345:80 httpd
次に、別のターミナルからローカルホストの12345番ポートに対してアクセスすると、正しく応答を得ることができます。
$ curl http://localhost:12345/ <html><body><h1>It works!</h1></body></html>
せっかくなので、レスポンス内容を変えてみたいと思います。httpdコンテナイメージのDocumentRootは、/usr/local/apache2/htdocsにあります。ここに任意のindex.htmlファイルを置くことができれば、レスポンスの内容を変更できます。
まず、次のようなindex.htmlファイルを用意します。
<html><body>I can use Podman a little.</body></html>
次に、以下のように-vオプションを使って、先ほど作成したindex.htmlファイルを、コンテナ内の/usr/local/apache2/htdocs/index.htmlにマウントします。
-vに指定するファイルはフルパスで記述する必要があるため、カレントディレクトリを、変数の${PWD}を使って表しています。
$ podman run -d -p 12345:80 -v "${PWD}/index.html:/usr/local/apache2/htdocs/index.html" httpd
その後、再度ローカルホストの12345番ポートに対してcurlコマンドでアクセスすると、先ほど作成したindex.htmlファイルの内容がレスポンスとして返ってきます。
$ curl http://localhost:12345/ <html><body>I can use Podman a little.</body></html>
また、特にコマンドオプションを指定していなければフォアグラウンドでコンテナを実行しますが、バックグラウンドで実行(detach)したい場合は、コマンドオプションの-dを指定します(コマンド実行後に表示されている文字列は、実行したコンテナのIDです)。
$ podman run -d -p 12345:80 httpd ac39bb1758f8f238d8cda766b5a537f085a20ae24274c33f16d0a02852476f83
先ほどのように、バックグラウンドでコンテナを実行すると、フォアグラウンドで実行したときと異なり、実行ログがターミナル上に表示されません。フォアグラウンドで実行したコンテナのログを取得するには、次のいずれかのコマンドを実行します。
$ podman logs <コンテナ名>
$ podman container logs <コンテナ名>
試しに、バックグラウンドで実行したコンテナのログを取得すると、次のようになります。
$ podman logs ac39bb1758f8f238d8cda766b5a537f085a20ae24274c33f16d0a02852476f83 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.15. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.15. Set the 'ServerName' directive globally to suppress this message [Sat Dec 21 01:06:06.472546 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.62 (Unix) configured -- resuming normal operations [Sat Dec 21 01:06:06.472673 2024] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND'
現在、Podmanで実行しているコンテナを一覧表示するには、次のいずれかのコマンドを実行します。
$ podman ps
$ podman container list
終了しているコンテナも併せて表示させたい場合は、コマンドオプションとして-aを指定します。
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c82428cb946a docker.io/library/httpd:latest httpd-foreground 10 hours ago Exited (0) 10 hours ago 80/tcp distracted_leakey e4add40efe6f docker.io/library/httpd:latest httpd-foreground 5 minutes ago Exited (0) About a minute ago 0.0.0.0:12345->80/tcp, 80/tcp pensive_satoshi ac39bb1758f8 docker.io/library/httpd:latest httpd-foreground About a minute ago Up About a minute 0.0.0.0:12345->80/tcp, 80/tcp amazing_wing
フォアグラウンドで実行したコンテナは、通常、[Ctrl]+[C]キーで終了させられますが、バックグラウンドで実行したコンテナの場合、[Ctrl]+[C]キーを実行できません。
バックグラウンドで実行したコンテナを終了させたい場合は、次のいずれかのコマンドを実行します。
$ podman stop <コンテナ名>
$ podman container stop <コンテナ名>
試しに、先ほどバックグラウンドで実行したコンテナを停止させてみます。podman runコマンド実行時に表示されたコンテナID、または、podman psコマンドで表示されたコンテナIDを指定してコンテナを停止させます。
$ podman stop ac39bb1758f8
ac39bb1758f8
その後、前項のコンテナ一覧表示コマンドを-aオプション付きで実行すると、コンテナID「ac39bb1758f8」のステータスが「Exited(0)」となっており、コンテナが停止していると確認できます。
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c82428cb946a docker.io/library/httpd:latest httpd-foreground 10 hours ago Exited (0) 10 hours ago 80/tcp distracted_leakey e4add40efe6f docker.io/library/httpd:latest httpd-foreground 17 minutes ago Exited (0) 13 minutes ago 0.0.0.0:12345->80/tcp, 80/tcp pensive_satoshi ac39bb1758f8 docker.io/library/httpd:latest httpd-foreground 13 minutes ago Exited (0) 4 minutes ago 0.0.0.0:12345->80/tcp, 80/tcp amazing_wing
なお、停止したコンテナは次のコマンドで再起動することもできます。
$ podman start <コンテナ名>
$ podman container start <コンテナ名>
これまで解説してきたように、コンテナは停止すると消えるわけではなく、停止した状態のまま残っています。コンテナが不要になれば、次のいずれかのコマンドでコンテナを削除できます。
$ podman rm <コンテナ名>
$ podman container rm <コンテナ名>
試しに、最初に作成したコンテナを削除してみると、正しく削除されていることが分かります。
$ podman rm c82428cb946a c82428cb946a $ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4add40efe6f docker.io/library/httpd:latest httpd-foreground 4 hours ago Exited (0) 4 hours ago 0.0.0.0:12345->80/tcp, 80/tcp pensive_satoshi ac39bb1758f8 docker.io/library/httpd:latest httpd-foreground 4 hours ago Exited (0) 3 hours ago 0.0.0.0:12345->80/tcp, 80/tcp amazing_wing
最後に、取得したコンテナイメージを削除するには、次のいずれかのコマンドを実行します。
$ podman rmi <コンテナイメージ>
$ podman image rm <コンテナイメージ>
試しに、今回取得したhttpdコンテナイメージを削除してみると、エラーが発生して削除できません。エラーメッセージを読むと、このイメージがコンテナで利用されている旨が説明されます。
$ podman rmi docker.io/library/httpd Error: image used by ac39bb1758f8f238d8cda766b5a537f085a20ae24274c33f16d0a02852476f83: image is in use by a container: consider listing external containers and force-removing image
そのため、コンテナイメージを使っているコンテナをあらかじめ削除しておくことで、コンテナイメージも削除できます。
$ podman rm -a ac39bb1758f8f238d8cda766b5a537f085a20ae24274c33f16d0a02852476f83 e4add40efe6f607d45f6a40fd2a71ff91d4d9fdf63cc13180fa69db78aa36204 $ podman rmi docker.io/library/httpd Untagged: docker.io/library/httpd:latest Deleted: 494b2b45fd74cbf7eb7dc9cfeda02b26c9450e26719afaf1914635832217c4ce $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE
次回は、Podman Desktopを使って、同様にコンテナやコンテナイメージを操作する方法を紹介します。
サイオステクノロジー所属。OSS よろず相談室でサポート対応をしているテクニカルサポートエンジニア。Ansibleに出会ってから自動化に取り憑かれ、自身の業務やプライベートであらゆるものの自動化に取り組む。プライベートではJavaでちょっとしたツールの開発を趣味にしている。
Copyright © ITmedia, Inc. All Rights Reserved.
Cloud Native Central 記事ランキング