1. 序章

このチュートリアルでは、Podman(「PodManager」の略)、その機能と使用法について説明します。

2. ポッドマン

Podmanは、 OCI コンテナを開発、管理、実行するためのオープンソースのコンテナ管理ツールです。 他のコンテナ管理ツールと比較して、Podmanのいくつかの利点を見てみましょう。

  • Podmanによって作成されたイメージは、他のコンテナー管理ツールと互換性があります。 Podmanによって作成されたイメージはOCI標準に準拠しているため、DockerHubなどの他のコンテナーレジストリにプッシュできます。
  • root権限を必要とせずに通常のユーザーとして実行できます。root以外のユーザーとして実行する場合、Podmanはroot権限を取得するユーザー名前空間を作成します。 これにより、ファイルシステムをマウントし、必要なコンテナをセットアップできます
  • ポッドを管理する機能を提供します。 他のコンテナランタイムツールとは異なり、Podmanを使用すると、ユーザーはポッド(一緒に動作する1つ以上のコンテナのグループ)を管理できます。 ユーザーは、ポッドで作成、一覧表示、検査などの操作を実行できます

ただし、Podmanには特定の制限があります。

  • Linuxベースのシステムでのみ実行されます。 現在、PodmanはLinuxベースのオペレーティングシステムでのみ実行され、WindowsおよびmacOS用のラッパーはありません。
  • DockerComposeに代わるものはありません。 Podmanは、Docker Composeと同様に、複数のコンテナーをローカルで管理することをサポートしていません。 Podmanバックエンドを使用したDockerComposeの実装は、 podman-compose プロジェクトの一部として開発されていますが、これはまだ進行中です。

3. Dockerとの比較

Podmanとは何か、その利点と制限は何かを理解したところで、最も広く使用されているコンテナー管理ツールの1つであるDockerと比較してみましょう。

3.1. コマンドラインインターフェイス(CLI)

Podmanは、Dockerクライアントによって公開されるのと同じコマンドのセットを提供します。 つまり、これら2つのユーティリティのコマンド間には1対1のマッピングがあります。

ただし、 podmanpspodmanimages などのコマンドでは、Dockerを使用して作成されたコンテナーやイメージは表示されません。 これは、PodmanのローカルリポジトリがDockerによって維持される / var / lib / docker ではなく、 / var / lib /containerであるためです。

3.2. コンテナモデル

Dockerはコンテナーにクライアントサーバーアーキテクチャを使用しますが、PodmanはLinuxプロセス全体で共通の従来のfork-execモデルを使用します。 Podmanを使用して作成されたコンテナは、親Podmanプロセスの子プロセスです。 これが、バージョンコマンドがDockerとPodmanの両方に対して実行されると、Dockerがクライアントとサーバーの両方のバージョンを一覧表示するのに対し、Podmanはそのバージョンのみを一覧表示する理由です。

docker version の出力例:

Client:
 Version:       17.12.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    c97c6d6
 Built: Wed Dec 27 20:11:19 2017
 OS/Arch:       linux/amd64

Server:
 Engine:
  Version:      17.12.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   c97c6d6
  Built:        Wed Dec 27 20:09:53 2017
  OS/Arch:      linux/amd64
  Experimental: false

podmanバージョンのサンプル出力:

Version:       0.3.2-dev
Go Version:    go1.9.4
Git Commit:    "4f4a78abb40fa0e8407e8a55d5a67a2650d8fd96"
Built:         Mon Mar  5 11:10:35 2018
OS/Arch:       linux/amd64

Podman自体はプロセスとして実行されるため、バックグラウンドでデーモンプロセスを必要としません。 Podmanとは異なり、Dockerには、クライアントとサーバー間のAPIリクエストを調整するためのデーモンプロセスであるDockerデーモンが必要です

3.3. ルートレスモード

前述のように、Podmanはコマンドを実行するためにrootアクセスを必要としません。 一方、Dockerはデーモンプロセスに依存しているため、root権限が必要であるか、root権限なしでDockerコマンドを実行できるようにするにはユーザーがdockergroupに参加している必要があります。[ X217X]

$ sudo usermod -aG docker $USER

4. インストールと使用法

Podmanのインストールから始めましょう。 podman info コマンドは、Podmanシステム情報を表示し、インストールステータスを確認するのに役立ちます。

$ podman info

このコマンドは、カーネルバージョン、使用および使用可能なスワップスペースなどのホストに関連する情報と、イメージのプルおよびプッシュにアクセスできるレジストリ、使用するストレージドライバー、ストレージの場所などのPodmanに関連する情報を表示します。

host:
  MemFree: 546578432
  MemTotal: 1040318464
  SwapFree: 4216320000
  SwapTotal: 4216320000
  arch: amd64
  cpus: 2
  hostname: base-xenial
  kernel: 4.4.0-116-generic
  os: linux
  uptime: 1m 2.64s
insecure registries:
  registries: []
registries:
  registries:
  - docker.io
  - registry.fedoraproject.org
  - registry.access.redhat.com
store:
  ContainerStore:
    number: 0
  GraphDriverName: overlay
  GraphOptions: null
  GraphRoot: /var/lib/containers/storage
  GraphStatus:
    Backing Filesystem: extfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
  ImageStore:
    number: 0
  RunRoot: /var/run/containers/storage

基本的なPodmanコマンドのいくつかを見てみましょう。

4.1. 画像の作成

まず、Podmanを使用して画像を作成する方法を見ていきます。 次の内容でDockerfileを作成することから始めましょう。

FROM centos:latest
RUN yum -y install httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80

次に、buildコマンドを使用してイメージを作成しましょう。

$ podman build .

ここでは、最初にCentOSのベースイメージをプルし、その上にApacheをインストールしてから、ポート80を公開した状態でフォアグラウンドプロセスとして実行します。 このイメージを実行し、公開されたポートをホストポートにマッピングすることで、Apacheサーバーにアクセスできます。

build コマンドは、コンテキストディレクトリで使用可能なすべてのフォルダを再帰的に渡します。 ディレクトリが指定されていない場合、デフォルトで現在の作業ディレクトリがビルドコンテキストになります。 したがって、コンテキストディレクトリには、イメージの作成に必要のないファイルやフォルダを含めないことをお勧めします。

4.2. 利用可能な画像の一覧表示

podman images コマンドは、利用可能なすべての画像を一覧表示します。 また、画像をフィルタリングするためのさまざまなオプションもサポートしています。

$ podman images

このコマンドは、ローカルリポジトリで使用可能なすべてのイメージを一覧表示します。  これには、イメージがプルされたリポジトリ、タグ、そのイメージID、作成された時間とサイズに関する情報が含まれています。

REPOSITORY                 TAG      IMAGE ID         CREATED         SIZE
docker.io/library/centos   latest  0f3e07c0138f    2 months ago      227MB
<none>                     <none   49030e844ce7   27 seconds ago     277MB

4.3. ランニング画像

run コマンドは、指定されたイメージのコンテナーを作成して実行します。 以前に作成したCentOSイメージを実行してみましょう

$ podman run  -p 80:80 -dit centos

このコマンドは、最初にCentOSで使用可能なローカルイメージがあるかどうかを確認します。 イメージがローカルに存在しない場合、構成されたレジストリからイメージをプルしようとします。 画像がレジストリに存在しない場合は、画像が見つからないというエラーが表示されます。

上記のrunコマンドは、コンテナーの公開された80ポートをホストのポート80にマップすることを指定し、ditフラグは、コンテナーをデタッチおよびインタラクティブモードで実行することを指定します。 作成されたコンテナのIDが出力になります。

4.4. 画像の削除

rmi コマンドは、ローカルリポジトリに存在するイメージを削除します。 複数の画像は、入力でスペース区切りとしてIDを指定することで削除できます。  -a フラグを指定すると、すべての画像が削除されます

$ podman rmi 785188cd988c

4.5. コンテナの一覧表示

ps -a コマンドを使用して、実行されていないコンテナーを含むすべての使用可能なコンテナーをリストできます。 images コマンドと同様に、これはさまざまなオプションでも使用できます。

$ podman ps -a

上記のコマンドの出力には、作成元のイメージ、起動に使用したコマンド、ステータス、実行中のポート、割り当てられた名前などの情報を含むすべてのコンテナーが一覧表示されます。

CONTAINER ID   IMAGE    COMMAND     CREATED AT                      STATUS              PORTS                                    NAMES
eed30719cd37   centos   /bin/bash   2019-12-09 02:57:37 +0000 UTC   Up 14 minutes ago   0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp   reverent_liskov

4.6. コンテナの削除

rm コマンドは、コンテナーを削除します。 このコマンドは、実行中または一時停止状態のコンテナーを削除しません。 それらは最初に停止してから削除する必要があります。

$ podman stop eed30719cd37

$ podman rm eed30719cd37

4.7. ポッドの作成

podcreateコマンドはポッドを作成します。  createコマンドは、さまざまなオプションをサポートしています。

$ podman pod create

pod create コマンドは、インフラフラグを falseとして明示的に設定しない限り、デフォルトでinfraコンテナが関連付けられたポッドを作成します。

$ podman pod create --infra = false

インフラコンテナを使用すると、Podmanはポッド内のさまざまなコンテナを接続できます。

4.8. ポッドの一覧表示

ポッドリストコマンドは、使用可能なすべてのポッドを表示します

$ podman pod list

このコマンドの出力には、ポッドID、その名前、関連するコンテナーの数、使用可能な場合はインフラコンテナーのIDなどの情報が表示されます。

POD ID         NAME             STATUS      CREATED       # OF CONTAINERS   INFRA ID
7e0a68528aed   gallant_raman    Running    5 seconds ago        1           c6d06673c667

利用可能なすべてのPodmanコマンドとその使用法は、公式ドキュメントに記載されています。

5. 結論

このチュートリアルでは、Podmanの基本とその機能、Dockerとの比較、および使用可能ないくつかのコマンドについて説明しました。

いつものように、この記事で使用されているコードサンプルはGitHubから入手できます。