「Podman」で始めるコンテナ管理 コンテナイメージを取得し、コンテナを実行してみよう次世代コンテナエンジン「Podman」「Podman Desktop」入門(2)

次世代コンテナエンジンの一つ「Podman」と、そのデスクトップツールである「Podman Desktop」でコンテナ管理を進める方法を解説する本連載。今回は、Podmanでコンテナイメージを取得し、コンテナイメージからコンテナを起動したり、停止したりする方法を解説します。

» 2025年02月25日 05時00分 公開
[鎌田啓佑サイオステクノロジー]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 次世代コンテナエンジンの一つ「Podman」と、そのデスクトップツールである「Podman Desktop」でコンテナ管理を進める方法を解説する本連載。前回は、次世代コンテナ管理ツールとしてPodmanやPodman Desktopが注目される理由や、コンテナエンジンとして有名なDockerとの違いを整理しました。

 今回は、Podmanでコンテナイメージを取得し、コンテナイメージをもとにコンテナを起動したり、停止したりする方法を解説します。

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でちょっとしたツールの開発を趣味にしている。

サイオス OSS よろず相談室

サイオステクノロジーエンジニアブログ

サイオステクノロジーエンジニア YouTube チャンネル

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Cloud Native Central 記事ランキング

本日月間

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。