Help us understand the problem. What is going on with this article?

Docker--Nginxコンテナで見るコンテナのライフサイクル

はじめに

東京理科大学2年のyosukeです。
この記事は東京理科大学AdventCalendar17日目の記事です。
大変遅れてしまって申し訳ありません!!!!!!!!
学期末ということもあってレポートが大量に出ていたという理由で許してください。。。

普段は機械学習などをメインで勉強していますが、流行りものなので他にも書かれる方がたくさんいらっしゃるだろうと思ったので、今回は自分が最近(本当に最近)勉強しはじめた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 <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>

コンテナのライフサイクル

概略

docker_life-cycle.001.jpeg    
ライフサイクルのイメージを図にしてみました。便宜上、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で確認することができます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした