podmanの覚書01(インストール/イメージ取得/情報取得まで)

podmanで遊び始めたので、
備忘録も兼ねて基本的なコマンドを書いておきます。

実行環境のOSはRed Hat Enterprise Linux 8.0です。
サクッと書いていきます。

なお詳細な内容はRed Hat社の公式マニュアルをご参照ください。
podman触るなら公式マニュアル読むのが最良の選択だと思います。

[公式マニュアル：コンテナの構築、実行、管理 (機械翻訳)](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/index)

まだ機械翻訳なので「イメージ」のことを「画像」と翻訳したりとちょっとおもしろいですが、全体的にちゃんと読めるようになっていました。

###コンテナ関連モジュールのインストール
RHEL8からは、podmanを始めとしたコンテナ関連ツールを一括でインストールできます。

```bash:container-toolsモジュールをインストール
# yum module install -y container-tools
```

`yum module`コマンドはRHEL8より新しく導入されたAppStreamリポジトリに登録されているモジュールに対して操作できるように、新規追加されたコマンドです。このモジュールをインストールすることにより、podman、buildah、skopeo、runcなどのコンテナ管理に必要なツールを一括でインストールできます。モジュールの詳細は以下のコマンドで確認できます。

```bash:container-toolsモジュールの詳細情報を確認
# yum module info container-tools:rhel8
```

これで操作までの準備は完了です。

###レジストリからイメージを取得する
`podman pull`コマンドで指定レジストリからイメージをローカルに持ってきます。なお取得先レジストリはデフォルトでdocker.io、registry.redhat.io、quay.ioの三つから選べます。このうちregistry.redhat.ioはあらかじめログインしなければレジストリにアクセスできませんので、ご注意ください。

```bash:イメージの取得
# podman login registry.redhat.io
Authenticating with existing credentials...
Existing credentials are invalid, please enter valid username and password
Username: <Red Hat PortalサイトのログインID>
Password:

Login Succeeded!

# podman pull registry.redhat.io/ubi8/ubi-init
```

registry.redhat.io/ubi8/ubi-initはsystemdを利用できるRed Hat社の標準コンテナです。バージョンはRHEL8です。他にも軽量なregistry.redhat.io/ubi8/ubi-minimalなど多数の標準コンテナが用意されており、これをもとにコンテナ開発を行い、ガイドラインの枠内で自由にイメージを共有・配布することができるようになっています。詳細は上記マニュアルのUBIイメージの項をご参照ください。

取得したらローカルで利用できるイメージ一覧を`podman images`で表示します。

```bash:イメージの表示
# podman images
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
```

###ローカルイメージの基本情報を確認
`podman inspect`コマンドでローカルに存在するイメージの基本的な情報を確認することができます。

```bash:ローカルイメージの基本情報の確認
# podman inspect registry.redhat.io/ubi8/ubi-init
```

###イメージをマウントする
さらに詳細に調査したい場合は、`podman mount`コマンドでイメージをマウントしてコンテナ内のファイルシステムの内容を確認することができます。

```bash:コンテナのマウント
# podman run -d --name RHEL8 registry.redhat.io/ubi8/ubi-init
a27180493792cbd44c3a9570479a793a54dc6978402cf57d2e9c979caf0f07e9
# podman ps
CONTAINER ID  IMAGE                                    COMMAND               CREATED        STATUS            PORTS                   NAMES
a27180493792  registry.redhat.io/ubi8/ubi-init:latest  /sbin/init            4 seconds ago  Up 4 seconds ago                          RHEL8

# podman mount a27180493792
/var/lib/containers/storage/overlay/de43908a8238604d28cf50f2dbd704378bf8506d6d613b6f740898078dc14c67/merged
# ls /var/lib/containers/storage/overlay/de43908a8238604d28cf50f2dbd704378bf8506d6d613b6f740898078dc14c67/merged
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# cat /var/lib/containers/storage/overlay/de43908a8238604d28cf50f2dbd704378bf8506d6d613b6f740898078dc14c67/merged/etc/systemd/system/default.target
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
```

さらに`rpm`コマンドでマウントポイントをルートディレクトリとして指定して実行すると、コンテナ内でインストールされているパッケージの内容を確認できます。

```bash:コンテナ内のインストール済みパッケージの確認
# rpm -qa --root=/var/lib/containers/storage/overlay/de43908a8238604d28cf50f2dbd704378bf8506d6d613b6f740898078dc14c67/merged/ | head -3
tzdata-2019a-1.el8.noarch
redhat-release-8.0-0.44.el8.x86_64
filesystem-3.8-2.el8.x86_64

# rpm -qa --root=/var/lib/containers/storage/overlay/de43908a8238604d28cf50f2dbd704378bf8506d6d613b6f740898078dc14c67/merged/ | wc -l
181
```

###リモートでコンテナの情報を確認する
`podman pull`でイメージをローカルへ取得する前に、コンテナイメージを調べるには`skopeo inspect`コマンドです。

```bash:リモートで該当レジストリのコンテナイメージの情報を取得
# skopeo inspect docker://registry.redhat.io/ubi8/ubi-init
```

なんでもかんでもぽいぽいプルしちゃうとローカルがイメージだらけになっちゃうので、情報を見たいだけならば`skopeo inspect`を利用したほうがよいと思います。

### RHEL8でDockerを使用したい場合
最後となりますが、podmanはdockerとほぼ同じ構成で各コマンドを実行できるように設計されています。さらに`podman-docker`パッケージをインストールしてから`docker`と入力すると`podman`コマンドを打ったことになるようにエイリアス設定されます。

```bash:podman-dockerパッケージをインストール
# yum -y install podman-docker
# docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
```
なおRHEL8では、dockerは標準でインストールされていないので、必要であればインストールして利用することになります。(当然ですが)docker自体のサポートはしていないのでご注意ください。

試してませんが、podman-dockerとdockerの両方をインストールしたらどうなるんですかね(;^ω^)

###感想
では、長くなりすぎるのもどうかと思うので今回はこれくらいで。次回はイメージへのタグのつけ方やコンテナイメージの保存と別のサーバなどへ配布する方法をまとめてみます。もし本記事でなにかあればご指摘やアドバイスもらえると嬉しいです。なにせまだpodmanの情報は少ないので、情報交換できるとありがたいです。

この連載記事はsystemdでredmineコンテナをサービス管理できるようになるとこまでは書きたいと思ってます。気が向いたら赴くままに書き連ねていきます。