DockerからPodmanに！

# はじめに
この記事は、Podmanについて調べた際の備忘録です。
また、DockerからPodmanに切り替えを検討している方の検討材料になればと思っています。

## Podmanとは
Podmanとは、Red Hat社が提供している、コンテナを開発、管理、実行するためのオープンソースツールです。
PodmanはDockerの代替を目指して開発されたため、Dockerとの互換性があります。

また、Podmanには<font color="Red">**デーモンレス**</font>&<font color="Red">**ルートレス**</font>という特徴があり、Dockerよりもセキュリティリスクが少ないというメリットもあります。

以下公式サイト

https://www.redhat.com/ja/topics/containers/what-is-podman

:::note
そもそもコンテナとはなんぞや、、
という方は以下の記事などを参考にしてみて下さい。
:::
https://qiita.com/shinkai_/items/486f8b75d5904752842e

## なぜ(Dockerではなく)Podmanを利用しようと思ったのか
Podmanの特徴を紹介する前に、筆者がPodmanを利用しようと思った理由を説明させて下さい。
理由は1つだけです。

**<font color="DeepPink">RHEL8系からDockerが非推奨となったため</font>**

以上です。

https://access.redhat.com/ja/solutions/7028712

PodmanがDockerに劣らない優秀なツールだということは調べて分かりましたが、正直上記の理由がなかったらPodmanについて調べることもなく、そのままDockerを使い続けていたと思います。。。


## Podmanの特徴＆Dockerとの違い
- ルートレス
    <details><summary>コンテナの実行にroot権限を必要としない</summary>
    
    >ルートレスにすることで、管理者権限のあるプロセスを必要とせずにコンテナを作成、実行、管理できるため、コンテナ環境がアクセスしやすくなり、セキュリティリスクも軽減されます。

    Dockerはrootでの操作が前提のため、コンテナを実行するにはroot権限が必要。
    →コンテナ内からホストへの攻撃が可能
    　→セキュリティ的によろしくない

    （ただ、Dockerにもルートレスモードという機能はあるみたいです）
    
    </details>

<br>

- デーモンレス
    <details><summary>root権限を持つデーモンの操作が不要</summary>

    >デーモンはコンテナ環境を管理する上では便利な方法だと言えますが、セキュリティの脆弱性をもたらす可能性もあります。多くのデーモンは、root 権限で実行されます。
    
    >Podman はデーモンを使用せず、通常のユーザーが root 権限を持つデーモンを操作することなくコンテナを実行したりルートレスコンテナを使用できるようにしたりします。

    
    
    </details>

<br>

- systemdの介入
    <details><summary>systemdでコンテナを管理</summary>

    >Podman は systemd (Linux オペレーティングシステムのシステムおよびサービスマネージャー) を使用して更新を行い、コンテナを常にバックグラウンドで実行します。systemd と Podman を統合することで、コンテナの制御ユニットを生成し、systemd を自動的に有効にした状態でそれらを実行できます。

    >ユーザーは、システム上の自分のリポジトリまたは systemd ユニットを使用してコンテナの自動起動と管理を行えます。ユーザー自身でリソースを管理でき、root 権限なしでコンテナを実行可能なため、不要なシステム領域への書き込みアクセス権など、余計な権限を追加してしまうことがありません。

    systemdでコンテナを起動することができるため、systemdによってコンテナ内のプロセスを追跡することも可能
    
    </details>

<br>

- Pod
    <details><summary>複数のコンテナをPodで管理</summary>

    >Pod は、Kubernetes Pod と同様、まとまって稼働し、同じリソースを共有するコンテナのグループです。Podman は、単純なコマンドライン・インタフェース (CLI) と libpod ライブラリ (コンテナ、Pod、コンテナイメージ、ボリュームを管理するアプリケーション・プログラミング・インタフェース (API) を提供) を介してこれらの Pod を管理します。

    >Pod はそれぞれ、1 つのインフラコンテナと任意の数の通常のコンテナで構成されます。インフラコンテナでは、Pod の稼働とユーザーの名前空間を維持することで、コンテナをホストから分離しています。

    Dockerの場合は、docker-composeというツールを利用することで複数のコンテナの作成・起動を行うことができます。Podmanの場合はPodを利用することで、複数のコンテナを1つのPodにまとめて、作成や起動を行うことができます。
    
    </details>

## DockerからPodmanに移行する際の懸念点と解決策（調べた結果）

**Q. デーモンレスによる弊害はないか（コンテナの自動起動設定など）**
<font color="Red">A</font>. systemdを利用する

:::note 
解説

Dockerの場合は、コンテナの自動起動設定やプロキシ設定はDockerデーモンに対して設定・命令をしていたため、デーモンレスのPodmanの場合はどうやって設定したらいいの？と少し懸念がありました。

結果、systemdを利用して設定することで私のやりたいことはある程度解決できそうな気がしています。
自動起動設定であれば、Systemdのユニットファイルを作成してコンテナの自動起動設定ができるみたいです。
具体的にはコンテナのサービスを生成して、そのサービスが自動起動するように設定するイメージですかね。

dockerのrestart=alwaysより手間がかかりそうで少し残念。。。

参考：[Podman : コンテナーの自動起動の設定](https://www.server-world.info/query?os=CentOS_Stream_8&p=podman&f=13)
:::

<br>

**Q. dockerの時に使用していたdocker-compose.yamlはPodmanに移行できるのか**
<font color="Red">A</font>. podman-composeを利用すればそのまま移行が可能

:::note
解説

PodmanはDockerと互換性があるように作られていますが、公式ではdocker-composeをサポートしないとのことでした。（Kubernetes YAML によるコンテナオーケストレーションを利用するのが前向きな考え）

ただ、サードパーティ製ではあるがコミュニティによって開発されたpodman-composeがある。
これを使えばdocker-composeを容易に移行することができそう。

参考：[containers/podman-compose](https://github.com/containers/podman-compose)
:::

## Podmanコマンド
よく使うコマンドをまとめたので良かったらDockerと見比べてみて下さい。

https://qiita.com/high_high/items/6dfbfe1f9cdfbe6d8d96


# おわりに
Podmanはデーモンレスでルートレスでセキュア！
k8sと連携できるのも大きなメリットかと。（私はまだ利用する想定がないので調べていないですが）
Dockerは便利だなぁと思いながら使い方もやっと慣れてきたところに、非推奨ということで少し残念な気持ちでしたが代替のPodmanがDockerと同じように使えそうで少し安心です。
Dockerで利用していた操作だけでなく、Podmanならではの機能も今後は活用してみたいと思います。

# 参考文献

- [RedHat公式サイト](https://www.redhat.com/ja/topics/containers/what-is-podman
)
- [今さら聞けないコンテナとは](https://qiita.com/shinkai_/items/486f8b75d5904752842e)
- [Docker互換のセキュアなコンテナ実行環境「Podman」超入門](https://speakerdeck.com/devops_vtj/dockerhu-huan-nosekiyuanakontenashi-xing-huan-jing-podman-chao-ru-men?slide=22)
- [Podman : コンテナーの自動起動の設定](https://www.server-world.info/query?os=CentOS_Stream_8&p=podman&f=13)
- [containers/podman-compose](https://github.com/containers/podman-compose)