podmanの覚書02(イメージのタグ付け/保存/配布/削除まで)

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)

前回の投稿記事は以下から読めます。


[podmanの覚書01(インストール、イメージ取得/情報取得まで)](https://qiita.com/HOBO0222/items/37941306c33c67a75c0f)

ではサクッと書いていきます。

###イメージにタグをつけて管理する
イメージのリポジトリ名やタグ変更することで、イメージの内容を管理しやすくなります。基本的に`podman tag`コマンドを使用して、複数のパーツから構成されるイメージにエイリアスを追加して設定を変更していきます。

パーツは以下で構成されています。

`registryhost/username/NAME:tag`

NAMEだけを追加する場合は以下のコマンドを実行します。

```bash:イメージにNAMEだけを付加する
# podman images
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
# podman tag 8c376a94293d rhel8init
# podman images
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        latest   8c376a94293d   2 months ago    231 MB
```

上記のようにNAME部分だけを指定してREPOSITORY名の設定を変更できますが、tagを明記せずに省略するとlatestが自動でタグ付けされるのでご注意ください。

任意のタグをつけたい場合は以下のコマンドを実行します。

```bash:イメージにNAMEとtagを追加する
# podman tag 8c376a94293d rhel8init:8.0
# podman images
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        8.0      8c376a94293d   2 months ago    231 MB
```

NAMEの先頭にユーザ名やレジストリも追加できます。ユーザ名を追加する例は以下の通りです。

```bash:イメージにユーザ名も追加する
# podman tag 8c376a94293d hobo0222/rhel8init:8.0
# podman images
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
localhost/hobo0222/rhel8init               8.0      8c376a94293d   2 months ago    231 MB
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        8.0      8c376a94293d   2 months ago    231 MB
```

###イメージを保存する
作成したコンテナイメージを保存する場合は、`podman save`コマンドを実行します。

```bash:イメージを保存
# podman save -o  rhel8init.tar localhost/hobo0222/rhel8init:8.0
Getting image source signatures
Copying blob 24d85c895b6b: 205.76 MiB / 205.76 MiB [========================] 9s
Copying blob c613b100be16: 20.00 KiB / 20.00 KiB [==========================] 9s
Copying blob 188ab351dfda: 14.62 MiB / 14.62 MiB [==========================] 9s
Copying config 8c376a94293d: 4.77 KiB / 4.77 KiB [==========================] 0s
Writing manifest to image destination
Storing signatures
# ls -l | grep rhel8init
-rw-r--r--.  1 root root 231128576  7月  6 07:13 rhel8init.tar
```
完了するとイメージがtarファイルで保存されます。このtarファイルをpodmanが利用できる別サーバへ転送してインポートを行うと、別環境でも再利用できるようになります。インポートのコマンドは以下の通りです。

```bash:tarファイルを転送
[root@rhel8s01 ~]# scp /root/rhel8init.tar root@192.168.0.48:/root/
root@192.168.0.48's password:
rhel8init.tar                                                                                                                                            100%  220MB  55.1MB/s   00:04
```
rootで転送しているところは検証環境なのでお許しください。

```bash:転送してきたイメージをインポート
# ls -l | grep rhel8init
-rw-r--r--. 1 root root 231128576  7月  6 07:16 rhel8init.tar
# podman images
# podman import -m "Test Podman Container." rhel8init.tar new-image:latest
Getting image source signatures
Copying blob 8d4afee43c3a: 220.42 MiB / 220.42 MiB [========================] 7s
Copying config d146106c6c84: 420 B / 420 B [================================] 0s
Writing manifest to image destination
Storing signatures
d146106c6c8472ec7d1d762b307b57d09a9601d086daa89cbbaf349aa194a883
# podman images
REPOSITORY                    TAG      IMAGE ID       CREATED          SIZE
docker.io/library/new-image   latest   d146106c6c84   39 minutes ago   231 MB
# podman tag d146106c6c84 localhost/hobo0222/rhel8init:8.0
# podman images
REPOSITORY                     TAG      IMAGE ID       CREATED          SIZE
docker.io/library/new-image    latest   d146106c6c84   39 minutes ago   231 MB
localhost/hobo0222/rhel8init   8.0      d146106c6c84   39 minutes ago   231 MB
# podman load < rhel8init.tar
Getting image source signatures
Copying blob 24d85c895b6b: 205.76 MiB / 205.76 MiB [========================] 7s
Copying blob c613b100be16: 20.00 KiB / 20.00 KiB [==========================] 7s
Copying blob 188ab351dfda: 14.62 MiB / 14.62 MiB [==========================] 7s
Copying config 8c376a94293d: 4.77 KiB / 4.77 KiB [==========================] 0s
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/hobo0222/rhel8init:8.0
```

これで別サーバでも作成したコンテナを操作できるようになります。

```bash:転送したコンテナを起動
# podman run --rm -it localhost/hobo0222/rhel8init:8.0 bash
bash-4.4# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.0 (Ootpa)
```

このあたりの記述が公式マニュアルには`podman import`コマンドでインポートまでしか書いてくれていないので、`podman load`コマンドなどや`podman tag`コマンドの操作は色々調べて我流でやってみたので効率悪そうです。もっとスマートなやり方でコンテナ起動まで進める手順があれば、ぜひ教えて頂きたいです...。

`podman import`コマンド実行時に`registryhost/username/NAME:tag`のどれかで指定していない分はどうやらデフォルト設定が入るようになってるようなのですが、このデフォルトの変え方をやるのかがいま知りたいですね。おそらく/etc/containerディレクトリのどこかで設定できるのでは？と思うのですが...。

###イメージを削除する
不要になったイメージは`podman rmi`コマンドで削除できます。イメージが実行されているコンテナは削除できませんので、削除前に`podman stop`コマンドで停止させてから実行してください。

```bash:イメージを削除
# podman images
REPOSITORY                     TAG      IMAGE ID       CREATED             SIZE
docker.io/library/new-image    latest   d146106c6c84   About an hour ago   231 MB
localhost/hobo0222/rhel8init   8.0      8c376a94293d   2 months ago        231 MB
# podman rmi docker.io/library/new-image
d146106c6c8472ec7d1d762b307b57d09a9601d086daa89cbbaf349aa194a883
# podman images
REPOSITORY                     TAG   IMAGE ID       CREATED        SIZE
localhost/hobo0222/rhel8init   8.0   8c376a94293d   2 months ago   231 MB
```
イメージをスペースで区切れば複数のイメージを一括で削除できます。

```bash:イメージの一括削除
# podman rmi registry.redhat.io/ubi8/ubi-init registry.redhat.io/ubi8/minimal
```

全てのイメージを削除したい場合は以下のコマンドを使用します。

```bash:イメージの全削除
# podman rmi $(podman images -a -q)
# podman images
```

複数のタグが関連づけられたイメージを削除する際はオプションにforceをつけてください。

```bash:複数タグがついているイメージを削除
# podman images
REPOSITORY                                 TAG      IMAGE ID       CREATED         SIZE
localhost/johndoe/webserver                latest   76deb4bffebc   3 days ago      241 MB
registry.access.redhat.com/ubi8/ubi        latest   1a2a4fce0369   8 days ago      216 MB
registry.redhat.io/ubi8/ubi                latest   1a2a4fce0369   8 days ago      216 MB
localhost/nextcloud                        latest   f431c65ac572   11 days ago     684 MB
docker.io/library/nextcloud                latest   f431c65ac572   11 days ago     684 MB
registry.redhat.io/ubi8/ruby-25            latest   866ca9cf4510   2 weeks ago     663 MB
docker.io/library/wordpress                latest   5e5e0b1aa9dd   2 weeks ago     458 MB
registry.redhat.io/rhel8/rsyslog           latest   93a2f50b3eb0   3 weeks ago     235 MB
docker.io/library/redmine                  latest   3be74ba3cc8c   3 weeks ago     599 MB
docker.io/library/bash                     latest   417531d957ab   7 weeks ago     17.5 MB
localhost/hobo0222/rhel8init               8.0      8c376a94293d   2 months ago    231 MB
registry.redhat.io/ubi8/ubi-init           latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        latest   8c376a94293d   2 months ago    231 MB
localhost/rhel8init                        8.0      8c376a94293d   2 months ago    231 MB
registry.redhat.io/ubi8/ubi-minimal        latest   3bfa511b67f8   2 months ago    91.7 MB
registry.fedoraproject.org/f27/httpd       latest   18f01f6f77ef   11 months ago   426 MB
quay.io/appuio/oso-centos7-zabbix-server   latest   cd45ed6b9e52   19 months ago   586 MB
docker.io/library/rails                    latest   660f41442a27   2 years ago     865 MB
# podman rmi $(podman images -a -q)
76deb4bffebcf26758763f5dbeb61b26f024e6613833af4c9359579c9303278b
unable to delete 1a2a4fce03697e74648ba88fcf548b8fa7f1e27a9c6aaf7b2f319efae51e75b5 (must force) - image is referred to in multiple tags
866ca9cf4510d1853b373618208c6c68986498c1895d6891f62519e5377d7d07
5e5e0b1aa9dde1cb3b54d40a53542d65cfafc6d080413db18d65204238ed29a7
unable to delete f431c65ac57238a9ade9f6406c41d077ea0a469df893eac0a03e4fe04dee830c (must force) - image is referred to in multiple tags
could not remove image 93a2f50b3eb0e35c37c0e81798933553d8938e5bbe6df4fa901d3fa181ef8af9 as it is being used by 1 containers
417531d957ab80b157983048939843d1f343cdf773b724252a8f3608158839e2
could not remove image 3be74ba3cc8c924cbd496e8ff1381cecc51c60d0c0fe088a0768fa641f1b68d3 as it is being used by 1 containers
3bfa511b67f82778ace94aaedb7da39d353f33eabc9ae24abad47805b6cef9c3
18f01f6f77ef941f5b31dd007d113620cbb1939ac33d1922edce7d9d2c9ebad7
cd45ed6b9e528278ffd1ff4a29d8eacc159c6fbdb202aa45d3d69f4dfa2a0b79
660f41442a278fab36077eaad1cb0bce5e0842b5ad5e34d0e3bb9ccf995391d3
unable to delete 8c376a94293dbec40d6a5cb244e9127afd587d5fe15585d06b87b7fc9561d873 (must force) - image is referred to in multiple tags

# podman rmi -f $(podman images -a -q)
1a2a4fce03697e74648ba88fcf548b8fa7f1e27a9c6aaf7b2f319efae51e75b5
f431c65ac57238a9ade9f6406c41d077ea0a469df893eac0a03e4fe04dee830c
93a2f50b3eb0e35c37c0e81798933553d8938e5bbe6df4fa901d3fa181ef8af9
3be74ba3cc8c924cbd496e8ff1381cecc51c60d0c0fe088a0768fa641f1b68d3
8c376a94293dbec40d6a5cb244e9127afd587d5fe15585d06b87b7fc9561d873
# podman images
#
```

-forceはコンテナが起動中でイメージを使ってようがお構いなしに削除するので、利用せざるを得ない時は慎重にご利用ください。

次回はRedmineコンテナイメージをプルしてローカルで起動させて、systemdでサービス管理できるようになるところまで書きたいと思います。読んでいただきありがとうございました。