5 Podman用ネットワークの構成

この章のネットワーク情報では、Podmanで実行するコンテナまたはBuildah内でイメージや一時コンテナを操作する際の各ネットワーク要件の構成方法について理解できます。

Podmanは、コンテナがホスト・システムのrootユーザーまたは特権ユーザーまたは標準ユーザーのどちらに実行されるかによって、コンテナのネットワークを別々に処理します。rootユーザーにはホストのネットワーク・インフラストラクチャを変更するためのかなり強力な権限がありますが、標準ユーザーにはネットワーク・インフラストラクチャを変更する権限が制限されています。

Podmanのネットワーク設定では、ポッドまたはグループ内で実行されているコンテナは同じネットワーク・ネームスペースを共有するため、同じIPおよびMACアドレスとポート・マッピングにアクセスできます。共有ネームスペースを使用すると、異なるコンテナ間またはホストとホストで実行されているコンテナの間のネットワーク通信が容易になります。ポッドの詳細は、「ポッドの作成と管理」を参照してください。

特に明記されていないかぎり、以降のセクションのすべてのネットワーク手順は、rootまたは特権ユーザーのみが実行できます。

プロキシ・サーバー設定の構成

Podmanは、実行するコマンドとプロビジョニングするコンテナにシステム・プロキシ設定を自動的に使用します。

プロキシ設定は、次のように/etc/profileに設定を追加することでシステム全体に適用できます。

HTTP_PROXY=proxy_URL:port
HTTPS_PROXY=proxy_URL:port

Cockpit Webコンソールなどの一部のサービスは、Podman API Systemdサービスを使用してPodmanと対話します。Podman APIを使用するサービスのシステム・プロキシ環境変数を設定するには、Systemdサービス・ドロップインを作成します。

  1. /etc/systemd/system/podman.service.dディレクトリがまだ存在しない場合は作成し、Podman APIサービスに固有のSystemdサービスのドロップイン構成をホストします。
    sudo mkdir -p /etc/systemd/system/podman.service.d
  2. /etc/systemd/system/podman.service.d/http-proxy.confを作成または編集して、次のような内容を含めます。
    [Service]
    Environment="HTTP_PROXY=proxy_URL:port"
    Environment="HTTPS_PROXY=proxy_URL:port"

    proxy_URL:portを、使用するプロキシ・サーバーのURLおよびポート番号に置き換えます。

  3. Systemd構成の変更を再ロードし、Podman APIサービスを再開します:
    sudo systemctl daemon-reload
    sudo systemctl restart podman

ノート:

Podman APIサービスはPodmanを使用する必要はありません。このサービスは、APIを使用してPodmanと対話するアプリケーション(Cockpit Webコンソールなど)を使用している場合にのみ実行します。

コンテナのポート・マッピングの構成

ポート・マッピングの定義は、rootユーザーと標準ユーザーの両方が実行できます。

標準ユーザーによって実行されるコンテナの場合、Podmanはポート・マッピングを利用して、ホスト・システムで使用可能な既存のネットワーク・インフラストラクチャを使用します。したがって、標準ユーザーは、このようなコンテナにIPアドレスを割り当てるなど、特定のネットワーク設定を構成することはできず、その必要もありません。Podmanは、コンテナベースのサービスへのポート転送を実行することで、これらのコンテナのネットワーク機能を自動的に処理します。

root以外のユーザーに対するポートの公開は、特権ポート番号の範囲外であるポート番号(制限はポート1024)に制限されています。そのため、特定のポート・マッピングを使用するコンテナを作成する場合は、ポート番号が1024より大きい値に設定されていることを確認してください。たとえば、ホストのポート8080をコンテナのポート80にマップするには、次のように入力します。

podman run -d -p 8080:80/tcp nginx:alpine

また、コンテナの実行時に-Pオプションを使用して、Podmanでポート・マッピングを自動的に構成することもできます。ただし、生成された構成は意図したものより予測できない場合があります。

ポート・マッピングが確立すると、コンテナが実行されているホストから直接ポートにアクセスできます。前述の例から、ホストは、http://localhost:8080へのWebブラウザを開くことで、コンテナのポート80にアクセスできます。

コンテナのポート・マッピングは、次のコマンドを使用することで直接表示できます。

podman port container_id
80/tcp -> 0.0.0.0:8080

また、ポート・マッピングはコンテナの調査時にも確認できます。podman port -aコマンドは、ホストで実行中のすべてのコンテナのすべてのポート・マッピングを表示する場合に使用します。

コンテナとホストは同じネットワーク・ネームスペースを共有するため、コンテナは親のホストが使用するIPアドレスとポート・マッピングを使用することで、別のコンテナと直接通信できます。あるコンテナが別のコンテナのポートに接続する最も簡単な方法は、ホストのIPアドレスとポート・マッピングに接続することです。

前述の例を拡張すると、次のコマンドを使用して2番目のコンテナを実行できます。198.51.100.10はホスト・システムのIPアドレスです。

podman run -it --rm oraclelinux curl http://198.51.100.10:8080

外部ホストは、ホストのIPアドレスおよびマップされたポートを使用して、コンテナ・ポート・マッピングに接続することもできます。ただし、ホストでファイアウォール・ソフトウェアを実行している場合は、コンテナが外部からアクセスできるようにファイアウォール・ポートを開いておく必要があります。

rootユーザーがポート・マッピングを実行しているか、標準ユーザーが実行しているかに関係なく、機能はそれぞれのコンテナに対して同じように動作します。

標準ユーザーが実行するコンテナのネットワークは、当然のことながら制限されます。同様の制限は、userspaceでホストのアプリケーションを設定するユーザーにも適用されます。より複雑なネットワークの場合、コンテナはrootユーザーとして実行する必要があります。

コンテナの拡張ネットワーキングの構成

高度なPodmanネットワーク構成はrootユーザーのみが実行できるため、rootユーザーによって実行されるコンテナにのみ適用されます。

IPアドレスの割当てが必要な可能性がある高度なネットワーキングにより、コンテナはネットワーク・スタック内の特定の機能を利用してポッド内の他のコンテナと通信できます。この場合、Podmanは、各コンテナのIPアドレス割当てとフル・ネットワーク・アクセスを処理できるブリッジ・ネットワーク・スタックを実装します。

rootユーザーによって実行されるコンテナの場合、ネットワーク管理は、次の2つのバックエンド・ネットワーク・スタックのいずれかを使用して実現されます。

  • コンテナ・ネットワーク・インタフェース(CNI): Golangで記述され、様々なコンテナ関連プロジェクトに対して様々なネットワーク機能を実装するために使用できるプラグインの概念に基づいて設計された非推奨のネットワーク・スタック。詳細は、https://github.com/containernetworking/cniを参照してください。
  • Netavark: Podman専用に設計されているが、他のOCIコンテナ管理アプリケーションと互換性があるネットワーク・スタック。https://github.com/containers/netavarkを参照してください

Podmanは、システムで使用可能なネットワーク・スタックに応じて、どのネットワーク・スタックを自動的に使用するかを選択します。次のコマンドを実行して、システムで使用しているネットワーク・スタックを識別できます。

sudo podman info | grep networkBackend

注意:

この項で説明するpodman networkコマンドは、root権限で実行されるコンテナにのみ機能します。これらのコマンドを標準ユーザー・コンテナで実行すると、エラー・コードが返されます。

CNIネットワークについて

ノート:

CNIネットワーク・スタックは現在非推奨であり、Podmanの将来のリリースで削除される可能性があります。かわりにNetavarkの使用を検討してください。ネットワーク・スタックを変更するには、「ネットワーク・バックエンドの変更」を参照してください。CNIは非推奨ですが、Netavarkは、Flannelを使用して作成されたKubernetesネットワークに接続する機能など、CNIで使用可能なプラグインをサポートしていません。必要に応じて、引き続きCNIネットワークを使用してこの機能を利用できます。

CNIは、コンテナベースのネットワーク要件に対応する、幅広く使用されるネットワーク・ツールのセットです。CNIでは、プラグイン開発モデルを使用して、様々なネットワーク機能と要件に対応しています。Podmanでは、これらのプラグインの多くを直接使用して、個々のコンテナまたはポッド内で実行されるコンテナの基本的なネットワークを簡単に設定できます。

古いPodmanデプロイメントとの一貫した構成を維持するために、デフォルトのネットワーク・バックエンドとしてCNIを使用することを選択できます。

CNIを使用するには、containernetworking-pluginsパッケージをインストールする必要があります。

Podmanで作成するネットワークごとに、JSON形式の新しい構成ファイルが/etc/cni/net.d/ディレクトリに生成されます。ほとんどの場合、Podmanはユーザーのかわりにファイルを処理できるため、このディレクトリのファイルを編集または管理する必要はありません。

一般的なネットワーク構成ファイルは次のようになります:

{
   "cniVersion": "0.4.0",
   "name": "mynetwork",
   "plugins": [
      {
         "type": "bridge",
         "bridge": "cni-podman1",
         "isGateway": true,
         "ipMasq": true,
         "hairpinMode": true,
         "ipam": {
            "type": "host-local",
            "routes": [
               {
                  "dst": "0.0.0.0/0"
               }
            ],
            "ranges": [
               [
                  {
                     "subnet": "10.89.0.0/24",
                     "gateway": "10.89.0.1"
                  }
               ]
            ]
         },
         "capabilities": {
            "ips": true
         }
      },
      {
         "type": "portmap",
         "capabilities": {
            "portMappings": true
         }
      },
      {
         "type": "firewall",
         "backend": ""
      },
      {
         "type": "tuning"
      }
   ]
}

Netavarkネットワークについて

Netavarkは、コンテナのネットワーク・ブリッジ、ファイアウォール・ルールおよびシステム設定を構成するために使用できる高パフォーマンスのネットワーク・スタックです。Netavarkは構成設定の実行にプラグインを使用しません。すべてのネットワーク設定アクションはツール自体によって直接実行されるため、オーバーヘッドが軽減され、コンテナの実行時にネットワーク設定のパフォーマンスが向上します。Netavarkは、特にネットワーク・アドレス変換(NAT)とポート転送に関するIPv6の処理を改善します。また、DNSはネットワーク間に自動的に構成されるため、複数のネットワークを持つコンテナが、コンテナ名を解決可能なDNS参照として使用することによって他の共有ネットワーク上の他のコンテナに接続できます。

すべてのデプロイメントでPodmanバージョン4.0以降を使用し、Podman内のコンテナのみを実行する場合は、Netavarkバックエンドを使用します。Netavarkは、コンテナを既存のネットワーク・インフラストラクチャに簡単に統合し、DNS解決を向上させる、優れたパフォーマンスと機能を提供します。

Netavarkを使用するには、netavarkパッケージをインストールする必要があります。

Podmanで作成するネットワークごとに、JSON形式の新しい構成ファイルが/etc/containers/networks/ディレクトリに生成されます。ほとんどの場合、Podmanはユーザーのかわりにファイルを処理できるため、これらのディレクトリ内のファイルを編集または管理する必要はありません。

一般的なネットワーク構成ファイルは次のようになります:

{
     "name": "mynetwork",
     "id": "3977b0c90383b8460b75547576dba6ebcf67e815f0ed0c4b614af5cb329ebb83",
     "driver": "bridge",
     "network_interface": "podman1",
     "created": "2022-09-06T12:08:12.853219229Z",
     "subnets": [
          {
               "subnet": "10.89.0.0/24",
               "gateway": "10.89.0.1"
          }
     ],
     "ipv6_enabled": false,
     "internal": false,
     "dns_enabled": true,
     "ipam_options": {
          "driver": "host-local"
     }
}

次のコマンドを使用して、ネットワーク構成ファイルの内容を表示できます。

sudo podman inspect network_name

ネットワーク・バックエンドの変更

CNIとNetavarkのネットワーク・バックエンド・スタックの使用を切り替えて、Podmanが別のバックエンド・スタックを選択するように強制できます。一方からもう一方への切替えは、両方のネットワーク・バックエンド・スタックのパッケージ(containernetworking-pluginsおよびnetavark)がインストールされていることを前提としています。

重要:

あるネットワーク・バックエンドから別のネットワーク・バックエンドに変更する場合、Podman構成をリセットする必要があります。ネットワーク・バックエンドを切り替えると、既存のコンテナ、イメージ、ネットワークおよびポッドがすべて環境から効果的に削除されます。

デプロイメントのネットワーク・バックエンドを変更し、永続的に設定するには、次のステップを実行します。

  1. /etc/containers/containers.confが存在するかどうかを確認します。存在しない場合は、デフォルトの構成をこの場所にコピーして、デプロイメント用にカスタマイズできるようにします。
    sudo cp /usr/share/containers/containers.conf /etc/containers/
  2. /etc/containers/containers.confを編集し、構成ファイルの[network]セクションでnetwork_backendエントリを見つけます。エントリのコメント文字が存在する場合は削除します。使用するネットワーク・バックエンドと一致するように値を変更します。たとえば、CNIバックエンドを使用するには、一致するようにエントリを変更します:
    network_backend = "cni"
  3. Podman構成を初期状態に再初期化します。
    sudo podman system reset

    このコマンドで警告が表示され、確認を求められます。

    WARNING! This will remove:
            - all containers
            - all pods
            - all images
            - all networks
            - all build cache
            - all machines
    Are you sure you want to continue? [y/N] y

    ノート:

    root以外のPodmanインスタンスがある場合は、ネットワーク・スタックが変更された場合も、これらを個別にリセットする必要があります。

  4. システムを再起動して、Podmanが機能するためにネットワークが正しく実行されていることを確認します。

ネットワークの作成および削除

次のようにpodman network createコマンドを使用して、新しいネットワーク構成を生成します。

sudo podman network create network_name

Podmanは、デフォルトのネットワークとその他の既存のネットワークに基づいて自動的にネットワーク設定を定義します。ただし、ネットワーク範囲とサブネット・サイズを設定し、IPv6を有効にするオプションを使用できます。こうしたオプションの詳細を調べるには、podman help network createコマンドを使用します。

作成したネットワークを削除するには、次を実行します。
sudo podman network rm network_name

ノート:

ネットワークを削除するには、まずネットワークに接続されているすべてのコンテナを削除する必要があります。-fオプションを使用すると、ネットワークを使用しているすべてのコンテナを強制的に削除できます。

次のように入力して、システム上で使用されていないすべてのネットワークを削除できます。

sudo podman network prune

ネットワークのリスト表示

次のようにして、作成したすべてのPodmanネットワークをリストします。

sudo podman network ls
NETWORK ID    NAME        DRIVER
2f259bab93aa  podman      bridge
47d141b0df17  podman1     bridge,portmap,firewall,tuning

コンテナ・ネットワークの接続および切断

コンテナを作成すると、ネットワークが自動的に起動され、コンテナにはネットワークに定義された範囲内のIPアドレスが割り当てられます。同様に、コンテナを削除すると、ネットワークも自動的に停止します。

新しいネットワークを作成した場合は、次を実行して任意のコンテナをネットワークに追加できます。

sudo podman network connect network_name container_id

次のコマンドを実行して、ネットワークからコンテナを切断できます。

sudo podman network disconnect network_name container_id

コンテナ・ネットワークの調査

作成したすべてのコンテナのネットワーク情報を調べ、IPアドレス指定、ネットワーク、ポート・マッピングなどの重要な情報を取得できます。コンテナがrootアカウントで実行されている場合は、必要に応じて、次のコマンドの前にsudoを付けることに注意してください。

コンテナのIPアドレスを表示するには、次を実行します。

podman inspect --format='{{.NetworkSettings.IPAddress}}' container_id

コンテナにアタッチされているネットワークを表示するには、次を実行します。

podman inspect --format='{{.NetworkSettings.Networks}}' container_id

コンテナのポート・マッピングを表示するには、次を実行します。

podman inspect --format='{{.NetworkSettings.Ports}}' container_id