Docker 基本コマンド
Docker を使い始めた頃、いちばんよくある戸惑いは概念ではなく、「この操作、結局どのコマンドを打てばいいのか」というものです。この記事では日常で最も使用頻度の高い基本コマンドを整理し、それぞれに書式と例を付けました。手元でさっと参照できるようにしています。
個々のコマンドを見る前に、まず一つ整理しておきましょう。イメージ(image)とコンテナ(container)は別物です。イメージは読み取り専用のテンプレートで、プログラムの実行に必要なファイルシステムと設定を含みます。一方コンテナはイメージの実行インスタンスで、イメージの上に書き込み可能なレイヤーを 1 枚重ねたものです。同じイメージから、互いに干渉しない複数のコンテナを起動できます。以下のコマンドは基本的にこの 2 つのオブジェクトを軸に展開されます。イメージを操作するもの(pull、images、rmi)と、コンテナを操作するもの(run、ps、rm、kill、restart、start、exec)があり、対象を区別すればコマンドを混同しにくくなります。
また、Docker デーモンはデフォルトで root 権限で動作するため、一般ユーザーが docker コマンドを実行するには sudo を付ける必要があります(またはユーザーを docker グループに追加します)。そのため以下の例の多くには sudo が付いています。
ヘルプ
docker -h
コマンドやオプションを忘れたら、まずヘルプを見ましょう。個別のサブコマンドのヘルプも確認できます。たとえば docker run --help を実行すると、そのサブコマンドがサポートするすべてのオプションが一覧表示されます。
イメージの取得
# 書式:NAME はイメージ名、TAG はバージョンタグ
sudo docker pull NAME[:TAG]
# 例:centos の latest タグを取得
sudo docker pull centos:latest
pull はイメージレジストリ(デフォルトは Docker Hub)からイメージをローカルにダウンロードします。TAG を書かない場合、デフォルトで latest を取得します。イメージはレイヤーごとに保存されており、取得時には各レイヤーそれぞれのダウンロード進捗が表示されます。すでにローカルに存在するレイヤーはそのまま再利用され、重複してダウンロードされることはありません。
Container の起動
# 書式
sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 例:イメージから対話型コンテナを起動(原文のイメージ名は contos だが、正しくは centos)
sudo docker run -t -i contos /bin/bash
run がやっていることは実は 2 段階です。まずイメージから新しいコンテナを作成し、それから起動します。よく使うオプションをいくつか挙げます。
1)-i:標準入力を開いたままにし、コンテナに入力を送れるようにする;
2)-t:疑似ターミナルを割り当てる。-i と組み合わせることで対話可能なシェルが得られる;
3)イメージ名の後に続く /bin/bash は、コンテナ起動後に実行されるコマンドです。このコマンドが終了すると、コンテナも停止します。
ローカルに該当イメージがない場合、run は先に自動で pull を 1 回実行します。
イメージ一覧の確認
ローカルのすべての images を一覧表示します。
# 書式
sudo docker images [OPTIONS] [NAME]
# 例:centos 関連のイメージだけを見る
sudo docker images centos
出力にはイメージのリポジトリ名、タグ、イメージ ID、作成日時、サイズが表示されます。後でイメージを削除するときに使うのは、ここに表示される名前または ID です。
コンテナ一覧の確認
これまでに作成したすべての container を確認できます。
# 書式
docker ps [OPTIONS]
# 例:-a で停止中のものも含むすべてのコンテナを一覧表示
sudo docker ps -a
docker ps はデフォルトで実行中のコンテナしか表示しないことに注意してください。終了した直後のコンテナは ps では見えないため、コンテナが「消えた」と勘違いしやすいのですが、-a を付ければ全部見えます。出力の CONTAINER ID と NAMES はどちらも、以降のコマンドでコンテナを指定するのに使えます。
イメージの削除
ダウンロード済みのイメージをローカルから削除します。
# 書式:一度に複数削除できる
sudo docker rmi IMAGE [IMAGE...]
# 例
sudo docker rmi centos:latest
そのイメージから作成されたコンテナが(たとえ停止状態でも)残っている場合、rmi はエラーを出して削除を拒否します。先に関連コンテナを rm で削除する必要があります。
コンテナインスタンスの削除
1 つまたは複数のコンテナインスタンスを削除します。
# 書式
sudo docker rm [OPTIONS] CONTAINER [CONTAINER...]
すべての実行中コンテナを削除します。
# 原文の書き方は以下のとおり。実際に使うときは中のコマンドを $() またはバッククォートでコマンド置換すること:
# sudo docker rm $(sudo docker ps -aq)
sudo docker rm sudo docker ps -aq
ここで docker ps -aq の -q はコンテナ ID のみを出力するという意味で、これを docker rm の引数として渡すことで一括削除を実現しています。実行中のコンテナはそのまま rm できません。先に停止するか、-f を付けて強制削除します。
実行中のコンテナを停止する
# 書式
sudo docker kill [OPTIONS] CONTAINER [CONTAINNER...]
# 例:コンテナ ID は一意に特定できれば先頭数文字だけで OK
sudo docker kill 026e
kill はデフォルトでコンテナ内のメインプロセスに SIGKILL を送るため、プロセスは即座に強制終了され、後始末の機会がありません。プログラムにグレースフルに終了する機会を与えたいなら docker stop の方が適切です。stop は先に SIGTERM を送り、一定時間待ってから SIGKILL を送ります。
実行中のコンテナを再起動する
# 書式
sudo docker restart [OPTIONS] contains[CONTAINER]
# 例
sudo docker restart 026e
restart は停止してから起動するのと同等で、コンテナの書き込み可能レイヤーのデータはそのまま保持されます。
停止済みのコンテナを起動する
# 書式
sudo docker start [OPTIONS] CONTAINER [CONTAINER..]
# 例
sudo docker start 026e
start と run の違いに注意してください。run は新しいコンテナを作成しますが、start はすでに存在する停止中のコンテナを再び立ち上げるだけで、それまでにコンテナ内で行った変更はすべて残っています。
指定したコンテナに入る
docker exec -it <コンテナ名または ID> /bin/bash
exec は実行中のコンテナの中で追加のプロセスを起動します。ここではもう一つ bash を開いています。attach よりもこちらの方がよく使われます。exec で入ったシェルで exit しても、新しく開いたプロセスが終了するだけで、コンテナ本体の実行には影響しません。
ハマりどころと注意点
1)イメージ ID とコンテナ ID を混同しない。rmi はイメージ削除、rm はコンテナ削除です。引数を間違えると「該当オブジェクトが存在しない」というエラーになります。
2)コンテナの停止は削除ではない。停止したコンテナは名前とディスク上の書き込み可能レイヤーを占有し続けます。新しいコンテナが同じ名前を使うと作成に失敗するので、先に古いものを rm する必要があります。
3)kill より stop を優先する。プロセスがハングして応答しない場合を除き、アプリケーションに SIGTERM を受けて後始末する機会を与えましょう。
4)コンテナ内のデータは揮発性。コンテナを rm すると、書き込み可能レイヤーのデータも一緒に消えます。重要なデータはデータボリュームでホストマシンにマウントすべきです。
まとめ
この一連のコマンドは Docker の最小のワークフローをカバーしています。pull でイメージを取得し、run でコンテナを起動し、images / ps で状態を確認し、start / stop(kill)/ restart でライフサイクルを制御し、exec でコンテナに入って問題を調査し、最後に rm / rmi でコンテナとイメージを片付ける。「イメージはテンプレート、コンテナはインスタンス」という軸さえ押さえれば、あとは慣れの問題です。
COMMENTS