ウェブサイト検索

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 を透過的に使用できる互換性レイヤーを作成します。

関連記事: