Fedora で Docker から Podman へ移行するガイド:開発者にとってより安全で効率的に

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

はじめに:ソフトウェア開発の進歩としてのコンテナ化

コンテナは今日のソフトウェア開発と運用において重要な技術となっています。これらはアプリケーションを必要なものすべてと一緒にパッケージ化し、開発マシンから本番環境まで一貫した環境を保証します。

Docker は、コンテナといえば業界標準とも言えるおなじみの名前です。しかし、Fedora では、検討する価値のある、あるいはより推奨される別の選択肢があります。それが Podman です。

私は Fedora をメインの開発マシンとして 2 年間使用しています。パッケージの更新速度と安定性には非常に満足しています。その間、様々なコンテナ技術を試す機会がありましたが、Podman は本当に際立っていました。開発環境を最適化したい Fedora ユーザーにとって、Podman への移行は合理的な選択です。

この記事では、Docker と Podman の違い、Fedora で Podman を使用する利点、そして最も重要な、スムーズな移行のためのステップバイステップガイドを一緒に見ていきます。

コンテナランタイム:Docker と Podman – 2つの異なるアプローチ

Docker と Podman はどちらもコンテナの作成と管理を可能にしますが、その内部アーキテクチャは大きく異なります。これを理解することは、ニーズに合ったツールを選択するのに役立ちます。

Docker:ルートデーモンを持つ従来のクライアント・サーバーアーキテクチャ

Docker アーキテクチャは、root 権限でバックグラウンドで実行されるデーモン(dockerd)を使用します。このデーモンは、イメージ、ネットワーク、ボリュームなど、コンテナに関連するすべてを管理する責任を負います。

docker run コマンドを実行するとき、あなたは Docker クライアントと対話しています。このクライアントは API を介して dockerd にリクエストを送信し、デーモンがコンテナの作成と実行を実行します。

# Docker のアーキテクチャ
+-----------------------+
|    Docker クライアント      |
| (例:docker run)    |
+-----------+-----------+
            |
            |  API 呼び出し
            |
+-----------v-----------+
|    Docker デーモン      |
| (root として実行され、すべての |
|  コンテナを管理します)      |
+-----------------------+
            |
            | コンテナ操作
            |
+-----------v-----------+
|  コンテナランタイム    |
|   (例:containerd)  |
+-----------------------+

dockerd が常に root 権限で実行されることは便利ですが、大きなセキュリティリスクを伴います。デーモンが攻撃された場合、悪意のある攻撃者がシステム全体を制御する権限を取得する可能性があります。

Podman:デーモン不要のコンテナ、より柔軟に

Podman (POD MANager) は、デーモン不要という哲学に基づいて設計されています。コンテナを実行すると、Podman はバックグラウンドで root サービスを介さずに、ユーザー自身のサブプロセスとして直接起動します。

# Podman のアーキテクチャ
+-----------------------+
|    Podman クライアント      |
| (例:podman run)    |
+-----------+-----------+
            |
            |  直接システムコール
            |
+-----------v-----------+
|   あなたのユーザープロセス   |
| (自身の pod とコンテナを |
|  管理します)      |
+-----------------------+
            |
            | コンテナ操作
            |
+-----------v-----------+
|  コンテナランタイム    |
|   (例:runc, crun)  |
+-----------------------+

各 Podman コンテナは、コマンドを呼び出すユーザーの権限で実行されます。これはルートレスコンテナと呼ばれます。これは、コンテナの影響範囲をそのユーザーアカウント内に限定するため、セキュリティ上の大きな利点となります。

興味深いことに、Podman は Docker コマンドとほぼ同じように使用できます。これにより、移行が非常に簡単になります。

なぜ Fedora で Docker から Podman への移行を検討すべきか?

Docker は依然として優れたツールですが、Fedora では Podman が検討すべき significant な利点をもたらします。

Podman の注目すべき利点

  • ルートレスコンテナによる優れたセキュリティ:これが Podman の最大の利点です。root で実行されるデーモンがないため、セキュリティリスクが大幅に軽減されます。一般的なユーザー権限で実行されるコンテナは、侵害された場合にシステムの重要な部分にアクセスしたり破壊したりすることはできません。

    例:コンテナ内のアプリケーションが悪用された場合、攻撃者は現在のユーザーと同じ権限しか持たず、システム全体への権限昇格はできません。

    # ルートレスコンテナを実行する例
    podman run --rm docker.io/hello-world
    
    # コンテナ内のユーザー ID を確認する (通常は 0 ですが、外部ではあなたのユーザーです)
    podman run --rm alpine id
    # uid=0(root) gid=0(root) groups=0(root)  <-- コンテナ内
    # ただし、外部にマッピングされると、それはあなたのユーザー ID です
  • Linux エコシステムとの良好な統合:Podman は Fedora の開発元である Red Hat によって作成されました。systemd(サービス管理)や SELinux(セキュリティ強化)などの Linux 基盤技術と密接に統合されています。これにより、システムはスムーズかつ安全に動作します。

  • Docker コマンドとの互換性:ユーザーの移行を容易にするため、Podman は Docker と互換性のある CLI を備えています。ほとんどの docker コマンドは、変更なしで直接 podman に置き換えることができます。

  • より効率的なリソース管理:Podman はバックグラウンドで常に実行されるデーモンを持ちません。コンテナがアクティブな場合にのみリソースを消費します。これにより、コンテナが実行されていないときに、マシンの RAM と CPU を節約できます。

注意すべきいくつかの欠点

  • ツールエコシステム:Docker は歴史が長いため、広範なツールエコシステムとサードパーティの統合を誇っています。特に Docker Compose は、マルチコンテナアプリケーションの定義と実行において非常に人気があります。

    それでも、Podman にも代替ソリューションがあります。例:podman-compose や、コンテナから Kubernetes YAML ファイルを生成する機能など。

  • わずかな学習曲線:高いコマンド互換性があるにもかかわらず、いくつかの小さな違いがあります。ルートレスコンテナで Podman がネットワークやボリュームを処理する方法について学ぶ必要があるでしょう。しかし、全体的に見て、移行プロセスはかなりスムーズです。

Fedora と Podman:自然な組み合わせ

私にとって、Fedora が Podman を優先しているという事実は、明確なシグナルでした。Fedora を使用する開発者として、これは非常に理にかなっており、セキュリティを強化し、システムを最適化するものだと感じています。

Fedora 31 以降、Podman はドキュメントと推奨事項において Docker に代わってデフォルトのコンテナランタイムとなっています。podman-docker パッケージも利用可能で、docker シンボリックリンクを podman にポイントさせることで、移行はほぼ透過的に行われます。

# podman-docker のインストール後、'docker' シンボリックリンクが 'podman' を指しているか確認します
ls -l /usr/bin/docker

この組み合わせは、セキュリティにとどまりません。これは、最新かつ最も先進的な Linux ディストリビューションの 1 つで、ツールが連携して効率的に動作するように設計された、調和のとれたエコシステムを構築します。

Fedora で Docker から Podman へ移行するガイド

さあ、始めましょう。このプロセスは、Podman を使用したことがない場合でも非常に簡単です。

ステップ 1:Docker の確認と削除(インストール済みの場合)

Docker がシステムで実行されている場合は、競合を避けてリソースを解放するために削除してください。Docker をインストールしたことがない場合は、このステップをスキップできます。

# Docker デーモンを停止します
sudo systemctl stop docker

# システム起動時に Docker が起動しないように無効にします
sudo systemctl disable docker

# Docker パッケージを削除します
# (Docker のインストール方法によってパッケージが異なる場合があります)
sudo dnf remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 残った設定、イメージ、ボリュームを削除します (オプション、実行前に注意してください)
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker

ステップ 2:Podman とサポートツールのインストール

これが最も重要な部分です。Podman は Fedora の公式リポジトリで利用できるため、インストールは非常に簡単です。

# Podman をインストールします
sudo dnf install podman

# インストールされた Podman のバージョンを確認します
podman --version

# 'docker' シンボリックリンクを 'podman' にポイントさせるために podman-docker をインストールします
# これにより、古いスクリプトやコマンドの入力習慣を変更する必要がなくなります
sudo dnf install podman-docker

# 'docker' コマンドが Podman で動作することを確認します
docker --version

# (オプション) Docker Compose を使用している場合は、podman-compose をインストールします
# これは Docker Compose の動作を模倣しようとします
sudo dnf install podman-compose

ステップ 3:ルートレスコンテナの設定(重要)

Podman のセキュリティ上の利点を最大限に活用するには、ルートレスコンテナが正しく動作することを確認する必要があります。Podman は、ユーザーがコンテナを実行するためにどの仮想 UID/GID 範囲を使用できるかを知る必要があります。

Fedora は通常、各ユーザーに対して /etc/subuid および /etc/subgid を事前設定しています。これを確認できます。

grep $(whoami) /etc/subuid /etc/subgid

出力は次のようになります。

/etc/subuid:yourusername:100000:65536
/etc/subgid:yourusername:100000:65536

存在しない場合は、手動で追加するか、Podman のインストールを確認してください。

ルートレスコンテナがログアウト後も実行され続けるようにするには、ユーザーの linger 機能を有効にする必要があります。この機能により、アクティブなセッションがなくてもユーザーのプロセスがバックグラウンドで実行され続けます。

loginctl enable-linger $(whoami)

# linger のステータスを確認できます
loginctl show-user $(whoami) | grep Linger
# 出力は次のようになります: Linger=yes

最後に、Podman 環境を初期化または確認します。

# Podman のユーザーレベルストレージを初期化します (初めて実行する場合)
podman system migrate

# Podman 環境情報を確認します (ルートレスのステータスを含む)
podman info --debug

ステップ 4:Docker コマンドを Podman に移行する

これが最も簡単な部分です!podman-docker パッケージのおかげで、ほとんどのコマンドはすぐに機能します。

  • コンテナの実行:

    # 代わりに:
    docker run -p 8080:80 --name mynginx -d nginx
    
    # これを使用します:
    podman run -p 8080:80 --name mynginx -d nginx
    

    podman-docker をインストールしている場合でも、docker run ... と入力でき、Podman に自動的にリダイレクトされます。個人的には、より明確にするために podman と入力する方が好きです。

  • イメージのビルド:

    # 代わりに:
    docker build -t myapp:latest .
    
    # これを使用します:
    podman build -t myapp:latest .
    
  • イメージ、コンテナ、ネットワーク、ボリュームの管理:imagespsnetworkvolume などの同様のコマンドも同様に機能します。

    podman ps
    podman images
    podman network ls
    
  • Docker Compose (Podman Compose に置き換え):

    docker-compose.yaml ファイルがある場合、podman-compose(ステップ 2 でインストール済みの場合)を使用できます。

    # 代わりに:
    docker-compose up -d
    
    # これを使用します:
    podman-compose up -d
    

    注:podman-compose は Podman の公式ツールではなく、Docker Compose のすべての複雑な機能と 100% 互換性があるとは限りません。私にとっては、ほとんどの基本的なケースでうまく機能します。

Podman を使用する際の重要な注意事項

ルートレスコンテナでのボリュームと権限

ルートレスコンテナを実行すると、コンテナにマウントするボリュームはホスト上の現在のユーザーの権限を使用します。これは、コンテナがユーザーに書き込み権限がないディレクトリに勝手に書き込むことができないことを意味します。これは便利なセキュリティ層ですが、エラーが発生した場合はホスト上の権限を調整する必要がある場合があります。

Podman とネットワーク

Podman はルートレスコンテナのネットワークを、デフォルトの Docker とは少し異なる方法で管理します。同様の機能を提供しますが、プロジェクトが複雑なネットワーク要件を持つ場合は、podman network createpodman network connect を使用してカスタムネットワークを作成および管理する方法についてさらに学ぶ必要があるかもしれません。

Systemd との統合:コンテナをサービスとして実行する

Fedora での Podman の強みの 1 つは、systemd との深い統合です。systemd のユニットファイルを簡単に作成して、コンテナを通常のシステムサービスとして管理できます。これは、継続的に実行する必要があるアプリケーションや、システム起動時に起動する必要があるアプリケーションにとって非常に便利です。

# 例のコンテナを実行します
podman run --name myapp-container -d nginx

# 実行中のコンテナから systemd ユニットファイルを生成します
podman generate systemd --name myapp-container --new --files
# このコマンドは 2 つのファイルを生成します: myapp-container.service と myapp-container-init.service
# これらは通常 ~/.config/systemd/user/ ディレクトリに作成されます

# サービスを有効にして開始します (ユーザー権限で実行されます)
systemctl --user enable myapp-container.service
systemctl --user start myapp-container.service

# ステータスを確認します
systemctl --user status myapp-container.service

この方法で、コンテナは systemd によって管理され、マシンの起動時またはユーザーのログイン時(linger が有効になっている場合)に自動的に起動します。

Docker Compose を Kubernetes YAML に置き換える

podman-compose がニーズを満たさない場合、または Kubernetes に慣れてきたい場合は、Podman には非常に強力な機能があります。それは、Pod とそのコンテナから Kubernetes YAML ファイルを生成することです。

# 複数のコンテナを含む pod を作成します (例: web + db)
podman pod create --name mypod -p 80:80
podman run -d --pod mypod --name myweb nginx
podman run -d --pod mypod --name mydb postgres

# この pod から Kubernetes YAML ファイルを生成します
podman generate kube mypod > myapp.yaml

# その後、'podman play kube' を使用して YAML ファイルから再実行できます
podman play kube myapp.yaml

これは、ローカル開発環境から Kubernetes へ、一度に多くの新しいツールを学ぶことなく移行するための優れた橋渡しとなります。

結論

Fedora で Docker から Podman へ移行することは、単にツールを変更するだけではありません。特にルートレスコンテナアーキテクチャとシステムとの深い統合により、セキュリティと作業効率のアップグレードでもあります。

いくつかの小さな調整が必要になるかもしれませんが、高いコマンド互換性と Podman が Fedora で提供する利点は非常に価値があります。一度慣れてしまえば、Podman は単なる価値のある代替品ではなく、セキュリティとシステム統合における進歩であることに気づくでしょう。Fedora マシンで Podman を試してみてください。その違いがわかるはずです。

Share: