Ubuntuで始めるPodman活用術:Dockerfileから学ぶ安全・柔軟なコンテナ構築ガイド

目次

1. はじめに

コンテナ技術の進化と注目の背景

近年、アプリケーション開発や運用の現場において、コンテナ技術の重要性が急速に高まっています。特に、開発環境と本番環境を一致させることで、動作の再現性を確保できるというメリットが、多くのエンジニアに支持されています。

その中でも代表的な存在がDockerですが、近年ではそれに代わる選択肢としてPodman(ポッドマン)が注目を集めています。PodmanはDockerとほぼ同じCLI(コマンドラインインターフェース)を提供しつつ、デーモンレスで軽量root権限を必要としない(rootless)という特長を持っています。

なぜ「Podman + Dockerfile + Ubuntu」なのか

この記事では、「Podman」「Dockerfile」「Ubuntu」という3つの要素を組み合わせて、Linux環境でのモダンなコンテナ運用を解説していきます。

  • Ubuntuは、初心者から上級者まで幅広く使われる人気のあるLinuxディストリビューションであり、
  • Dockerfileは、コンテナイメージを構築するための設計図とも言える存在、
  • そしてPodmanは、それらをより柔軟に、セキュアに運用するための次世代ツールです。

特に、セキュリティ意識の高まりと共に、PodmanをUbuntu上で使用してDockerfileを活用するという構成は、個人開発者や企業の開発現場でも採用が進んでいます。

本記事の目的と対象読者

この記事の目的は、Ubuntu環境でPodmanを使ってDockerfileをビルドし、実用的なコンテナを作成する手順を丁寧に解説することです。

読者としては、以下のような方を想定しています:

  • Dockerの経験はあるが、Podmanに興味がある方
  • セキュアな環境でコンテナを扱いたいUbuntuユーザー
  • コンテナ技術を業務に取り入れたいエンジニア
  • Dockerfileの記述とPodmanでのビルドに挑戦してみたい初心者

記事では、基本的な使い方からトラブル回避のTips、さらにはDockerとの違いや移行方法までをカバーします。

2. Podmanとは?

Podmanの基本概要

Podman(Pod Manager)は、Red Hatを中心とするコミュニティによって開発された、次世代のコンテナ管理ツールです。Dockerと同様に、OCI(Open Container Initiative)準拠のコンテナをビルド・実行・管理することができますが、その設計思想と構造には大きな違いがあります。

最大の特長は、Podmanはデーモンを必要としないという点です。これにより、軽量かつセキュアな運用が可能です。また、Podmanはrootlessモードにも対応しており、一般ユーザーが権限昇格なしでコンテナ操作できるのも大きな特長です。CLIの互換性は高く、基本的なコマンドはほぼ同じです。

Podmanの主な特長

以下に、Podmanの代表的な特長をいくつか挙げます。

デーモンレス構造

Podmanは、コンテナを管理するためのデーモン(常駐プロセス)を持ちません。これにより、バックグラウンドで不要なプロセスを走らせることなく、リソース効率の良い環境を実現します。

rootless(非特権ユーザー)対応

Podmanは、非管理者権限の一般ユーザーでもコンテナを起動・操作できます。これにより、マルチユーザー環境やサーバー環境での安全な運用が可能となり、セキュリティ上のリスクを大幅に軽減します。

Docker互換のCLI

Podmanは、Dockerとほぼ同じコマンド体系を採用しています。たとえば、以下のようなDockerコマンドは、Podmanでも同様に機能します。

podman build -t myimage .
podman run -it myimage bash

そのため、Dockerの経験がある方は違和感なく移行できます。

pod(Pod)機能

Kubernetesにおける「Pod」概念を取り入れており、複数のコンテナを1つの論理単位としてまとめて管理することができます。これにより、Kubernetesとの親和性が高く、ローカル開発環境からクラウド環境へのスムーズな移行も可能になります。

Ubuntuとの相性

Podmanは、FedoraやRHEL系ディストリビューションで積極的に採用されていますが、Ubuntuでも安定して動作します。公式リポジトリからインストールが可能であり、設定も比較的簡単です。特にUbuntu 20.04 LTS以降では、パッケージの整備も進んでおり、導入の敷居は低くなっています。

3. UbuntuへのPodmanのインストール方法

はじめに:インストール前の確認事項

UbuntuにPodmanをインストールする際には、まず使用しているUbuntuのバージョンを確認しましょう。PodmanはUbuntu 20.04 LTS以降での動作が推奨されています。古いバージョンでは、必要なパッケージが公式リポジトリに含まれていない場合があります。

以下のコマンドで、Ubuntuのバージョンを確認できます。

lsb_release -a

また、Podmanのインストールにはsudo権限が必要です。rootlessモードで利用する場合も、インストール時点では管理者権限が求められるため、事前に用意しておきましょう。

Podmanのインストール手順(Ubuntu公式リポジトリ)

Ubuntu 20.04 または 22.04 などの最新バージョンでは、PodmanはAPTを使って簡単にインストールできます。

sudo apt update
sudo apt install -y podman

インストールが完了したら、以下のコマンドでバージョン情報を確認し、正常にインストールされたことを確認しましょう。

podman --version

最新版を使用したい場合の手順(公式PPAの追加)

Ubuntu標準のリポジトリに含まれるPodmanは、若干古いバージョンであることが多いため、最新機能を利用したい場合は公式PPA(パーソナルパッケージアーカイブ)を利用する方法もあります。

. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt update
sudo apt install -y podman

この方法では、Red HatやFedora系と同等の最新版Podmanが利用可能です。

Podmanの基本動作テスト

インストール後、簡単な動作確認を行ってみましょう。

podman info

このコマンドでは、Podmanのバージョンや設定内容、サポートされている機能(rootlessモードなど)を確認できます。

さらに、以下のコマンドで公式のAlpine Linuxコンテナを取得し、実行できるかをテストします。

podman run --rm -it alpine sh

正常にシェルが起動すれば、Podmanの基本的な動作に問題がないことを確認できます。

4. Dockerfileの基本とPodmanでの使用

Dockerfileとは何か?

Dockerfileは、コンテナイメージを構築するための設計図です。テキストファイルの形式で、どのベースイメージを使用するか、どのパッケージをインストールするか、どんなファイルをコピーするかなどを、命令として順に記述します。

このファイルを基に、PodmanやDockerのようなコンテナツールは、一貫した環境を自動的に構築することができます。

代表的な命令の例は以下の通りです:

FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]

このように、ベースとなるUbuntuイメージにパッケージをインストールし、スクリプトを配置、最後に実行内容を定義するという流れになります。

PodmanでDockerfileを使う方法

Podmanでは、Dockerfileを用いてコンテナイメージをビルドすることが可能です。基本的な使い方はDockerとほぼ同じです。

1. ディレクトリの準備

以下のような構成でファイルを用意します。

project/
├── Dockerfile
└── app.sh

app.sh は以下のような簡単なスクリプトとします:

#!/bin/bash
echo "Hello from Podman container!"

ファイルには実行権限を付与しておきます:

chmod +x app.sh

2. Podmanでビルド

カレントディレクトリにDockerfileがある状態で、以下のようにビルドします:

podman build -t mypodmanapp .

このコマンドにより、mypodmanapp という名前のコンテナイメージが作成されます。

3. ビルド結果の確認

作成されたイメージは次のように確認できます:

podman images

4. コンテナの起動

ビルドしたイメージを使って、コンテナを起動します:

podman run --rm mypodmanapp

正常に設定されていれば、スクリプトの出力として Hello from Podman container! が表示されます。

Containerfileとの違い

Podmanでは、Dockerfileと同じ構文を持つファイルをContainerfileと呼ぶことがあります。これは、「Dockerに依存しない中立的な名称を使おう」という思想に基づいた呼び方です。

ただし、実際の動作や書き方に違いはありません。ファイル名を Dockerfile にしても Containerfile にしても、どちらもPodmanで問題なく読み込むことができます。

podman build -f Containerfile -t myimage .

このように -f オプションでファイル名を指定すれば、任意の名称でも対応可能です。

5. 実践:Ubuntuベースのコンテナを作成する

UbuntuをベースにしたDockerfileの作成

ここからは、実際にUbuntuをベースにしたDockerfileを作成し、Podmanでコンテナイメージをビルド・実行する手順を、ステップバイステップでご紹介します。

まずは、以下のようなシンプルなDockerfileを用意します:

FROM ubuntu:22.04

RUN apt update &&     apt install -y curl &&     apt clean

COPY hello.sh /usr/local/bin/hello.sh
RUN chmod +x /usr/local/bin/hello.sh

CMD ["/usr/local/bin/hello.sh"]

このDockerfileは、以下のことを行っています:

  • Ubuntu 22.04の公式イメージを使用
  • curl パッケージをインストール
  • ホスト側の hello.sh をコンテナ内にコピー
  • hello.sh をデフォルトの実行スクリプトに指定

次に、hello.sh というシンプルなシェルスクリプトも作成します:

#!/bin/bash
echo "こんにちは、Podmanコンテナからの出力です!"

このスクリプトには実行権限を与えてください:

chmod +x hello.sh

Podmanでのイメージビルド手順

ファイルが準備できたら、次のコマンドでビルドを行います。

podman build -t ubuntu-hello .

ここで -t ubuntu-hello は、作成されるイメージにタグ名を付けるオプションです。最後の . は、Dockerfileが存在するディレクトリを指定しています。

ビルドが成功すると、ローカルに新しいイメージが保存されます。

podman images

このコマンドでイメージ一覧を確認できます。

ビルドしたイメージの実行と確認

作成したイメージからコンテナを実行するには、以下のコマンドを使用します:

podman run --rm ubuntu-hello

出力例:

こんにちは、Podmanコンテナからの出力です!

--rm オプションを付けることで、コンテナ実行後に自動的に削除され、テスト用途には最適です。

補足:インタラクティブなコンテナ起動

コンテナ内部で操作を行いたい場合は、以下のように -it オプションを付けてBashを起動することも可能です。

podman run -it ubuntu-hello bash

このようにすれば、Ubuntuベースの軽量な開発環境としても活用できます。

6. Podmanの便利な機能とTips

Podmanの強みは「柔軟性とセキュリティ」

Podmanは、Dockerと互換性を保ちつつも、より柔軟で安全な運用を可能にする機能を備えています。ここでは、実用性の高い便利な機能や、日々の運用で役立つTipsをご紹介します。

rootlessモードでセキュアに運用

Podman最大の特長の一つが「rootlessモード」です。これは、管理者権限を持たない一般ユーザーでもコンテナの起動・停止・管理が可能になる機能です。

以下のように、sudoなしでPodmanを使用できます:

podman run -it ubuntu bash

この動作はユーザーのホームディレクトリ以下に限定されるため、システムへの影響を最小限に抑えることが可能です。特に共有サーバーや開発環境では、rootlessは非常に有用です。

systemd連携で自動起動を実現

Podmanは、systemdとのネイティブな連携が可能です。これにより、コンテナをLinuxサービスとして起動時に自動実行することができます。

たとえば、次のようにしてPodmanのコンテナからsystemdサービスユニットを生成できます:

podman generate systemd --name mycontainer --files --restart-policy=always

このコマンドにより、~/.config/systemd/user/ 配下にユニットファイルが生成されます。生成後は、次のように有効化・起動できます:

systemctl --user daemon-reexec
systemctl --user enable --now container-mycontainer.service

これにより、サーバー再起動時にも自動的にコンテナが立ち上がる構成を簡単に実現できます。

podman-composeでマルチコンテナ管理

Podmanは単一コンテナの運用に加え、複数のコンテナをまとめて管理できる仕組みも備えています。Docker Composeと同様の操作が可能な「podman-compose」を使えば、複雑な構成でも簡単に管理できます。

インストールは以下のようにPythonのpipを使用します:

pip install podman-compose

通常のdocker-compose.ymlファイルと互換性が高いため、既存のプロジェクトを流用できるのもメリットです。

起動も簡単で、次のように実行するだけです:

podman-compose up -d

Podmanを使用しても、開発環境を一瞬で再現できる仕組みをそのまま活用できます。

その他の便利コマンド・Tips

イメージの掃除(不要なイメージ・コンテナの削除)

podman system prune -a

不要になった一時ファイルや未使用のイメージを一括で削除するコマンドです。ストレージの整理に有効です。

コマンド補完の設定(bash/zsh)

Podmanのコマンド補完スクリプトは以下で取得可能:

sudo apt install podman-docker

これにより、podmanコマンドでもdockerのように補完が効くようになり、作業効率が向上します。

7. DockerからPodmanへの移行ガイド

Podmanへの移行が注目される理由

Dockerは長らくコンテナ技術の代名詞として使われてきましたが、近年ではより軽量でセキュアな選択肢としてPodmanに移行する動きが見られます。特に、Red Hat Enterprise Linux(RHEL)やFedoraではDockerのサポートが縮小され、Podmanがデフォルトとなっていることから、移行を検討する現場も増えてきました。

この章では、DockerからPodmanへスムーズに移行するための具体的なステップと注意点を解説します。

DockerとPodmanのコマンド互換性

PodmanはDockerと高いコマンド互換性を持っているため、基本的には以下のようなコマンドをそのまま置き換えることが可能です。

DockerPodman
docker build -t myapp .podman build -t myapp .
docker run -it myapppodman run -it myapp
docker imagespodman images
docker pspodman ps

このように、CLIの操作感を変えずに乗り換えることができる点が、Podmanの大きな魅力です。

podman-dockerで完全互換にする方法

既存のスクリプトやCI/CDパイプラインなどで「docker」コマンドを前提にしている場合には、podman-docker パッケージをインストールすることで、PodmanをDockerの代替として動作させることが可能です。

sudo apt install podman-docker

このパッケージを導入すると、以下のように docker コマンドが内部的に podman を呼び出すようになります:

which docker
# → /usr/bin/docker → podman のシンボリックリンク

これにより、既存のDocker用スクリプトを修正なしでPodmanで動作させることができます。

docker-composeの代替:podman-compose

Docker Composeで複数コンテナを定義しているプロジェクトでは、podman-compose を導入することで同様の操作が可能です。

互換性は高いものの、Composeファイルの一部機能や挙動には微妙な違いがあるため、以下の点に注意してください:

  • depends_on などの一部Composeオプションには未対応または挙動差あり
  • イベントログやヘルスチェック周りの挙動が異なる場合がある

複雑な構成でなければ、基本的なWebサーバー+DBといった構成は問題なく移行可能です。

イメージ・ボリュームの移行

Dockerで利用していたイメージをPodmanに移行する際、ローカルのDockerイメージはそのままではPodmanから参照できません。以下のようにして、再取得またはエクスポート・インポートを行う必要があります。

オプション1:Podman側で再pull

podman pull ubuntu:22.04

オプション2:Dockerからエクスポート → Podmanでインポート

# Docker側でエクスポート
docker save myimage > myimage.tar

# Podman側でインポート
podman load < myimage.tar

これにより、Dockerで作成したイメージをPodmanでも利用可能にできます。

その他の注意点

  • rootless対応の違い:Dockerは基本的にrootが前提、Podmanはrootlessでも標準運用が可能
  • デーモン構造の違い:Podmanはデーモンレスなため、バックグラウンドプロセスの管理方法が異なる
  • ログやデータの格納場所も異なるため、移行時は設定ファイルの確認が必要です

8. よくある質問(FAQ)

Q1. PodmanとDockerの主な違いは何ですか?

A1. 最大の違いは、Podmanは「デーモンレス(常駐プロセス不要)」で動作する点です。これにより、より軽量かつセキュアな運用が可能です。また、Podmanはrootlessモードにも対応しており、一般ユーザーが権限昇格なしでコンテナ操作できるのも大きな特長です。CLIの互換性は高く、基本的なコマンドはほぼ同じです。

Q2. DockerfileとContainerfileはどう違うのですか?

A2. 機能的な違いは一切ありません。どちらもコンテナのビルド手順を記述するためのファイルであり、構文も全く同じです。
ただし、PodmanやOCI準拠のプロジェクトでは「Docker依存でない名称」としてContainerfileが好まれる傾向にあります。名前の違いに過ぎないため、実運用ではDockerfileをそのまま使って問題ありません。

Q3. PodmanでDocker Composeは使えますか?

A3. 直接のサポートはありませんが、代替ツールとしてpodman-composeを使用できます。これはPython製のスクリプトで、docker-compose.yml形式のファイルをPodman環境で解釈・実行できます。

ただし、一部のオプション(depends_onなど)に制限があるため、複雑な構成を扱う場合は事前に検証が必要です。

Q4. PodmanはUbuntuでも安定して動作しますか?

A4. はい、Ubuntu 20.04 LTS以降であれば安定して動作します。Ubuntu公式リポジトリにもPodmanが収録されており、aptを使って簡単にインストールできます。より新しいバージョンを使いたい場合は、PPA(パーソナルパッケージアーカイブ)を利用する方法もあります。

Q5. rootlessモードでコンテナにアクセス制限はありますか?

A5. rootlessモードでは、一部の特権操作やポート番号(1024未満)でのバインドが制限されます。ただし、ポートフォワーディングを利用することでこれらの制約を回避できます。多くのユースケースでは、rootlessでも十分に実用的です。

Q6. PodmanでpullできるイメージはDocker Hubと同じですか?

A6. はい、PodmanもデフォルトでDocker Hubにアクセスしてイメージを取得できます。ただし、環境によってはdocker.io/library/ubuntuのように、明示的にレジストリと名前空間を指定する必要がある場合があります。

podman pull docker.io/library/ubuntu

Podmanは他にも Quay.io や GitHub Container Registry など、複数のリモートレジストリをサポートしています。

Q7. Podmanは本番運用にも使えますか?

A7. はい、PodmanはKubernetes互換のPod概念やsystemd連携など、本番運用に必要な要素を多数備えています。特にセキュリティ要件が高い環境では、DockerよりPodmanの方が適している場面もあります。

Red Hat Enterprise LinuxやFedoraではPodmanがデフォルトになっており、大規模な実績もあります。

参考リンク

Ubuntu 22.04 インストールと設定…