Dockerのネットワーク周りのトラシューをする時、
docker execでコンテナ内に入ってしまうとデバッグ用のコマンドが使えないことがあって不便なものです。
そんな時はNetwork Namespaceを切り替えることで、ホスト側のコマンド全て使える状態で対象のDockerコンテナのネットワーク環境で作業できて便利です。以下にその方法を記します。
Dockerのデフォルト・ネットワーク(bridge)では、コンテナを作成するたびにNetwork Namespaceが作成されます。
Network Namespaceの一覧は以下コマンドで取得できます。
$ sudo ip netns ls
このコマンドで対象のNamespaceを確認して、切り替えて...
と行きたいところですが、もう1ステップ必要です。
ip netns は/var/run/netns 配下のファイルを一覧表示する実装になっていますが、
Docker経由でNetwork Namespaceを作成した場合はこのディレクトリ配下にファイルが作成されません(というかこのディレクトリ自体作られません)。
そのためまず以下手順を実行する必要があります。
$ sudo mkdir /var/run/netns
$ pid=$(docker inspect $CONTAINER_ID --format '{{.State.Pid}}’)
$ sudo ln -s /proc/${pid}/ns/net /var/run/netns/[任意のファイル名]
以下、実際の利用例になります。
[ec2-user@dockerHost ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71de02f377ed busybox "sh" 45 minutes ago Up 45 minutes c1
[ec2-user@dockerHost ~]$ ip netns list
[ec2-user@dockerHost ~]$
[ec2-user@dockerHost ~]$ CONTAINER_ID=71de02f377ed
[ec2-user@dockerHost ~]$ pid=$(docker inspect ${CONTAINER_ID} --format '{{.State.Pid}}')
[ec2-user@dockerHost ~]$ sudo mkdir /var/run/netns
[ec2-user@dockerHost ~]$ sudo ln -s /proc/${pid}/ns/net /var/run/netns/tmp-container-ns
[ec2-user@dockerHost ~]$ sudo ip netns ls
tmp-container-ns (id: 0)
[ec2-user@dockerHost ~]$ sudo ip netns exec tmp-container-ns bash
[root@dockerHost ec2-user]#