dockerコンテナ間の疎通確認をしようとしたらpingがない!

dockerコンテナ間で通信を行って見ようかなと思ったらpingコマンドがない!

ubuntuのデフォルトコンテナを例えば以下のように実行すると

PS > docker run -it --name myubuntu ubuntu

起動後に以下のようにpingコマンドを実行すると以下の様に表示されます。

root@1b2dac91de25:/# ping
bash: ping: command not found
root@1b2dac91de25:/#

pingなどのコマンドはどうも基本のコンテナ内に入っていないようです。最小限度のものがコンテナに含まれるのでこのようなこともよく発生しがちです。仕方ないのでpingをインストールしていきます。

pingコマンドのインストール

以下の様にすればインストール可能です。pingコマンドだけであればiputils-pingのみインストールすればいいのですが、その他のネットワーク関連コマンドを入れるのであればnet-toolsもインストールしておけばいいのかなと思います。

# apt update
# apt install iputils-ping net-tools

インストールすれば、pingarpifconfignetstartなどが使用可能になります。

おわりに

dockerコンテナを使っていてpingが使えなかったという件でした。また、同じこと言い出しそうだったので、未来の自分に向けての内容でした。

ちなみに

IPアドレスの表示

ifconfigコマンドipコマンドがないときにIPアドレスが知りたいときどうするか困っていたのですが、hostname -iで表示されますね。ブランクがあったので、結構忘れてました。

コンテナの肥大化を防ぐには?

ツイッターpingないよーって書いたら以下のように教えてもらいました。

ということです。動的なライブラリのリンクではなく、静的なリンクで作成されたバイナリになるので導入しても、コンテナの肥大化を防げるみたいです。

busybox.net

これをdocker run実行時に-vオプションをつけてホストのディレクトリのマウントをして、その中に入れておけば同じアーキテクチャであれば共有できそう?

(追記)上記サイトのバイナリの使い方の例

pingコマンドの場合にはbusybox_PINGをダウンロードして、pingに名前を変更します。そしてc:\sharebinに格納しておきます。 そして、以下のようにコンテナを起動。-vオプションをつけることで、ホスト側のc:\sharebinをコンテナの/sharebinにマウントしています。

PS > docker run -it -v /c/sharebin:/sharebin --name myubuntu ubuntu

そして以下のようにコンテナ側から実行すれば動作できます。

# ./sharebin/ping localhost

もうnet-toolsパッケージは時代遅れらしい…

最近のネットワークコマンドはiproute2パッケージを使うようです。(ipコマンドなどはこちらに入っています) そのため、以下の様にするほうが良さそうです。

# apt update
# apt install iputils-ping iproute2

iproute2パッケージにはipssbridgertacctrtmontcctstatlnstatnstatroutefroutelrtstattipcarpddevlinkが含まれています。

/* -----codeの行番号----- */