前回は、hello-worldコンテナの動きを確認しました。今回は、コンテナの状態とdockerコマンドの対応についてまとめます。最初のうちは、用語が分かりづらいので、後に示す図を参照するとイメージが湧きやすくなると思います。
コンテナの状態と操作について
コンテナの状態とその状態における操作の観点を図に表してみます。コンテナには、大きくわけると3つの状態があります。その3つとは、
- イメージ・・・ コンテナを作成する前の雛形
- 実行中状態 ・・・コンテナを実行中状態
- 停止中状態 ・・・停止状態、実行結果(プロセスの終了コード)、ログなども保持
です。こちらの状態を切り替えるための操作(docker コマンド)が提供されています。
ここからは、図で示したそれぞれの操作について、もう少し詳しく見ていきましょう。
(1) イメージを取得する
コンテナを作成するためには、予めイメージを取得する必要があります。イメージは、Docker Hubに代表されるようなパブリックリポジトリと、Dockerエンジン自身の中にあるローカルリポジトリがあります。イメージの取得する際のコマンドを示します。
$ docker pull centos
このコマンドを実行することで、ローカルリポジトリへイメージを取得します。大きなイメージやっカスタムのイメージ作成などで何度も同一のイメージを利用する場合には、run
コマンドを実行前に実行しておくと、run
コマンドが早く実行されます。
(2) コンテナを実行する
コンテナを実行するには、下記のコマンドで実行します。
$ docker run -it --name run_test centos bash
このコマンドを実行した際は、(1)のように予め、イメージを取得した場合には、そのイメージからコンテナが作成されます。まだ、ローカルリポジトリにコンテナの元となるイメージが存在しない場合は、(1) イメージを取得するをDockerエンジンの中で自動に実行され、そのイメージを取得して、コンテナが実行されます。
オプションitについて
オプションとして指定したit
は、i
がキーボードの入力をコンテナの標準入力へリダイレクトし、t
は、コンテナの疑似端末をターミナルに紐付けるという意味です。このオプションによって、ターミナルからコマンドを入力して、コンテナ自身を操作できるようになります。
コンテナ名について
コンテナ名については、--name
の後に指定します。こちらは、省略可能です。下記のようなコマンドで確認してみると、NAMESの部分に先程つけた名前が表示されていることがわかると思います。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e32f130d5cde centos "bash" 8 minutes ago Up 8 minutes run_test
(3) コンテナを停止する
(2)で起動したコンテナを停止するには、別のターミナルから下記コマンドを実行します。
$ docker container stop run_test
こちらで、起動したコンテナが停止するはずです。run_test
の部分は、コンテナ名、コンテナIDのどちらでも可能です。
プロセスが暴走していて、stop
ではとめられない場合には、kill
を利用します。
$ docker container kill run_test
プロセスをkillするコマンドになります。run_test
の部分は、コンテナ名、コンテナIDのどちらでも可能です。
(4) コンテナを開始する
(3)で停止したコンテナを再度起動します。下記コマンドを実行します。
docker start -i run_test
このコマンドでコンテナが再度起動すると思います。run_test
の部分は、コンテナ名、コンテナIDのどちらでも可能です。
(5) コンテナの中身を確認する
コンテナの状態とログの取得は、よく利用するので紹介します。まずは、プロセスを確認する方法です。
プロセスを確認する
$ docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e32f130d5cde centos "bash" 30 minutes ago Exited (0) 2 seconds ago run_test
オプションaについて
停止状態のものも表示するためのオプションになります。run_testというコンテナは、すでに停止していたため、STATUSにExited(0)、正常終了したと表示されています。
ログを確認する
ログの確認は下記のコマンドを実行します。
$ docker container logs run_test
オプションfについて
実行中にリアルタイムにログを監視する場合には、fオプションを利用します。
(6) イメージを更新する
イメージを更新するには、以下のようにします。
$ docker container commit run_test centos:httpd
run_test
の部分は、コンテナ名[コンテナID」、centos:httpd
の部分は、リポジトリ名:タグ名となっています。
実際に確認してみると下記のように新しいタグ名のものが追加されます。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 7e749923ae3b 2 minutes ago 255MB
centos latest 831691599b88 4 weeks ago 215MB
(7) イメージを更新、公開する
イメージを更新、公開するには、以下のようにします。こちらは、公開するリポジトリによっても少し違うので注意が必要です。
$ docker push アカウント名/リポジトリ名:タグ名
docker image tag
コマンドで<アカウント名><リポジトリ名>:<タグ名>
というタグを付加します。docker commit
コマンドで作成したイメージIDにタグをつけます。今回の例だと、831691599b88
です。
(8) コンテナを削除する
要らなくなったコンテナを削除します。
$ docker container rm run_test
run_test
の部分は、コンテナ名[コンテナID」を指定します。
実行中のコンテナも含めて、全部一気に削除したい場合には、下記のコマンドを実行します。
$ docker container prune -f
(9) イメージを実行する
要らなくなったイメージを削除します。
$ docker image rm centos
全部一気に削除したい場合には、下記のコマンドを実行します。
$ docker image prune -a
まとめ
今回は、駆け足ではありますが主要なdockerコマンドとコンテナの状態という観点でまとめました。ここで紹介出来なかったdockerコマンドは、docker docs(https://docs.docker.com/engine/reference/commandline/cli/)などを参照してください。次回は、Dockerfileというファイルを利用したカスタムイメージの生成の仕方について紹介しようと思います。