設定 - Podman Compose

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

podman composeコマンドは、docker-composeのような外部のComposeプロバイダの薄いラッパーである。
つまり、podman composeコマンドは、Compose機能を実装する別のツールを実行するが、ComposeプロバイダがローカルのPodmanソケットと透過的に通信できるように環境を設定する。

指定したオプション、コマンド、引数は直接composeプロバイダに渡される。
デフォルトのComposeプロバイダは、docker-composeとpodman-composeである。

両方ともインストールされている場合は、docker-composeが優先される。
なぜなら、docker-composeはCompose仕様のオリジナルの実装であり、サポートされているプラットフォーム (Linux、MacOS、Windows) で広く使用されているからである。

デフォルトの挙動を変更する場合や、選択したプロバイダのカスタムインストールパスが必要な場合は、~/.config/containers/containers.confファイルのcompose_providerフィールドを変更する必要がある。
また、環境変数PODMAN_COMPOSE_PROVIDERを設定して変更することもできる。


Podman Composeのインストール

パッケージ管理システムからインストール

# RHEL
sudo dnf install podman-compose

# SUSE
sudo zypper install python3-podman-compose


PyPIからインストール

# Python3のルートディレクトリにインストールする場合
sudo pip3 install podman-compose python-dotenv PyYAML

# Python3のユーザディレクトリにインストールする場合
pip3 install --user podman-compose python-dotenv PyYAML

# GithubからPodman Composeをユーザディレクトリに直接インストールする場合
pip3 install --user https://github.com/containers/podman-compose/archive/devel.tar.gz
pip3 install --user python-dotenv PyYAML


ソースコードからインストール

PyYAML / Python-DotEnvのインストール

まず、PyYAMLおよびPython-DotEnvをインストールする。
パッケージ管理システムからPyYAMLおよびPython-DotEnvをインストールする場合、依存関係が多すぎるため、PyPIからインストールすることを推奨する。

pip3 install --user python-dotenv PyYAML


aardvark-dnsおよびnetavarkのインストール (推奨)
  • パッケージ管理システムからインストールする場合
    1. netavarkおよびaardvark-dnsをパッケージ管理システムからインストールする。
      sudo zypper install netavark aardvark-dns

  • ソースコードからインストール
    1. aardvark-dnsのGithubから、ソースコードをダウンロードする。
    2. ダウンロードしたファイルを解凍する。
      tar xf aardvark-dns-<バージョン>.tar.gz
      cd aardvark-dns-<バージョン>

    3. aardvark-dnsをビルドおよびインストールする。
      make PREFIX=<Podmanのインストールディレクトリ> -j $(nproc)
      make PREFIX=<Podmanのインストールディレクトリ> install

    4. netavarkをインストールする。
      netavarkを手動でインストールする場合は、インストール - Podman#ソースコードからインストール#最新のnetavarkが必要な場合のページを参照すること。


Podman DNSname Pluginのインストール (非推奨)

もし、CNIネットワークを使用する場合は、Podman DNSname Pluginをインストールする。
ただし、2023年以降、Podman DNSname Pluginの開発は止まっているため、netavarkaardvark-dnsを使用することを推奨する。

# Podman DNSname Pluginのインストール
git clone https://github.com/containers/dnsname.git
cd dnsname

make -j $(nproc) PREFIX=<Podmanのインストールディレクトリ>
make install PREFIX=<Podmanのインストールディレクトリ>


Podman Composeのインストール

Podman ComposeのGithubから、ソースコードをダウンロードする。

git clone https://github.com/containers/podman-compose.git -b stable


Podman Composeをビルドおよびインストールする。

export PYTHONPATH="/<Podmanのインストールディレクトリ>/lib/python<Pythonのバージョン>/site-packages:$PYTHONPATH"

python3 ./setup.py build
python3 ./setup.py install --prefix=<Podmanのインストールディレクトリ>


~/.profileファイル等に、環境変数PYTHONPATHを設定する。

 export PYTHONPATH="/<Podmanのインストールディレクトリ>/lib/python<Pythonのバージョン>/site-packages:$PYTHONPATH"



container-compose.ymlファイル

ボリューム

:Zオプションは、SELinuxを有効にしている場合において、ボリュームの共有時にセキュリティコンテキストを設定するためのものである。
SELinuxが無効の場合は、このオプションは無視される。

container-compose.ymlファイルにおいて、volumesセクションを使用してボリュームを定義する場合、
SELinuxを有効にしている場合は、ホストとコンテナ間で適切なセキュリティコンテキストが設定される。

 services:
    <コンテナ名>:
       # ...略
 
       volumes:
          - /<ホスト側のパス>/:/<コンテナ内のパス>/:Z


container-compose.ymlファイルの例

 version: '<Composeファイルのバージョン (docker-compose.ymlのバージョンと同じ)>'  # 例: '3'
 
 networks:
    frontend:
       # bridge, overlay, macvlan等を指定する
       driver: <ネットワークのドライバを指定>
    backend:
       # bridge, overlay, macvlan等を指定する
       driver: <ネットワークのドライバを指定>
       external: <既存の外部ネットワークを指定>
       driver_opts: <ドライバに関連する追加のオプションを指定>
       # IPアドレスの管理に関連する設定を指定する
       ipam:
          # IPアドレス管理のドライバを指定する
          driver: default
          # driverセクションに指定したドライバに関する設定を指定する
          config:
             - subnet: "<サブネットマスク  例: 172.18.0.0/16>"
 
 # networksセクションの説明:
 # 上記の例では、backendネットワークに対しては、ipamセクションでサブネットを指定している。
 # これにより、ネットワーク内のコンテナに対して、手動でIPアドレスを指定することができる。
 
 services:
    <コンテナ名 1 (任意の名前)  例: sample1)>:
       # イメージからコンテナを生成する場合、imageを指定
       image: <イメージ (リポジトリ:タグ) を指定する>
       command:
          <コンテナ起動時に実行するコマンド  例: --default-authentication-plugin=mysql_native_password>>
       # ホストとコンテナでファイルを同期する場合等
       volumes:
          # 例: /tmp/mysql/mysql_data:/var/lib/mysql
          - <ホスト側のパス 1:コンテナのパス 1>
          - <ホスト側のパス 2:コンテナのパス 2>
       # ポート転送 (ポートフォワーディング) を行う場合
       # 例: 63306:3306
       ports:
          - <ホスト側のポート 1:コンテナのポート 1>
          - <ホスト側のポート 2:コンテナのポート 2>
       # 環境変数を指定する場合
       # 例1: MYSQL_ROOT_PASSWORD: password
       # 例2: MYSQL_PORT: 3306
       environment:
          <環境変数名 1: 環境変数値>
          <環境変数名 2: 環境変数値>
       security_opt:
          # AppArmorプロファイルを適用する場合
          # /etc/apparmor.dディレクトリにプロファイルを配置して、apparmor_parserコマンドでプロファイルを読み込む必要がある
          - apparmor=<AppArmorプロファイル名>
 
    <コンテナ名 2 (任意の名前)  例: sample2)>:
       build:
          # Containerfileが存在するディレクトリ
          context: .
          # Containerfileのファイル名
          containerfile: Containerfile
       # または、以下に示す記述方法でもよい
       # Containerfileのファイルパス
       #build: <Containerfileのファイルパス>
       # 任意のコンテナ名を付けることもできる
       container_name: <任意のコンテナ名>
       # ホストとコンテナでファイルを同期する場合等
       volumes:
          - <ホスト側のパス:コンテナのパス>
       # ポート転送 (ポートフォワーディング) を行う場合
       ports:
          - <ホスト側のポート:コンテナのポート>
       # 環境変数を指定する場合
       environment:
          <環境変数名 1: 環境変数値>
          <環境変数名 2: 環境変数値>
          <環境変数名 3: 環境変数値>
       # 依存関係を設定する場合 (他のコンテナと連携する場合)
       # この項目で指定されたコンテナが先に起動する
       depends_on:
          - <依存するコンテナ名  例: sample1>



ファイルの確認

シンタックスの検証

docker-compose.ymlファイルと同様、ファイルの検証はpodman-compose -f <container-compose.ymlファイルのパス> configコマンドを実行する。
container-compose.ymlファイルと同階層のディレクトリで実行する場合、または、環境変数COMPOSE_FILEがcontainer-compose.ymlファイルを指している場合は、
-f <container-compose.ymlファイル>の部分を省略することができる。

podman-compose -f <container-compose.ymlファイルのパス> config
# または
podman-compose config  # コマンドを実行しているカレントディレクトリと同階層のディレクトリにcontainer-compose.ymlファイルが存在する場合


検証エラー : networks

以下に示すようなエラーが出力される場合がある。

RuntimeError: missing networks: <ネットワーク名>


Podman Composeでは、ネットワークの定義をサービスの前に配置する必要がある。
このエラーは、networksセクションがサービスの前に配置されているために発生している。


Composeコマンド

container-compose.ymlファイルを実行するには、podman-compose -dコマンドで実行する必要がある。

Composeコマンドは、container-compose.ymlファイルが存在するディレクトリで行う。
もし、別のディレクトリに存在するcontainer-compose.ymlファイルを指定する場合は、-fオプションを付加する。

podman-compose <コマンド> -f <container-compose.ymlファイルのパス>


サービスイメージの確認

podman-compose images


サービスイメージの作成

サービスイメージのビルドを実行する。
container-compose.ymlファイルにimage:が記述されている場合、そのイメージ名がローカルに存在しなければ、リモートからプルする。
container-compose.ymlファイルにimage:が記述されていない場合、buildに記述されているパスのContainerfileを使用して、コンテナイメージを構築する。

podman-compose build


リモートからサービスイメージを取得

リモートからコンテナイメージを取得する。

podman-compose pull


サービスの確認

podman-compose ps


サービスの作成

構築されたサービスイメージからサービスを作成する。
また、作成直後のサービスは停止している。

podman-compose create


サービスの実行

サービスを作成して起動する。
-dオプションを付加することにより、バックグラウンドで実行することができる。
また、--buildオプションを付加することにより、起動前にイメージを構築することもできる。

podman-compose up

# バックグラウンドで実行する場合
podman-compose up -d

# サービスイメージを構築してサービスを実行する場合
podman-compose up -d --build


サービスの起動

停止中のサービスを起動する。

podman-compose start


サービス再起動

サービスを再起動する。

podman-compose restart


サービスの停止

起動中のサービスを停止する。

podman-compose stop


サービスの削除

container-compose.ymlファイルに記述されているサービスからコンテナを停止して、そのコンテナとネットワークを削除する。
--rmi allオプションを付加することにより、サービスイメージも削除することができる。

podman-compose down

# ボリュームも含めて削除する場合
podman-compose down -v

# サービスイメージの停止および削除
podman-compose down --rmi all


サービスの強制削除

停止中のコンテナを削除する。

podman-compose rm


サービスの強制消去

サービスを強制停止する。

podman-compose kill


コマンドの実行

引数で指定したサービスのコンテナ内でコマンドを実行する。

podman-compose run <サービス名> <コマンド> <引数 1> <引数 2> <引数...>

# 例: container-compose.ymlファイル内のdbを強制的にpullして、dbおよびwebを実行する
podman-compose run db web new . --force --database=mysql


サービスの設定の確認

container-compose.ymlファイルで記述されている設定を表示する。

podman-compose config


サービスログの確認

サービスのログを表示する。

podman-compose logs



Kubernetes YAMLへ変換

Container-compose.ymlファイルからポッドを構築する。

podman-compose up -d
# または
podman-compose up -d -f <Container-compose.ymlファイルのパス>


Kubernetes YAMLファイルへ変換する。

podman generate kube <ポッド名> > <Kubernetes YAMLファイル名>.yml