めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Dockerにおけるコンテナのライフサイクル

「docker run/stop/start/rm/commit」の各コマンドの役割を整理しておきます。全体像はこんな感じ。

前提環境はこちらです。

# cat /etc/redhat-release 
Fedora release 20 (Heisenbug)
# uname -a
Linux fedora20 3.14.6-200.fc20.x86_64 #1 SMP Sun Jun 8 01:21:56 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
# rpm -q docker-io
docker-io-1.0.0-1.fc20.x86_64

まず、「docker run」で新たなコンテナを起動します。「--name」オプションで名前「web01」を付けておきます。「docker ps」は起動中のコンテナを表示します。

# docker run -itd -p 8000:80 -p 2222:22 --name web01 enakai/httpd:ver1.0
d03d99291fbb752f43680c53b4c311052463edda08dec7676e9ed069b17b7760
# docker ps
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS              PORTS                                        NAMES
d03d99291fbb        enakai/httpd:ver1.0   /usr/local/bin/init.   4 seconds ago       Up 3 seconds        0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp   web01               

「docker stop」でコンテナを停止すると、コンテナ内のプロセスはすべて終了して、コンテナ自体は存在しなくなります。ただし、このコンテナに接続されていたディスクイメージはそのまま残っています。「docker ps -a」で停止中のコンテナ(つまり、ディスクイメージが残っているもの)が確認できます。

# docker stop web01
web01
# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS                               PORTS               NAMES
d03d99291fbb        enakai/httpd:ver1.0   /usr/local/bin/init.   2 minutes ago       Exited (-1) Less than a second ago                       web01               

停止中のコンテナは、「docker start」で、再度、起動できます。「docker run」で起動した時と同じオプションでコンテナを作っているようですが、保存してあったディスクイメージを再利用します。「docker restart」は「stop/start」と同じだと思います。

# docker start web01
web01
# docker ps
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS              PORTS                                        NAMES
d03d99291fbb        enakai/httpd:ver1.0   /usr/local/bin/init.   8 minutes ago       Up 7 seconds        0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp   web01               
# docker restart web01
web01
# docker ps
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS              PORTS                                        NAMES
d03d99291fbb        enakai/httpd:ver1.0   /usr/local/bin/init.   8 minutes ago       Up 28 seconds       0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp   web01               

「docker commit」でコンテナに接続中のディスクイメージを保存する際は、「docker stop」でプロセスを停止してからやるとよいでしょう。

# docker stop web01
web01
# docker commit web01 enakai/httpd:ver2.0
docke2835a821cdcdfaef8b4a48c30822b949b8654a566653e94b4a7af3ce274bc646

停止中のコンテナに対して、「docker rm」を実行すると、コンテナの情報が完全に削除されて、ディスクイメージも破棄されます。

# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS                      PORTS               NAMES
d03d99291fbb        enakai/httpd:ver1.0   /usr/local/bin/init.   11 minutes ago      Exited (-1) 2 seconds ago                       web01               
# docker rm web01
web01
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

「docker rm」で破棄せずにほっておくと、ディスクイメージが無駄に溜まっていくので注意しましょう。また、停止中のコンテナの名前を使って、新しいコンテナを起動しようとすると、当然ながらエラーになります。