Podman Networkをやってみる

Podmanなどのコンテナ技術を利用したシステム開発などの現場においては、コンテナネットワークに関する理解がとても重要です。
この記事では、コンテナ間の通信を実現するPodman Networkに関する基本的な使い方とPodman Networkの注意点について解説しています。
なお、Podmanの基本的な使い方は、こちらで解説しています。
目次
Podman Networkをやってみる
PodmanはCNI(Container Network Interface)であるのに対し、Dockerはlibnaetworkを利用してコンテナネットワークを実現しています。
PodmanとDockerでは、コンテナネットワークの実装(実現方法)は異なるものの、使い手の側から見ればあまり気にするところではありません。
Podman Networkを実際に動かしながら、Podmanのコンテナネットワークを検証していきます。
Podman Networkを作成する
Podmanのコンテナネットワークの一覧表示は、podman network lsコマンドを使用します。
$ podman network ls
NETWORK ID    NAME        VERSION     PLUGINS
2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuningデフォルトで「podman」というコンテナネットワークが設定されています。これは、Dockerのコンテナネットワークとして設定されている「bridge」と同じようなコンテナネットワークで、「10.88.0.0/16」のサブネットが設定されています。
コンテナ起動時にコンテナネットワークを指定しない場合は、この「podman」のコンテナネットワークに接続されます。
新しいコンテナネットワーク「test_network01」を作成します。コンテナネットワークの作成は、podman network createコマンドを使用します。
$ podman network create test_network01
/home/testuser/.config/cni/net.d/test_network01.conflist
$ podman network ls
NETWORK ID    NAME            VERSION     PLUGINS
2f259bab93aa  podman          0.4.0       bridge,portmap,firewall,tuning
b66d2eb77c55  test_network01  0.4.0       bridge,portmap,firewall,tuning作成したコンテナネットワークの内容は、podman network inspectコマンドを使用します。
$ podman network inspect test_network01
[
    {
        "cniVersion": "0.4.0",
        "name": "test_network01",
        "plugins": [
            {
                "bridge": "cni-podman1",
                "hairpinMode": true,
                "ipMasq": true,
                "ipam": {
                    "ranges": [
                        [
                            {
                                "gateway": "10.89.0.1",
                                "subnet": "10.89.0.0/24"
                            }
                        ]
                    ],
                    "routes": [
                        {
                            "dst": "0.0.0.0/0"
                        }
                    ],
                    "type": "host-local"
                },
                "isGateway": true,
                "type": "bridge"
            },
            {
                "capabilities": {
                    "portMappings": true
                },
                "type": "portmap"
            },
            {
                "backend": "",
                "type": "firewall"
            },
            {
                "type": "tuning"
            }
        ]
    }
]Podman NetworkのデフォルトのドライバはBridgeです。サブネットは「10.89.0.0/24」、デフォルトゲートウェイは「10.89.0.1」が自動的に割り振られています。
任意のサブネットを指定する
次に、任意のサブネットとデフォルトゲートウェイを指定して、コンテナネットワーク「test_network02」を作成してみます。
$ podman network create --subnet=192.168.100.0/24 --gateway=192.168.100.254 test_network02
/home/testuser/.config/cni/net.d/test_network02.conflist
$ podman network ls
NETWORK ID    NAME            VERSION     PLUGINS
2f259bab93aa  podman          0.4.0       bridge,portmap,firewall,tuning
b66d2eb77c55  test_network01  0.4.0       bridge,portmap,firewall,tuning
518c785abfd9  test_network02  0.4.0       bridge,portmap,firewall,tuningコンテナネットワーク「test_network02」の内容を確認します。
$ podman network inspect test_network02
[
    {
        "cniVersion": "0.4.0",
        "name": "test_network02",
        "plugins": [
            {
                "bridge": "cni-podman2",
                "hairpinMode": true,
                "ipMasq": true,
                "ipam": {
                    "ranges": [
                        [
                            {
                                "gateway": "192.168.100.254",
                                "subnet": "192.168.100.0/24"
                            }
                        ]
                    ],
                    "routes": [
                        {
                            "dst": "0.0.0.0/0"
                        }
                    ],
                    "type": "host-local"
                },
                "isGateway": true,
                "type": "bridge"
            },
            {
                "capabilities": {
                    "portMappings": true
                },
                "type": "portmap"
            },
            {
                "backend": "",
                "type": "firewall"
            },
            {
                "type": "tuning"
            }
        ]
    }
]指定したサブネットとデフォルトゲートウェイが設定されていることが確認できました。
コンテナにネットワークを接続する
AlmaLinuxのコンテナに対してコンテナネットワークを接続して、以下のような構成を作成していきます。

コンテナ起動時にネットワークを指定する
AlmaLinuxコンテナの起動時に、先ほど作成したコンテナネットワーク(test_network02)を接続してみます。
$ podman images
REPOSITORY                   TAG         IMAGE ID      CREATED       SIZE
docker.io/library/almalinux  latest      7ba003a70874  41 hours ago  190 MB
$ podman run -it -d --net test_network02 --rm --name alma_test01 almalinux:latest
f3df26c2060cb2d6431d4e991db8b4fe5e7d463df310c20648aae3bac30c092b
$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
f3df26c2060c  docker.io/library/almalinux:latest  /bin/bash   24 seconds ago  Up 23 seconds ago              alma_test01起動したコンテナ(alma_test01)に入ってIPアドレスを確認します。
$ podman exec -it alma_test01 /bin/bash
[root@f3df26c2060c /]# hostname -i
192.168.100.1指定したコンテナネットワーク(test_network02)のサブネットのIPアドレス(192.168.100.1)が自動的に割り振られています。IPアドレスを指定しない場合は、サブネット範囲の先頭から順番に割り振られます。
AlmaLinuxコンテナにIPアドレスを指定してコンテナ起動することもできます。IPアドレスの指定は、–ipオプションを使用します。
$ podman run -it -d --net test_network02 --ip=192.168.100.20 --rm --name alma_test02 almalinux:latest
94306156085dd41a1cabc03bf0baded09bee30b38037fa10d4047d069f1c062c
$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
f3df26c2060c  docker.io/library/almalinux:latest  /bin/bash   20 minutes ago  Up 20 minutes ago              alma_test01
94306156085d  docker.io/library/almalinux:latest  /bin/bash   31 seconds ago  Up 30 seconds ago              alma_test02起動したコンテナ(alma_test02)に入ってIPアドレスを確認します。
$ podman exec -it alma_test02 /bin/bash
[root@94306156085d /]# hostname -i
192.168.100.20オプションで指定したIPアドレスが割り当てられました。
コンテナ間の通信状態を確認する
起動した2つのAlmaLinuxコンテナ間の通信状態をpingで確認します。
alma_test01(IP=192.168.100.1)からalma_test02(192.168.100.20)にpingを打ってみます。
$ podman exec -it alma_test01 /bin/bash
[root@f3df26c2060c /]# hostname -i
192.168.100.1
[root@f3df26c2060c /]# ping 192.168.100.20
PING 192.168.100.20 (192.168.100.20) 56(84) bytes of data.
64 bytes from 192.168.100.20: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.100.20: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 192.168.100.20: icmp_seq=3 ttl=64 time=0.035 ms
64 bytes from 192.168.100.20: icmp_seq=4 ttl=64 time=0.034 ms
64 bytes from 192.168.100.20: icmp_seq=5 ttl=64 time=0.034 ms
64 bytes from 192.168.100.20: icmp_seq=6 ttl=64 time=0.034 ms
64 bytes from 192.168.100.20: icmp_seq=7 ttl=64 time=0.028 ms
^C
--- 192.168.100.20 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6124ms
rtt min/avg/max/mdev = 0.028/0.039/0.074/0.014 msalma_test02(IP=192.168.100.20)からalma_test01(192.168.100.1)にもpingを打ってみます。
$ podman exec -it alma_test02 /bin/bash
[root@94306156085d /]# hostname -i
192.168.100.20
[root@94306156085d /]# ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=0.034 ms
64 bytes from 192.168.100.1: icmp_seq=4 ttl=64 time=0.042 ms
64 bytes from 192.168.100.1: icmp_seq=5 ttl=64 time=0.033 ms
64 bytes from 192.168.100.1: icmp_seq=6 ttl=64 time=0.033 ms
^C
--- 192.168.100.1 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5102ms
rtt min/avg/max/mdev = 0.033/0.037/0.049/0.006 ms2つのコンテナ間で通信できていることが確認できました。
コンテナネットワークを削除する
最後に作成したコンテナネットワークを削除します。コンテナネットワークの削除は、podman network rmコマンドを使用します。
$ podman network ls
NETWORK ID    NAME            VERSION     PLUGINS
2f259bab93aa  podman          0.4.0       bridge,portmap,firewall,tuning
b66d2eb77c55  test_network01  0.4.0       bridge,portmap,firewall,tuning
518c785abfd9  test_network02  0.4.0       bridge,portmap,firewall,tuning
$ podman network rm test_network01 test_network02
Error: "test_network02" has associated containers with it. Use -f to forcibly delete containers and pods: network is being used
$ podman network ls
NETWORK ID    NAME            VERSION     PLUGINS
2f259bab93aa  podman          0.4.0       bridge,portmap,firewall,tuning
518c785abfd9  test_network02  0.4.0       bridge,portmap,firewall,tuning上記では、「test_network02」のコンテナネットワークがコンテナに接続されている状態のため削除できませんでした。このように、使用中のコンテナネットワークは削除できませんが、-fオプションを付けた場合は強制的に削除することもできます。
起動しているコンテナを停止すれば、コンテナネットワークは普通に削除できます。
$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
f3df26c2060c  docker.io/library/almalinux:latest  /bin/bash   53 minutes ago  Up 53 minutes ago              alma_test01
94306156085d  docker.io/library/almalinux:latest  /bin/bash   33 minutes ago  Up 33 minutes ago              alma_test02
$ podman stop alma_test01 alma_test02
alma_test01
alma_test02
$ podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
$ podman network ls
NETWORK ID    NAME            VERSION     PLUGINS
2f259bab93aa  podman          0.4.0       bridge,portmap,firewall,tuning
518c785abfd9  test_network02  0.4.0       bridge,portmap,firewall,tuning
$ podman network rm test_network02
test_network02
$ podman network ls
NETWORK ID    NAME        VERSION     PLUGINS
2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuningPodman Networkの注意点について
Podmanのコンテナネットワークは、Dockerのコンテナネットワークと大きな相違点があることに注意が必要です。
Podmanの場合は、異なるサブネットに接続されているコンテナであっても、同一ホスト上であれば通信できてしまうことです。
そのため、同一ホスト上においてサブネットを分割しても意味がないということになります。これは、セキュリティ面から見れば重大な問題となるケースも考えられます。
以下のようなコンテナとコンテナネットワークを作成し、異なるサブネットに接続されたコンテナ間で通信できるのか実際に検証してみます。

まずはじめに、異なるサブネットのコンテナネットワークを作成します。
$ podman network create --subnet=192.168.100.0/24 --gateway=192.168.100.254
 test_network01
/home/testuser/.config/cni/net.d/test_network01.conflist
$ podman network create --subnet=192.168.200.0/24 --gateway=192.168.200.254
 test_network02
/home/testuser/.config/cni/net.d/test_network02.conflist
$ podman network ls
NETWORK ID    NAME            VERSION     PLUGINS
2f259bab93aa  podman          0.4.0       bridge,portmap,firewall,tuning
b66d2eb77c55  test_network01  0.4.0       bridge,portmap,firewall,tuning
518c785abfd9  test_network02  0.4.0       bridge,portmap,firewall,tuning次に、作成したコンテナネットワークをAlmaLinuxコンテナに接続してコンテナ起動します。
$ podman run -it -d --net test_network01 --ip=192.168.100.1 --rm --name alma_test01 almalinux:latest
4e84017364d9bc75c6b2c179a7fb26a54e13888361d25c40beea3d52e1d90a33
$ podman run -it -d --net test_network02 --ip=192.168.200.1 --rm --name alma_test02 almalinux:la
test
a4596d4fac2c86925b81f28d291a0d1b37260b65de3aceb04ead8757a0ced8de
$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED             STATUS                 PORTS       NAMES
4e84017364d9  docker.io/library/almalinux:latest  /bin/bash   About a minute ago  Up About a minute ago          alma_test01
a4596d4fac2c  docker.io/library/almalinux:latest  /bin/bash   About a minute ago  Up About a minute ago              alma_test02alma_test01(IP=192.168.100.1)のコンテナに入って、alma_test02(IP=192.168.200.1)にpingを打ってみます。
$ podman exec -it alma_test01 /bin/bash
[root@4e84017364d9 /]# hostname -i
192.168.100.1
[root@4e84017364d9 /]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.200.1: icmp_seq=1 ttl=63 time=0.128 ms
64 bytes from 192.168.200.1: icmp_seq=2 ttl=63 time=0.058 ms
64 bytes from 192.168.200.1: icmp_seq=3 ttl=63 time=0.057 ms
64 bytes from 192.168.200.1: icmp_seq=4 ttl=63 time=0.057 ms
64 bytes from 192.168.200.1: icmp_seq=5 ttl=63 time=0.057 ms
^C
--- 192.168.200.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4078ms
rtt min/avg/max/mdev = 0.057/0.071/0.128/0.028 msalma_test02(IP=192.168.200.1)のコンテナに入って、alma_test01(IP=192.168.100.1)にもpingを打ってみます。
$ podman exec -it alma_test02 /bin/bash
[root@a4596d4fac2c /]# hostname -i
192.168.200.1
[root@a4596d4fac2c /]# ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=63 time=0.092 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=63 time=0.058 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=63 time=0.057 ms
64 bytes from 192.168.100.1: icmp_seq=4 ttl=63 time=0.057 ms
64 bytes from 192.168.100.1: icmp_seq=5 ttl=63 time=0.057 ms
^C
--- 192.168.100.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4134ms
rtt min/avg/max/mdev = 0.057/0.064/0.092/0.013 ms異なるサブネットに接続されたコンテナ同士で通信できていることが確認できました。
まとめ
いかがでしたでしょうか。
今回は、Podman Networkの使い方とコンテナネットワークへの接続方法について解説しました。
この解説で登場したPodman Networkのコマンドは、以下の表のとおりです。
| Podman Networkコマンド | 概要 | 
|---|---|
| podman network ls | コンテナネットワークの一覧を表示する | 
| podman network inspect | コンテナネットワークのサブネットやデフォルトゲートウェイなどの詳細情報を表示する | 
| podman network create | コンテナネットワークを作成する | 
| podman network rm | コンテナネットワークを削除する | 
Podman Networkは、コンテナ間で通信を行う場合に必須の機能になりますので、しっかり理解しておきましょう。
なお、今回の検証で使用したpodman version 3.3.1のコンテナネットワーク(Bridge)では、異なるサブネットに接続されたコンテナ同士でも通信できることを確認しました。
Podman Networkにおいて、異なるサブネットに属するコンテナ同士が通信可能なこと自体が正しいのか正しくないのかは、今後のPodmanの開発によるところだとおもいます。
利用する側としては、この事実を踏まえた上で利用していくことが大切です。
参考になれば幸いです。
システムのお悩みについてご相談ください
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。


