はじめに
東京理科大学2年のyosukeです。
この記事は[東京理科大学AdventCalendar17日目の記事] (https://qiita.com/advent-calendar/2018/tokyo_university_of_science)です。
大変遅れてしまって申し訳ありません!!!!!!!!
学期末ということもあってレポートが大量に出ていたという理由で許してください。。。
普段は機械学習などをメインで勉強していますが、流行りものなので他にも書かれる方がたくさんいらっしゃるだろうと思ったので、今回は自分が最近(本当に最近)勉強しはじめたdockerについて書いていきたいと思います。特に、最初にイメージしづらかったコンテナのライフサイクルについて書いてきたいと思います。せっかくnginxコンテナを使っているので最後にちょろっとおまけをつけています。
めっちゃ初心者向けの記事になると思いますのでどうか温かい目で見守ってください。
環境
macOS Mojave version 10.14
Docker version 18.06.0-ce
Dockerとは
割愛
nginxコンテナの実行
nginxの実行についてはExposing external portを参照してください。(今回はrunコマンドは使いませんが例として一応載せておきます)
$docker run --name <コンテナ名> -d -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>
コンテナのライフサイクル
概略
ライフサイクルのイメージを図にしてみました。便宜上、imageとdeletedという状態を置いています。
ここで紹介するライフサイクルに関するコマンドのオプションなどについてはDockerドキュメントのコマンドラインリファレンスを参考にしてください。
コンテナのstatusを見たいので今回はrunコマンドは使わずにはじめます。あとで起動したnginxコンテナを使ってhtmlファイルを公開してみたいので$-v /some/content:/usr/share/nginx/html:ro
のオプションコマンドをつけておきます。
/some/content コンテナにマウントするホスト側のディレクトリ /usr/share/nginx/html マウント先のコンテナのディレクトリnginxコンテナじょうでこのディレクトリが公開対象のドキュメントルート ro リードオンリー 読み取り専用
Createdステータス
$docker create --name status-nginx -v /Users/yosuke/git/imagebuild/html:/usr/share/nginx/html:ro -p 8080:80 nginx
現在実行中のコマンドは$docker ps
で表示可能だけど、今はcreateしただけで動いていないので用事されない。動いてないものも全て表示するには以下の通り。
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e07fb245e575 nginx "nginx -g 'daemon of…" 13 seconds ago Created status-nginx
ここでSTATUS:Created
となっています。
Createdステータスはコンテナが作成されてスタートされるまでのものでcreate
コマンドで作成されます。
runningステータス
created状態のものをスタートするとrunnigになります。runコマンドはcreateとstartが同時に実行されていました。
$docker start status-nginx
status-nginx
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e07fb245e575 nginx "nginx -g 'daemon of…" 6 minutes ago Up 6 seconds 0.0.0.0:8080->80/tcp status-nginx
ここではSTATUS:Up 6 seconds
と表示されコンテナスタート後の経過時間が表示されています。
inspectコマンドで確認すればしっかりSTATUSが"running"となっています。
$docker inspect status-nginx
[
{
"Id": "e07fb245e57530b5ee0f1b065ccda51787af0c0f2ba3acb365c257df167041fe",
"Created": "2018-12-21T07:27:34.7446116Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
pausedステータス
コンテナが一時停止している状態を表します。この状態ではコンテナにリクエストを投げても応答しません。unpause
コマンドでpauseの状態を解除することができます。
$docker pause status-nginx
status-nginx
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e07fb245e575 nginx "nginx -g 'daemon of…" About an hour ago Up 42 minutes (Paused) 0.0.0.0:8080->80/tcp status-nginx
STATUSの部分がカッコ書きで(paused)となっています。inspectでみてみると"Status": "paused"となっています。
docker inspect status-nginx
[
{
"Id": "e07fb245e57530b5ee0f1b065ccda51787af0c0f2ba3acb365c257df167041fe",
"Created": "2018-12-21T07:27:34.7446116Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
"Status": "paused",
"Running": true,
"Paused": true,
"Restarting": false,
"OOMKilled": false,
unpause
コマンドでpaused状態の解除
$docker unpause status-nginx
status-nginx
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e07fb245e575 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp status-nginx
restartingステータス
docker restart
コマンドで再起動した時などにこのステータスになります。再起動はすぐに終了することが多いのでこのステータスをみることはあまりないと思います。
exsitedステータス
終了したコンテナが残り続けている状態。docker stop
コマンドで停止したコンテナもこのステータスになる。
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e07fb245e575 nginx "nginx -g 'daemon of…" About an hour ago Exited (0) 18 seconds ago status-nginx
docker start
で再びrunning状態にできます。
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e07fb245e575 nginx "nginx -g 'daemon of…" About an hour ago Up 7 seconds 0.0.0.0:8080->80/tcp status-nginx
removingステータス
削除中のコンテナのステータスを表します。これも先ほどのrestartingと同じように削除もさほど時間がかからないことが多いのでこのステータスをみることもあまりないかもしれません。ちなみに停止中のコンテナはdocker rm
コマンドで削除できますが起動中のコンテナは削除する前に停止させるか-f
オプションをつける必要があります。
deadステータス
正常に終了できずに残ってしまっているコンテナ状態を表します。どうやら消すしかないようです。
おまけ
さてここまでで、コンテナのライフサイクルを見てきましたが、せっかくなのでここで起動させていたコンテナを使ってみましょう。上にも書きましたが、実はcreateを実行する際にオプションでバインドマウントとポートマッピングの設定を行っていたのでバウンドするディレクトリ内にindex.htmlが作成してあればlocalhost:8080で確認することができます。