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
が含まれています。