Linux 上の Podman で docker-compose を使用する方法
Podman は、Red Hat によって作成された、Docker に代わる無料のオープンソースです。 Docker はおそらく「コンテナ」の同義語になるまで広く普及していますが、技術的な観点から見ると Podman の方が優れています。Podman は最初からデーモンレスになるように設計されており、デーモンなしで実行できます。 root 権限が必要なくなり、Linux 環境によりよく統合されます。多くの人が Docker から Podman に移行することを潜在的に妨げていたものの 1 つは、docker-compose に相当する本格的な Podman が存在しないことでした。 Podman と Docker の間に互換性レイヤーを作成することで、実際に docker-compose を Podman ネイティブ ツールであるかのように使用できるようになりました。
このチュートリアルでは、最もよく使用されている Linux ディストリビューションに docker-compose をインストールする方法と、Docker の代わりに Podman で docker-compose を使用する方法を説明します。
このチュートリアルでは次のことを学びます:
- 最も使用されている 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-docker
docker-compose のインストール
次に、docker-compose をインストールする必要があります。 docker-compose には現在 2 つのバージョンが存在します。最初のバージョン「v1 」は、Python で書かれたオリジナルの現在は非推奨のバージョンで、セキュリティ修正のみが適用されます。 2 つ目の「v2」は Go で書かれており、積極的に開発されており、Docker 公式リポジトリに Docker プラグインとしてパッケージ化されています。
docker-compose v1 のインストール
ほとんどの Linux ディストリビューションには、ツールの Python バージョンを提供する「docker-compose」パッケージが含まれています。 Fedora にインストールするには、次のコマンドを実行します。
$ sudo dnf install docker-compose
RHEL およびクローンでは、docker-compose パッケージはそのままでは利用できず、(少なくとも執筆時点では) EPEL リポジトリからインストールすることもできません。これらのディストリビューションでは、python パッケージ マネージャーである pip を使用して、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-compose
Debian および Debian ベースのディストリビューションに docker-compose v1 をインストールするには、次のコマンドを実行できます。
$ sudo apt install docker-compose
docker-compose v2 のインストール
すでに述べたように、公式にサポートされ、積極的に開発されている docker-compose のバージョンは v2 です。これをインストールするユニバーサルでクロスディストリビューションの方法は、システム アーキテクチャ用にコンパイル済みのバイナリをプロジェクトの GitHub リポジトリから直接ダウンロードすることです。以下の例では、最新リリースの Linux x86_64 バージョン (執筆時点では 2.27) をダウンロードします。
$ 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-compose
docker-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-compose
Podman ソケットの有効化と開始
Podman と Docker の主な違いの 1 つは、その設計です。 Docker はクライアント/サーバー アーキテクチャを使用します。Docker デーモンは通常 root 権限でバックグラウンドで実行されます (ただし、最近の Docker バージョンでは rootless のユーザーレベル バージョンのデーモンの実行がサポートされています)。一方、Podman はいわゆる「fork-exec」を使用します。 」アーキテクチャ (各コンテナは Podman 子プロセスとして実行されます)。 docker-compose は Docker で動作することを目的としているため、docker デーモンが実行されていることが期待されます。このため、Podman は「podman.socket 」systemd ユニットを提供します。 Podman で docker-compose を使用するには、それを起動して有効にする必要があります。
$ sudo systemctl enable --now podman.socket
ルートレス 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_profile
Systemd ソケットとサービスの比較
前の手順でアクティブ化したソケット ユニット (/usr/lib/systemd/system/podman.socket
) のほかに、Podman パッケージには systemd "service" ユニット (/usr/) が付属しています。 lib/systemd/system/podman.service
);このサービスは実際に何を実現するのでしょうか?また、なぜサービスを直接使用せずにソケット ユニットを使用するのでしょうか?
Systemd が Podman サービスの開始時に実行するコマンドを確認するには、ユニット自体を確認するだけで十分です。この場合に興味があるのは、「Service」セクションの「ExecStart」オプションの値です。
ExecStart=/usr/bin/podman $LOGGING system service
サービスが開始されると、Systemd が podman system service
コマンドを実行することがわかります。このコマンドが行うことは、Podman の API 呼び出しに応答するリスニング サービスを作成することです。このように、Podman 自体が動作するためにデーモンは必要ありませんが、Podman は Docker インターフェースを「模倣」できます。
サービスを直接有効にするのではなく、ソケット ユニットを有効にして開始するのはなぜですか?そうすることで、Systemd の機能であるソケット起動サービスを利用します。ソケットは接続をリッスンし、リクエストに応じてサービスを開始し、最も効率的な方法でリソースを利用します。
docker-compose の使用
すべての準備が整うと、内部で Docker を実行しているかのように 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
結論
このチュートリアルでは、docker-compose で動作するように Podman をセットアップする方法を学びました。 Docker-compose は、Podman とは異なり、クライアント/サーバー アーキテクチャを使用する Docker で動作するように設計されています。 Podman ソケットを有効にして podman-docker パッケージをインストールすることにより、基本的に、Podman で docker-compose を透過的に使用できる互換性レイヤーを作成します。