はじめに
以前以下の記事でDockerのネットワーク構造を調べていた時に、コンテナのNICのIP等を調べる必要があったのでその時の方法を以下にまとめます。
カンタンな方法
といっても、以下の通り調べたいコンテナ内でbashを起動してifconfigコマンドを実行すればいいだけである。
[container name/container ID]で指定したcontainer内でbashを起動する
docker exec -it [container name/container ID] bash
出力例(container IDに左図の” 6d79b5258833 “を指定した場合)
root@AZ-foo-pc28:/home/userpco128# docker exec -it 6d79b5258833 bash
root@6d79b5258833:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 708 bytes 49284 (49.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 49 bytes 2914 (2.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
・・・
カンタンですね。
しかし、別の方法もあります。
上記の記事でも紹介した通り、DockerはLinuxカーネルのnetnsの機能を使ってコンテナごとに異なるネットワーク名前空間を作ることで、コンテナ間やコンテナ‐ホスト間のネットワークを隔離しています。
上記を踏まえると以下のような方法でも調べることができます。
psコマンドから覗いてみる方法
Dockerを起動しているホスト上で以下を実行します。
Dockerコンテナを実行している状態で、ps auxfコマンドにてホスト上のプロセス一覧を表示
・・・
root 5416 0.0 0.1 720504 15668 ? Sl 12:42 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id c81bfe4cf140bcb443318431ff4024d906b0e1d657038fe2819972c4ff516f53 -addr
root 5438 0.0 0.0 4640 896 ? Ss 12:42 0:00 \_ /bin/sh /usr/sbin/apachectl -D FOREGROUND
root 5463 0.0 0.0 73972 5188 ? S 12:42 0:00 \_ /usr/sbin/apache2 -D FOREGROUND
www-data 5466 0.0 0.1 1280728 9068 ? Sl 12:42 0:00 \_ /usr/sbin/apache2 -D FOREGROUND
www-data 5467 0.0 0.0 1280672 6500 ? Sl 12:42 0:00 \_ /usr/sbin/apache2 -D FOREGROUND
・・・
Dockerコンテナのプロセスは以下です。
root 5438 0.0 0.0 4640 896 ? Ss 12:42 0:00 \_ /bin/sh /usr/sbin/apachectl -D FOREGROUND
コンテナ内でnetnsコマンドを使用するために、ホストのnetnsディレクトリ配下に該当のプロセスのネットワーク名前空間のシンボリックリンクを作る(Con1は任意のネットワーク名前空間名です)
ln -s /proc/5438/ns/net /var/run/netns/Con1
netnsコマンドを使用してDockerが作成したネットワーク名前空間の中身を盗み見る
root@AZ-foo-pc28:/home/userpco128# ip netns exec Con1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 38 bytes 3858 (3.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14 bytes 8372 (8.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
・・・
上記のように、コンテナのプロセスのネットワーク名前空間内でifconfigコマンドを実行することでもIPアドレスを調べることができます。
参考