「デーモンレス」で話題のコンテナツールPodmanをUbuntuに導入し、Webサーバーの定番であるNginxを動かすまでの手順を解説します。
Podmanとは?
Podmanは、コンテナを管理・実行するための強力なツールです。
Dockerと高い互換性を持ちながら、いくつかの決定的な違いがあります。
- アーキテクチャ
- Podman:デーモンレス (Daemonless)
- Docker:クライアント/サーバー型のデーモン(Docker Engine)が必要
- セキュリティ
- Podman:ルートレス (Rootless) 実行が容易
- Docker:デーモンがroot権限で動作するため、セキュリティリスクが存在
Podmanは、デーモン(常駐プロセス)を必要とせず、root権限なしでコンテナを実行できるため、セキュリティ上のメリットが非常に大きいのが特徴です。
既存のDockerコマンドがほぼそのまま使えるため、スムーズに移行できます。
Podmanのインストール
まずは、UbuntuにPodmanをインストールします。
インストール自体はaptを使って簡単に行うことができます。
$ sudo apt update $ sudo apt install -y podman
インストールが完了したら、バージョンを確認してみましょう。
バージョン情報が表示されれば、インストールは成功です。
$ podman --version podman version 4.9.3
Nginxイメージの取得
コンテナの元となるNginxのプログラム本体(イメージ)を、コンテナレジストリからダウンロード(プル)します。
Nginxイメージのダウンロード(プル)
今回は、最も広く使われているDocker HubからNginxの公式イメージを取得します。
$ podman pull docker.io/library/nginx:latest
ダウンロードされたイメージの確認
ダウンロード済みのイメージは、「podman images」コマンドで確認できます。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/nginx latest 203ad09fc156 7 weeks ago 197 MB
一覧に「docker.io/library/nginx」が表示されていればOKです。
Nginxコンテナの起動
ダウンロードしたイメージを元に、WebサーバーとしてNginxコンテナを実行します。
コンテナ起動コマンド
ホストOSの8080番ポートへのアクセスを、コンテナ内のNginxのデフォルトポートである80番ポートに転送するように設定します。
$ podman run -d --name podman-nginx -p 8080:80 nginx:latest
コマンドの各オプションの意味は以下の通りです。
- -d: デタッチドモードで実行(バックグラウンドで実行)
- --name コンテナ名: コンテナ名に分かりやすい名前を設定(今回は「podman-nginx」という名前を設定)
- -p 8080:80: ポートフォワーディングの設定(ホストOSの8080番ポートを、コンテナ内部の80番ポートに転送)
- nginx:latest: 起動するコンテナのイメージを指定
動作確認
起動させたNginxのコンテナの動作確認を行っていきます。
コンテナの起動ステータスの確認
コンテナが正しく実行されているかを確認します。
「podman ps」コマンドで、STATUSが Up になっていれば正常動作中です。
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b883de5b47a9 docker.io/library/nginx:latest nginx -g daemon o... 26 seconds ago Up 26 seconds 0.0.0.0:8080->80/tcp podman-nginx
curlコマンドで動作確認
「curl」でlocalhostの8080番ポートに接続してNginxの動作を確認します。
HTMLのページデータを取得できて、Welcome to nginx!が表示されれば成功です。
$ curl -s http://localhost:8080 | head -5 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>
Webブラウザで動作確認
Webブラウザから「http://localhost:8080」にアクセスします。
Nginxの「Welcome to nginx!」というページが表示されれば成功です。
コンテナの停止
作業を終えてコンテナを停止したい場合は、podman stopコマンドを使用します。
podman stop コンテナ名
今回の場合は、起動時に設定した「podman-nginx」を指定します。
$ podman stop podman-nginx podman-nginx
停止後のコンテナは、「podman ps -a」コマンドで確認できます。
停止しているコンテナはSTATUSがExitedになります。
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b883de5b47a9 docker.io/library/nginx:latest nginx -g daemon o... 26 minutes ago Exited (0) 51 seconds ago 0.0.0.0:8080->80/tcp podman-nginx
コンテナの削除
コンテナを削除したい場合は、コンテナを停止させたあとに「podman rm」コマンドを使います。
podman rm コンテナ名
「podman-nginx」を指定してコマンドを実行し、コンテナを削除します。
$ podman rm podman-nginx podman-nginx
「podman ps -a」を実行し、コンテナが一覧から消えていることを確認してください。
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コマンドまとめ
今回の作業で使用したPodmanのコマンドをまとめました。
イメージの管理
- イメージの検索 (search): podman search イメージ名
- イメージのダウンロード (pull): podman pull イメージ名
- ダウンロード済みイメージの一覧 (images): podman images
- イメージの削除 (rmi): podman rmi イメージ名
コンテナの管理
- コンテナの起動 (run -it): フォアグラウンド
- コンテナの起動 (run -d): デタッチドモード(バックグラウンド)
- 実行中のコンテナ一覧 (ps): podman ps
- すべてのコンテナ一覧 (ps -a): podman ps -a
- コンテナの停止 (stop): podman stop コンテナ名
- コンテナの削除 (rm): podman rm コンテナ名
podman run -it --name コンテナ名 -p ポート番号:ポート番号 イメージ名
「-p ポート番号:ポート番号」オプションのポートフォワーディングは必要に応じて使用
podman run -d --name コンテナ名 -p ポート番号:ポート番号 イメージ名
「-p ポート番号:ポート番号」オプションのポートフォワーディングは必要に応じて使用
レジストリ(Registry)設定について
Podmanの初期設定では、イメージ名を省略してプル(pull)したり検索(search)したりする際に、どのオンライン倉庫(レジストリ)を探しに行くべきかの情報が不足している場合があります。
そのため、そのままでは「podman pull nginx」のようにレジストリ名を省略したコマンドが使えないため、以下のようにレジストリも含めてイメージ名を指定する必要があります。
podman pull docker.io/library/nginx:latest
もし、「podman pull nginx」のようにレジストリ名を省略してイメージを取得したい場合は、registries.confファイルにレジストリの情報を検索対象として追加してあげる必要があります。
registries.conf の作成と編集(ルートレスモード)
rootユーザ以外の一般ユーザ(ルートレスモード)でPodmanを使用している場合はユーザ固有の設定ファイル「 ~/.config/containers/registries.conf」を作成し、そこにレジストリの情報を設定します。
今回は最も広く使われているコンテナイメージのレジストリである、Docker Hub (docker.io)がを追加していきます。(Docker Hubにはほとんどの公式イメージ(Nginx, Pythonなど)があります。)
$ mkdir -p ~/.config/containers $ vi ~/.config/containers/registries.conf
設定内容は以下のとおりです。
[registries.search]セクションの「registries」リストに、検索したいレジストリを優先度の高い順に並べます。
[registries.search] registries = ['docker.io', 'quay.io']
- docker.io: Docker Hubは最も広く使われているコンテナイメージのレジストリ
- quay.io: Red Hat(レッドハット)が提供・運用しているレジストリでエンタープライズやセキュリティ関連のイメージが豊富
これでレジストリを省略した形のイメージだけでpullやsearchが出来るようになります。
$ podman search nginx | head -n 3 NAME DESCRIPTION docker.io/library/nginx Official build of Nginx. docker.io/nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo..
コメント