0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

以前以下の記事で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の機能を使ってコンテナごとに異なるネットワーク名前空間を作ることで、コンテナ間やコンテナ‐ホスト間のネットワークを隔離しています。
image.png

上記を踏まえると以下のような方法でも調べることができます。

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アドレスを調べることができます。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?