LinuxでPodmanを使用してdocker-composeを使う方法
Podmanは、Red Hatによって作成された、Dockerの無料でオープンソースの代替品です。Dockerはおそらくより広く普及しており、「コンテナ」という言葉の同義語になってしまうほどですが、技術的な観点から見ると、Podmanの方が優れています。Podmanは、最初からデーモンレスで動作するように設計されており、root権限なしで実行でき、Linux環境により良く統合されています。多くの人々がDockerからPodmanに移行するのを妨げた要因の一つは、docker-composeの完全なPodman相当版が不足していたことでした。しかし、PodmanとDockerの間に互換性のレイヤーを作成することで、実際にdocker-composeをPodmanネイティブツールのように使用することが可能になりました。
このチュートリアルでは、最も使われているLinuxディストリビューションにdocker-composeをインストールする方法と、Dockerの代わりにPodmanを使う方法を見ていきます。
このチュートリアルでは、あなたは学びます:
- 最も使用されているLinuxディストリビューションにpodman、podman-docker、およびdocker-composeをインストールする方法
- Podmanをdocker-composeと連携させる方法
- Podmanでdocker-composeを使用する方法
パッケージのインストール
Podmanでdocker-composeを使用するために最初に行うべきことは、podman-dockerパッケージをインストールすることです。このパッケージはDockerとPodmanの間に互換性のあるレイヤーを提供し、Docker CLIをエミュレートしますが、内部ではPodmanコマンドを実行します。
FedoraおよびRed Hatファミリーの他のディストリビューションにインストールを実行するには、次のコマンドを実行できます:
sudo dnf install podman podman-docker代わりに、DebianおよびDebian系ディストリビューションにパッケージをインストールするには、次のコマンドを実行できます:
sudo apt install podman podman-dockerdocker-composeをインストールする
次に、docker-composeをインストールする必要があります。現在、2つのバージョンのdocker-composeが存在します。最初の「v1」は、オリジナルのPythonで書かれた非推奨バージョンで、セキュリティ修正のみが行われます。2番目の「v2」はGoで書かれており、積極的に開発されており、Docker公式リポジトリにDockerプラグインとしてパッケージされています。
docker-compose v1のインストール
ほとんどのLinuxディストリビューションには、このツールのPythonバージョンを提供する「docker-compose」パッケージが含まれています。Fedoraにインストールするには、次のように実行します:
sudo dnf install docker-composeRHELおよびそのクローンでは、docker-composeパッケージは標準で利用できず、EPELリポジトリからもインストールすることができません(少なくとも執筆時点では)。これらのディストリビューションでは、pipというPythonパッケージマネージャーを使用して、docker-compose v1をPythonパッケージとしてインストールする必要があります。
私たちがpipをルートとして実行したくないため、パッケージを専用の仮想環境にインストールし、標準の権限のないユーザーとしてインストールします。その後、実行可能ファイルへのシンボリックリンクを作成します(あるいはpipxのようなツールを使用することもできます)。以下の例では、~/.local/binディレクトリが存在し、PATHに含まれていると仮定します。
python3 -m venv virtualenv
virtualenv/bin/pip install docker-compose
ln -s "${PWD}/virtualenv/bin/docker-compose" ~/.local/bin/docker-composeDebianおよびDebianベースのディストリビューションにdocker-compose v1をインストールするには、次のように実行できます。
sudo apt install docker-composedocker-compose v2のインストール
私たちがすでに述べたように、公式にサポートされ、積極的に開発されているdocker-composeのバージョンはv2です。これをインストールするための普遍的なクロスディストリビューションの方法は、プロジェクトのGitHubリポジトリから私たちのシステムアーキテクチャに対応する事前コンパイルされたバイナリを直接ダウンロードすることです。以下の例では、最新リリース(執筆時点での2.27)のLinux x86_64バージョンをダウンロードします。
curl -LO https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64バイナリをダウンロードしたら、それを実行可能にし、次にPATH内のディレクトリに移動します。ユーザー専用にインストールする場合は、~/.local/binに移動します。システム全体にインストールする場合は、代わりに/usr/local/binに移動します。
chmod +x docker-compose-linux-x86_64
sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-composeDocker Compose v2をインストールする代替方法は、公式のDockerリポジトリからです。まず、公式ガイドに従ってリポジトリを配布に追加し、次に「docker-compose-plugin」パッケージをインストールします:
sudo dnf install docker-compose-plugin
上記のコマンドを実行すると、docker-composeがスタンドアロンのバイナリとしてではなく、Dockerプラグインとしてインストールされます。そのように使用するには、PATH内のディレクトリにシンボリックリンクを作成するだけで十分です:
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-composePodmanソケットを有効にして起動する
PodmanとDockerの主な違いの一つは、その設計にあります。Dockerはクライアント-サーバーアーキテクチャを使用しており、Dockerデーモンはバックグラウンドで実行され、通常はルート特権で動作します(ただし、最近のDockerのバージョンでは、ルートレスのユーザーレベルのバージョンのデーモンを実行することもサポートされています)。一方、Podmanは「フォーク-エグゼキューション」アーキテクチャを使用しており(各コンテナはPodmanの子プロセスとして実行されます)、docker-composeはDockerと連携することを目的としているため、dockerデーモンが実行されていることを期待します。この理由から、Podmanは「podman.socket」というsystemdユニットを提供しています。Podmanでdocker-composeを使用するためには、これを起動して有効にする必要があります。
sudo systemctl enable --now podman.socketrootless Podman インスタンスで docker-compose を使用するには、ソケットのユーザーレベルのインスタンスを有効にして起動する必要があります。
systemctl --user enable --now podman.socketこの後者のケースでは、DOCKER_HOST環境変数を定義してエクスポートする必要があります。これを行う伝統的な方法は、使用しているシェルに応じて、~/.bash_profileまたは~/.profileに以下の行を追加することです:
export DOCKER_HOST=unix:///run/user/1000/docker.sock現在のシェルインスタンスで変更を即座に有効にするために、次回のログインを待つことなく、ファイルを直接ソースすることができます:
source ~/.bash_profileSystemdソケット対サービス
前のステップで有効化したソケットユニット(/usr/lib/systemd/system/podman.socket)の横には、Podmanパッケージにシステムdの「サービス」ユニット(/usr/lib/systemd/system/podman.service)があります。このサービスは実際に何を達成するものなのか、またなぜ私たちは直接サービスを使用するのではなくソケットユニットを使用するのかということです。
Podman サービスが起動する際に Systemd が実行するコマンドを見るには、ユニット自体を確認するだけで十分です。この場合、私たちが興味を持っているのは、「Service」セクションの「ExecStart」オプションの値です:
ExecStart=/usr/bin/podman $LOGGING system serviceサービスが開始されると、Systemdがpodman system serviceコマンドを実行することがわかります。このコマンドが行うことは、PodmanのAPIコールに応答するリスニングサービスを作成することです。このように、Podman自体は動作するためにデーモンを必要としないものの、PodmanはDockerインターフェースを「模倣」することができます。
なぜ私たちはサービスを直接ではなく、ソケットユニットを有効にし、開始するのでしょうか?そうすることで、Systemdの機能であるソケットアクティベートサービスを利用しています。ソケットは接続を待ち受け、リクエストに応じてサービスを起動し、リソースを最も効率的な方法で活用します。
docker-composeを使用して
すべてが整ったら、docker-composeを使用して、裏でDockerを実行しているかのように利用できます。以下は、composeファイルの基本的な例です。これは、MariaDBサーバー用のコンテナと、phpMyAdmin用のコンテナを生成します。
version: '3.7'
services:
mariadb:
image: docker.io/mariadb
volumes:
- db:/var/lib/mysql
environment:
TZ: "Europe/Rome"
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_USER: testuser
MYSQL_PASSWORD: testpassword
MYSQL_DATABASE: testdb
phpmyadmin:
image: docker.io/phpmyadmin
environment:
PMA_HOST: mariadb
ports:
- "80:80"
depends_on:
- mariadb
volumes:
db:
コンテナ、ボリューム、およびスタック用の専用ネットワークを作成するために、以下を実行します。
sudo docker-compose up結論
このチュートリアルでは、Podmanをdocker-composeと連携させる方法を学びました。Docker-composeはDocker用に設計されており、Podmanとは異なり、クライアント-サーバーアーキテクチャを使用します。Podmanソケットを有効にし、podman-dockerパッケージをインストールすることで、基本的に互換性のレイヤーを作成し、Podmanでdocker-composeを透過的に使用できるようにします。
