
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
インストールすれば、ping、arp、ifconfig、netstartなどが使用可能になります。
おわりに
dockerコンテナを使っていてpingが使えなかったという件でした。また、同じこと言い出しそうだったので、未来の自分に向けての内容でした。
ちなみに
IPアドレスの表示
ifconfigコマンドやipコマンドがないときにIPアドレスが知りたいときどうするか困っていたのですが、hostname -iで表示されますね。ブランクがあったので、結構忘れてました。
コンテナの肥大化を防ぐには?
ツイッターでpingないよーって書いたら以下のように教えてもらいました。
単なる動作確認なら、静的リンクされたコマンドをホスト共有する方がイメージが太りません
— You&I (@you_and_i) 2022年5月4日
busybox https://t.co/vtx96rKReh
ということです。動的なライブラリのリンクではなく、静的なリンクで作成されたバイナリになるので導入しても、コンテナの肥大化を防げるみたいです。
これを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パッケージにはip、ss、bridge、rtacct、rtmon、tc、ctstat、lnstat、nstat、routef、routel、rtstat、tipc、arpd、devlinkが含まれています。