8 Podmanネットワーキング
Podmanで実行されるコンテナ、またはBuildah内でイメージおよび一時コンテナを操作する場合の様々なネットワーク要件を構成する方法を理解します。
Podmanは、コンテナがホスト・システムのrootユーザーまたは特権ユーザーまたは標準ユーザーのどちらに実行されるかによって、コンテナのネットワークを別々に処理します。 rootユーザーにはホストのネットワーク・インフラストラクチャを変更するためのかなり強力な権限がありますが、標準ユーザーにはネットワーク・インフラストラクチャを変更する権限が制限されています。
Podmanのネットワーク設定では、ポッドまたはグループで実行されているコンテナは同じネットワーク・ネームスペースを共有するため、同じIPアドレスとMACアドレスおよびポート・マッピングにアクセスできます。 共有ネームスペースを使用すると、異なるコンテナ間、またはホストとそれで実行されているコンテナ間のネットワーク通信が容易になります。 ポッドの詳細は、Podmanポッドを参照してください。
特に指示がないかぎり、このセクションのすべてのネットワーク手順は、ルートユーザーまたは特権ユーザーによってのみ実行できます。
プロキシ・サーバーの設定
Podmanを構成して、システム全体のプロキシ・サーバーおよびPodman systemdサービスの両方を使用します。
Podmanは、実行するコマンドとプロビジョニングするコンテナにシステム・プロキシ設定を自動的に使用します。
プロキシ設定は、次のように/etc/profileに設定を追加することでシステム全体に適用できます:
HTTP_PROXY=proxy_URL:port
HTTPS_PROXY=proxy_URL:port
一部のサービス(Cockpit Webコンソールなど)では、Podman API systemdサービスを使用してPodmanと対話します。
ノート:
Podman APIサービスはPodmanを使用する必要はありません。 このサービスは、APIを使用してPodmanと対話するアプリケーション(Cockpit Webコンソールなど)を使用している場合にのみ実行します。Podman APIを使用するサービスのシステム・プロキシ環境変数を設定するには、systemdサービス・ドロップインを作成します。
コンテナのポート・マッピングの構成
特権のないPodmanコンテナで使用するネットワーク・ポートをマップします。
Podmanは、root権限なしで標準ユーザーが実行する非特権コンテナの場合、ホスト・システムで使用可能な既存のネットワーク・インフラストラクチャを使用するようにポート・マッピングに依存します。 標準ユーザーは、コンテナのIPアドレスの割当てなど、特定のネットワーク設定を構成できず、必要もありません。 Podmanは、コンテナベースのサービスへのポート転送を実行することで、これらのコンテナのネットワーク機能を自動的に処理します。
Oracle LinuxおよびPodmanの以前のリリースでは、slirp4netnsはコンテナごとに個別のネットワーク構成を提供し、独自のゲートウェイ・アドレスを設定し、制限されたポート・アクセスが必要な場合に権限のないコンテナとホスト間の通信用にネットワーク・アドレス変換(NAT)を提供していました。 非特権ユーザーのポート公開は、IPv4ポート番号1024から65535に制限されており、ネイティブのIPv6ポート・マッピング機能はありませんでした。
Oracle Linux 9.5以降、およびPodman 5.3以降を実行しているシステムでは、権限のないコンテナはデフォルトでパスタ・ネットワーキングを使用します。 Oracle Linux 10システムでは、デフォルトでパスタ・ネットワーキングも使用されます。
Pastaネットワーキングでは、Plug A Simple Socket Transport (passt)ネットワーク・ドライバを使用して、ホスト・ネットワーク・アダプタ構成からIPアドレスをコピーし、TCP、UDP、ICMPなどのプロトコルに対してレイヤー2ネットワーク・インタフェースとレイヤー4ソケット間の変換レイヤーを提供します。 この変換レイヤーは、非特権コンテナからアクセスでき、IPv4およびIPv6ポート・マッピングへのアクセスを提供し、同じホスト上のコンテナ間のネットワーク・アクセスを管理します。 詳細は、upstream passt documentationを参照してください。
ノート:
Pastaおよびslirp4netnsネットワーキングについてさらに学習するには、Oracle LinuxでのPodmanでのPastaネットワーキングの使用チュートリアルを参照してください。
例8-1コンテナ内のpastaネットワークの検証
Oracle Linux 9ホスト・システムで実行中のコンテナがパスタ・ネットワーキングを使用していることを確認するには、podman inspectコマンドを使用してHostConfig.NetworkMode設定を確認します。 たとえば:
podman inspect --format='{{.HostConfig.NetworkMode}}' container_id
container_idをコンテナの名前またはIDに置き換えます。 コンテナがpastaネットワークを使用している場合、出力は次のようになります。
pasta
例8-2ホスト上のポートのコンテナへのマップ
この例では、ホストのポート8080をコンテナ・ポート80にマップします。
podman run --name mynginx -d -p 8080:80 quay.io/libpod/alpine_nginx:latest
コンテナの実行時に-Pオプションを使用すると、Podmanでポート・マッピングを自動的に構成できます。 ただし、生成された構成は意図したものより予測できない場合があります。
ポート・マッピングが確立されると、そのポートはコンテナが実行されているホストから直接アクセスできます。 この例では、ホストは、http://localhost:8080へのWebブラウザを開くか、curlコマンドを使用して、コンテナのポート80にアクセスできます。 たとえば:
curl http://127.0.0.1:8080
この例では、出力は次のようになります。
podman rulez
コンテナのポート・マッピングを直接表示するには、podman portコマンドを使用します。 たとえば:
podman port mynginx
コンテナにアクティブなポート・マッピングがある場合、コマンド出力は次のようになります。
80/tcp -> 0.0.0.0:8080
podman port -aコマンドを使用して、ホストで実行されているすべてのコンテナのすべてのポート・マッピングを表示できます。
例8-3コンテナ間のポート・アクセスの検証
コンテナとホストは同じネットワーク・ネームスペースを共有するため、コンテナは、Oracle Linuxホスト・システムのIPアドレスまたはホスト名とのポート・マッピングを使用して、別のコンテナと直接通信できます。
前の例を拡張して、次のコマンドで2番目のコンテナを実行します。
podman run -it --rm oraclelinux:9-slim curl http://hostname:8080
ここで、hostnameは Oracle Linuxホストシステムのホスト名またはIPアドレスです。
Webサーバーを実行しているコンテナのインバウンドWebトラフィックを確認するには、podman logsコマンドを使用します。
podman logs container 2> /dev/null | grep "GET /"
containerをコンテナ名またはIDに置き換えます。
同じホスト上のPodmanコンテナ間のHTTPリクエストは、パブリック対応IPアドレスではなくホスト・システム・ゲートウェイIPアドレスで記録されます。これは、Pastaネットワーキング変換レイヤーがネットワーク・トラフィックを適切な場所に効率的にルーティングするためです。
ホスト・システムで実行中のファイアウォール・ソフトウェアがある場合、コンテナが他のホスト・システムおよびリモート・クライアントから外部にアクセスできるようにするには、マップされたポートでインバウンド・トラフィックを許可する必要があります。 たとえば:
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
その後、次のコマンドを使用して、リモート・ホストからコンテナに接続できます。
curl http://hostname:8080
コンテナ・ネットワークの調査
作成したすべてのコンテナのネットワーク情報を調べ、IPアドレス指定、ネットワーク、ポート・マッピングなどの重要な情報を取得できます。 コンテナがルート・アカウントで実行されている場合は、必要に応じて次のコマンドの前にsudoを付けます。
コンテナのIPアドレスを表示するには、次を実行します。
podman inspect --format='{{.NetworkSettings.IPAddress}}' container
コンテナにアタッチされているネットワークを表示するには、次を実行します。
podman inspect --format='{{.NetworkSettings.Networks}}' container
コンテナのポート・マッピングを表示するには、次を実行します。
podman inspect --format='{{.NetworkSettings.Ports}}' container
コンテナ向け高度なネットワーキング
高度なPodmanネットワーク構成はrootユーザーのみが実行できるため、rootユーザーによって実行されるコンテナにのみ適用されます。
IPアドレスの割当てが必要な可能性がある高度なネットワーキングにより、コンテナはネットワーク・スタック内の特定の機能を利用してポッド内の他のコンテナと通信できます。 この場合、Podmanは、各コンテナのIPアドレス割当てとフル・ネットワーク・アクセスを処理できるブリッジ・ネットワーク・スタックを実装します。
rootユーザーによって実行されるコンテナの場合、ネットワーク管理は、次の2つのバックエンド・ネットワーク・スタックのいずれかを使用して実現されます。
- コンテナ・ネットワーク・インタフェース(CNI): Golangで記述され、様々なコンテナ関連プロジェクトに対して様々なネットワーク機能を実装するために使用できるプラグインの概念を中心に設計された非推奨のネットワーク・スタック。 詳細は、アップストリームCNIのドキュメントを参照してください。
- Netavark: Podman用に設計されたネットワーク・スタックで、他のOpen Container Initiativeコンテナ管理アプリケーションと互換性があります。 詳細は、アップストリームNetavarkのドキュメントを参照してください。
Podmanは、システムで使用可能なネットワーク・スタックに応じて、どのネットワーク・スタックを自動的に使用するかを選択します。 次のコマンドを実行して、システムで使用しているネットワーク・スタックを識別できます。
podman info --format '{{.Host.NetworkBackend}}'注意:
この項で説明するpodman networkコマンドは、root権限で実行されるコンテナにのみ機能します。 これらのコマンドを標準ユーザー・コンテナで実行すると、エラー・コードが返されます。
CNIネットワークについて
ノート:
CNIネットワーク・スタックは現在非推奨であり、Podmanの将来のリリースで削除される可能性があります。 かわりにNetavarkの使用を検討してください。 ネットワーク・スタックを変更するには、ネットワーク・バックエンドの変更を参照してください。 CNIは非推奨ですが、Netavarkは、Flannelを使用して作成されたKubernetesネットワークに接続する機能など、CNIで使用可能なプラグインをサポートしていません。 必要に応じて、引き続きCNIネットワークを使用してこの機能を利用できます。
CNIは、コンテナベースのネットワーク要件を満たす一連のネットワーク・ツールです。 CNIでは、プラグイン開発モデルを使用して、様々なネットワーク機能と要件に対応しています。 Podmanは、これらのプラグインの多くを直接使用して、個々のコンテナ、またはポッド内で動作するコンテナの基本的なネットワーキングを簡単にセットアップできます。
古いPodmanデプロイメントとの一貫した構成を維持するために、デフォルトのネットワーク・バックエンドとしてCNIを使用することを選択できます。
CNIを使用するには、containernetworking-pluginsパッケージがインストールされている必要があります。 このパッケージがインストールされているかどうかを確認するには、次を使用します。
rpm -q containernetworking-pluginsインストールされていない場合は、次を使用してインストールします。
sudo dnf install -y containernetworking-pluginsPodmanで作成するネットワークごとに、JSON形式の新しい構成ファイルが/etc/cni/net.d/ディレクトリに生成されます。 ほとんどの場合、このディレクトリ内のファイルを編集したり管理したりする必要はありません。
一般的なネットワーク構成ファイルは次のようになります。
{
"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は、IPv6、ネットワーク・アドレス変換(NAT)およびポート転送の処理を改善します。 また、DNSはネットワーク間に自動的に構成されるため、複数のネットワークを持つコンテナが、コンテナ名を解決可能なDNS参照として使用することによって他の共有ネットワーク上の他のコンテナに接続できます。
すべてのデプロイメントでPodmanバージョン4.0以降を使用し、Podman内のコンテナのみを実行する場合は、Netavarkバックエンドを使用します。 Netavarkは、コンテナを既存のネットワーク・インフラストラクチャに簡単に統合し、DNS解決を向上させる、優れたパフォーマンスと機能を提供します。
Netavarkを使用するには、netavarkパッケージがインストールされている必要があります。 このパッケージがインストールされているかどうかを確認するには、次を使用します。
rpm -q netavarkインストールされていない場合は、次を使用してインストールします。
sudo dnf install -y netavarkPodmanで作成するネットワークごとに、JSON形式の新しい構成ファイルが/etc/containers/networks/ディレクトリに生成されます。 ほとんどの場合、これらのディレクトリ内のファイルを編集したり管理したりする必要はありません。
一般的なネットワーク構成ファイルは次のようになります:
{
"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 network inspect network_nameネットワーク・バックエンドの変更
CNIとNetavarkのネットワーク・バックエンド・スタックの使用を切り替えて、Podmanが別のバックエンド・スタックを選択するように強制できます。 一方からもう一方への切替えは、両方のネットワーク・バックエンド・スタックのパッケージ(containernetworking-pluginsおよびnetavark)がインストールされていることを前提としています。
重要:
あるネットワーク・バックエンドから別のネットワーク・バックエンドに変更する場合は、Podman構成をリセットする必要があります。 ネットワーク・バックエンドを切り替えると、既存のコンテナ、イメージ、ネットワークおよびポッドがすべて環境から効果的に削除されます。
デプロイメントのネットワーク・バックエンドを変更および永続的に設定するには、次のステップを実行します。
ネットワークの作成および削除
podman network createコマンドを使用して、新しいネットワーク構成を生成します。 Podmanは、デフォルトのネットワークとその他の既存のネットワークに基づいて自動的にネットワーク設定を定義します。 ただし、ネットワーク範囲とサブネット・サイズを設定し、IPv6を有効にするオプションを使用できます。 これらのオプションの詳細は、podman help network createコマンドおよびpodman-network-create(1)マニュアル・ページを参照してください。
podman network removeコマンドを使用して、ネットワークを削除します。 まず、ネットワークに接続されているすべてのコンテナを削除する必要があります。 -fオプションを使用すると、ネットワークを使用しているコンテナを強制的に削除できます。
podman network pruneコマンドを使用して、システムで使用されていないすべてのネットワークを削除することもできます。
例8-4ネットワークの作成
podman network create mynetwork
例8-5ネットワークの削除
sudo podman network rm mynetwork例8-6未使用のネットワークの削除
podman network prune
ネットワークのリスト表示
podman network lsコマンドを使用して、すべてのPodmanネットワークのリストを出力します。
podman network lsコマンドの詳細は、podman-network-ls(1)マニュアル・ページを参照してください。
例8-7すべてのPodmanネットワークのリスト
podman network ls
出力は次のようになります。
NETWORK ID NAME DRIVER
2f259bab93aa podman bridge
0b723c8502a2 podman-default-kube-network bridge
コンテナ・ネットワークの接続および切断
podman network connectコマンドを使用して、ネットワークにコンテナを追加します。 コンテナを作成すると、ネットワークが自動的に起動され、コンテナにはネットワークに定義された範囲内のIPアドレスが割り当てられます。 同様に、コンテナを削除すると、ネットワークも自動的に停止します。
podman network disconnectを使用して、ネットワークからコンテナを削除します。
podman network connectコマンドの詳細は、podman-network-connect(1)マニュアル・ページを参照してください。 podman network disconnectコマンドの詳細は、podman-network-disconnect(1)マニュアル・ページを参照してください。
例8-8ネットワークへのコンテナの追加
podman network connect mynetwork mycontainer
例8-9ネットワークからのコンテナの切断
podman network disconnect mynetwork mycontainer