Docker に関するコマンド逆引き集です。公式ページの「Reference documentation」情報をもとにしています。
後述のイメージという型をもとに作られる実体です。例えるならば、オブジェクト指向プログラミングにおけるクラスが Docker イメージで、インスタンスが Docker コンテナです。あるイメージをもとにして複数のコンテナが作成され得ります。コンテナには containerId が自動で付与されます。containerId は英数字の羅列であり人間にとって分かり良いものではありません。そこで利便性のためにコンテナ名も付与できます。明示的に付与しない場合は適当な名前が自動で付与されます。containerId はもちろん一意ですが、コンテナ名も一意である必要があります。
前述のコンテナという実体を作成するための型です。繰り返しになりますが、例えるならばオブジェクト指向プログラミングにおけるクラスが Docker イメージで、インスタンスが Docker コンテナです。イメージには imageId が自動で付与されます。imageId は英数字の羅列であり人間にとって分かり良いものではありません。そこで利便性のために、ある imageId のイメージには任意の個数のタグが付与できます。タグ名はコンテナ名と異なり自動で付与されることはありません。イメージは後述のレポジトリに格納されます。imageId はレポジトリ間全体で一意です。タグ名は若干制約が緩く、あるレポジトリ内で一意であれば設定可能です。
あるレポジトリには複数のバージョンのイメージ (v10, v11,...) が格納され得ります。以上のことから言える事実として「レポジトリ名:タグ名」とすればイメージが一意に定まります。もちろん「imageId」だけでも一意に定まります。あるレポジトリ内の最新のイメージには latest タグが自動で付与されます。「レポジトリ名」とだけしたときは「レポジトリ名:latest」として処理されます。レポジトリ名には「ubuntu」といった base image や root image とよばれるものと、「training/webapp」といった user image の二種類があります。
オプション -i (--interactive) および -t (--tty) を付与して起動するのがポイントです。
$ docker run -it レポジトリ名:タグ名 /bin/bash ←例 centos:centos6
シェル内で exit したらコンテナを自動で削除するためには --rm オプションも追加しておきます。オプション -d とは併用できません。
$ docker run --rm -it レポジトリ名:タグ名 /bin/bash
起動中のコンテナ一覧を表示します。
$ docker ps
停止中のものも含めてすべてのコンテナ一覧を表示するためにはオプション -a (--all) を付与します。
$ docker ps -a
停止中のものを含むすべてのコンテナの中で最後に作成したものを表示するためにはオプション -l (--latest) を付与します。
$ docker ps -l
containerId だけを表示するためにはオプション -q (--quiet) を付与します。
$ docker ps -q
長いコマンドなどを省略せずにすべて表示するためにはオプション --no-trunc を付与します。
$ docker ps --no-trunc
ホストに格納されているイメージの一覧は以下のコマンドで確認できます。
$ docker images
history によってイメージが作成される過程における RUN, ADD, CMD などの発行履歴を表示できます。
$ docker history レポジトリ名:タグ名
for i in $(docker images -q); do
docker history $i | grep -q xxxxxxxx && echo $i
done | sort -u
コンテナを停止するには以下のようにします。
$ docker stop コンテナ名
最後に作成されたコンテナを stop したのであれば、以下のコマンド latest オプションで何も表示されないことをもって停止されたと確認できます。
$ docker ps -l
コンテナの起動には start を利用します。
$ docker start コンテナ名
コンテナの再起動も可能です。
$ docker restart コンテナ名
何らかの原因で stop できないコンテナに対しては kill を実行できます。
$ docker kill コンテナ名
オプション --name を使用します。
$ docker run -d -P --name コンテナ名 レポジトリ名:タグ名 コマンド
ある containerId のコンテナ名は docker ps や以下のコマンドで確認します。
$ docker inspect -f "{{ .Name }}" containerId
後からコンテナ名を変更することもできます。
$ docker rename 旧コンテナ名 新コンテナ名
オプション -d (--detach) で起動したコンテナの COMMAND はバックグラウンドで実行されます。
$ docker run -d -it centos:centos6 /bin/bash
docker start で起動したコンテナの COMMAND もバックグラウンドで実行されます。
host$ docker run -it centos:centos6 /bin/bash
container$ exit
host$ docker start containerId
バックグラウンドで実行中のコンテナ COMMAND をフォアグラウンドに変更するためには attach を利用します。コンテナを作成した際に指定した COMMAND である /bin/bash がフォアグラウンドに戻ります。
$ docker attach containerId
この方法はコンテナを作成した際に指定した COMMAND を変更するものではないことに注意してください。
$ docker run -d centos:centos6 top -b
$ docker attach containerId
例えば上記方法で attach したとしても依然として top -b が実行された状態です。/bin/bash に変更することはできません。
イメージには COMMAND が一つだけ指定できます。例えば Dockerfile の CMD に指定されたコマンドは、その Dockerfile でビルドされたイメージの COMMAND になります。
Dockerfile
FROM centos:centos6
CMD top -b
イメージに COMMAND が設定されている場合、その COMMAND はイメージで作成されるコンテナの COMMAND になります。
$ docker build -t username/top .
$ docker run -d username/top
コンテナの COMMAND は ps によって確認できます。
$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED ...
f1237583f707 username/top:latest "/bin/sh -c 'top -b' 6 seconds ago ...
ただし、イメージに設定された COMMAND は必ずしもコンテナの COMMAND にはなりません。run または create によってコンテナを作成する時に引数として指定したもので上書くことができるためです。
$ docker run -d username/top ping www.yahoo.co.jp
$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED ...
d8be9e3e36c3 username/top:latest "ping www.yahoo.co.j 3 seconds ago ...
逆に、イメージに COMMAND が設定されていない場合は run または create によってコンテナを作成する時に引数として COMMAND を指定しなければエラーになります。
$ docker run -d centos:centos6
FATA[0000] Error response from daemon: No command specified
exec を使用することで、起動中のコンテナに追加の COMMAND を発行できます。
バックグラウンドでコマンドを発行
$ docker exec -d コンテナ名 touch hello.txt
フォアグラウンドでコマンドを発行
$ docker exec コンテナ名 touch hello.txt
/bin/bash コマンドを発行
$ docker exec -it コンテナ名 /bin/bash ←SSH ではなく直接ログイン
特に最後の例は重要です。コンテナ内に sshd を立てるようなことは避けてください。コンテナには必要最小限のリソースのみを含めるべきだからです。
コンテナがどの程度ホストのリソースを消費しているかを調査するためには stats を利用します。
$ docker stats コンテナ名, コンテナ名,...
コンテナ内のプロセス一覧を表示するためには top を利用します。
$ docker top コンテナ名
logs を利用するとコンテナ COMMAND がターミナルに出力する内容を表示することができます。
$ docker logs コンテナ名
Unix におけるテクニックの一つ tail -f のように監視出力するためには以下のようにします。
$ docker logs -f コンテナ名
コンテナの状態を知るための汎用コマンド docker ps でも取得できますが、特にポートマッピングの情報だけを取得したい場合は以下のようにします。
$ docker port コンテナ名 コンテナ内のポート番号
コンテナ内の各種情報を json で出力するためには inspect を利用します。オプション -f で情報のフィルタリングが可能です。
$ docker inspect コンテナ名
$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' コンテナ名
コンテナ数やイメージ数、それらを格納しているホストのディレクトリ情報などを表示します。
$ docker info
ホストの Docker デーモンにレポートされるコンテナおよびイメージのイベントを監視するためには以下のコマンドを実行します。
$ docker events
過去のある時刻からさかのぼって表示するためには --since を利用します。引数は UNIX 時間です。
$ docker events --since=0
事故防止のため running 状態のコンテナは削除できません。事前に stop しておく必要があります。
$ docker stop コンテナ名
$ docker rm コンテナ名
オプション -f (--force) を付与すれば running 状態であっても削除できます。
$ docker rm -f コンテナ名
$ docker rmi レポジトリ名:タグ名
イメージは必要なときになければ自動でダウンロードされます。しかしながら事前にダウンロードするためには以下のようにします。まず以下のコマンドで検索します。
$ docker search 検索ワード
以下のコマンドで実際にダウンロードします。用語集に記載したようにレポジトリには様々なバージョンのイメージが格納されています。タグ名を省略すると latest タグの付与されたイメージが取得されます。
$ docker pull レポジトリ名:タグ名
$ docker tag imageId レポジトリ名:新タグ名
コンテナに施された各種変更をコミットして新しいイメージを作成するためには commit を使用します。これは実験的にいろいろなことを試す用途で使用します。
host$ docker run -it レポジトリ名:タグ名 /bin/bash
container$ コンテナ内でいろいろなコマンドを実行 && exit
host$ docker commit -m "メッセージ" -a "AUTHOR" containerId レポジトリ名:タグ名
最後にコミットした Author
を確認
docker inspect -f "{{ .Author }}" レポジトリ名:タグ名
作成された時刻を知る
docker inspect -f '{{ .Created }}' イメージID
本番環境で動作させるコンテナのイメージを用意する目的としては commit ではなく Dockerfile からビルドして作成したイメージを利用します。カレントディレクトリ '.' 内に Dockerfile が存在する場合は以下のコマンドでビルドします。
$ docker build -t レポジトリ名:タグ名 .
作成したイメージは Docker Hub にアップロードします。
$ docker push レポジトリ名:タグ名
diff はファイルシステムの変更状態を確認するコマンドです。commit の際に意図しない変更が含まれていないか確認できます。
$ docker diff コンテナ名
コンテナ内サービスが LISTEN しているポート番号すべてについて、ホストの任意のインタフェースから転送するためには以下のように -P オプションを使用します。これは loopback interface (いわゆる localhost 127.0.0.1 が割り当てられているインタフェース) を含みます。
$ docker run -d -P レポジトリ名:タグ名 コマンド
マッピングするポート番号を明示的に指定するためには -p オプションを使用します。複数のポートをマッピングするためにはオプション -p を複数回指定します。
$ docker run -d -p ホストのポート番号:コンテナ内サービスがLISTENするポート番号 レポジトリ名:タグ名 コマンド
ホストの特定のインタフェースにだけポートを bind することもできます。例えば上述の loopback interface にだけ bind するためには以下のようにします。
$ docker run -d -p 127.0.0.1:ホストのポート番号:コンテナ内サービスがLISTENするポート番号 レポジトリ名:タグ名 コマンド
コンテナ内サービスが UDP ポートを LISTEN している場合には /udp を付与します。
$ docker run -d -p ホストのポート番号:コンテナ内サービスがLISTENするポート番号/udp レポジトリ名:タグ名 コマンド
各コンテナは内部的なネットワークに所属しており、そのネットワークにおける IP が割り当てられています。この IP は docker inspect で調査できます。
$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' コンテナ名
オプション --link によってコンテナ間の通信路を確保できます。
$ docker run -d --name コンテナ名1 レポジトリ名:タグ名 コマンド
$ docker run -d --name コンテナ名2 --link コンテナ名1:エイリアス名 レポジトリ名:タグ名 コマンド
JSON の出力情報をフィルタリングすることで確認できます。
$ docker inspect -f "{{ .HostConfig.Links }}" コンテナ名2
リンクオプション --link を付与して起動したコンテナ内では特殊な環境変数が利用できるようになります。また、環境変数に加えて /etc/hosts にリンク先のコンテナの DNS 情報が追記されます。リンク先のコンテナを再起動するなどして IP が更新されると環境変数はそのままですが /etc/hosts は自動更新されます。名前解決のためには環境変数ではなく /etc/hosts を利用することが推奨されています。
docker network ls
docker network create --subnet=172.18.0.0/16 mynetwork
docker network rm mynetwork
独自に作成したネットワークでは固定 IP を指定できます。
docker run --net mynetwork --ip 172.18.0.101 --entrypoint /bin/bash --rm イメージID -c "ip a"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:65 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.101/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
cp によってコンテナ内のディレクトリまたはファイルをホスト側にコピーできます。
$ docker cp コンテナ名:ファイルまたはディレクトリのパス情報 ホストのパス情報
ファイルシステム毎バックアップするためには export を利用します。
$ docker export コンテナ名 > backup.tar
$ gzip backup.tar
後述の data volume は export の対象外となることに注意してください。復旧時に利用するためには以下のようにまずイメージを新規に作成します。
$ cat backup.tar.gz | docker import - レポジトリ名:タグ名
これを利用して作成されるコンテナにはバックアップ時のファイル一式がすべて含まれています。
$ docker run -it レポジトリ名:タグ名 /bin/bash
ただし、イメージとしては新規作成となるためタグ情報や docker history で確認できる履歴は失われます。イメージの共有を目的とする場合は export/import ではなく、イメージをビルドしてから後述の save/load を利用してください。
Docker イメージの差分を確認するためには以下のようにできます。
docker run --name c1 -d --rm --entrypoint="" xxxxx tail -f /dev/null
docker run --name c2 -d --rm --entrypoint="" yyyyy tail -f /dev/null
mkdir c1
docker export c1 | tar -C c1 -xvf -
mkdir c2
docker export c2 | tar -C c2 -xvf -
diff -ur c1 c2