読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

docker inspectでDockerコンテナの情報を取得する

dockerコマンドにはinspectコマンドというのがあって、コンテナやイメージの様々な情報を取得できる。今回はこのコマンドについていろいろ触ったので、メモを書いておく。

簡単な使い方

基本的には

$ docker inspect (コンテナID)

と使う

$ docker inspect 2a5624c52119
[{
    "ID": "2a5624c5211981af1ddc1b43916176778f92665ec13f64346456ab24ddfef9b2",
    "Created": "2013-12-28T05:03:32.821608786Z",
    "Path": "/bin/sh",
    "Args": [
        "-c",
        "while true; do echo hello world; sleep 1; done"
    ],
    "Config": {
        "Hostname": "2a5624c52119",
# ...

format

さらに-formatでformat指定して取得もできる。あるコンテナのIPを取得してみる。

$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119
172.17.0.24

このformatはtemplate - The Go Programming Languageの構文が使えるみたい。

いろいろやってみた

いろいろ構文あったので、試しにやってみた。

IPアドレス取得

変数には.を使ってアクセスできるっぽい。上にも書いたけどもう一回。

$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119
172.17.0.24

あるコンテナに設定されている環境変数取得

range使えばfor文みたいなのできる。

$ docker inspect -format='{{range .Config.Env}}{{println .}}{{end}}' c3fa3ce1622b
HOME=/
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

22番portの空いているコンテナのforwardingされたport一覧取得

とたんに難しくなりますが、現在立ち上がっているコンテナの中で22番portが空いている場合の、port forwarding先port番号の表示です。

$ docker ps -q | xargs docker inspect -format='{{ if index .NetworkSettings.Ports "22/tcp" }}{{(index (index .NetworkSettings.Ports "22/tcp") 0).HostPort}}{{ end }}' | sed '/^$/d'
49156
49155
49154
49153
  • docker ps -qでCONTAINER ID取得
  • if endで条件分岐
    • indexで.NetworkSettings.Ports['22/tcp']を取得
    • 存在したら分岐に入る
  • xargsでしたので、空行をsedで削除

特定のイメージ名で動いているIP一覧を表示

ubuntuで動いているイメージのIP一覧を取ってみます。

$ docker ps -q | xargs docker inspect -format='{{ if eq .Config.Image "ubuntu" }}{{ .NetworkSettings.IPAddress }}{{ end }}' | sed  '/^$/d'
172.17.0.24
172.17.0.23

注意点はif .Config.Image == "ubuntu"と書けないところですね...

まとめ

とりあえずdocker inspectを使って色々やってみました。これを使うとコンテナを立ちあげて、その情報を取得して、それに対して何かを実行するというのをシェルスクリプトでも結構簡単に出来ます。とはいえsyntaxが結構難しいので、やり過ぎ注意というイメージを受けました。