コンテナの起動と管理
コンテナの基本操作は、起動する・一覧する・止める、の3つです。docker run でイメージからコンテナを起動し、-d を付ければバックグラウンドで動かせます。docker ps で稼働中のコンテナを確認でき、-a を付けると停止済みも含めて表示します。不要になったら docker stop で止め、docker rm で削除します。各コンテナにはコンテナIDと名前が付き、操作の際の宛先になります。
イメージとコンテナの違いがつかめたら、次は実際にコンテナを動かしてみます。日々の操作は煎じ詰めると「起動する・一覧する・止める・消す」の4つに集約され、それぞれに対応するコマンドが用意されています。この4つの往復が、コンテナ運用のいちばん土台になるリズムです。どの操作も、実行のたびに docker ps で状態を確かめることをセットにすると、何が起きたのかが目で追えて理解が早くなります。ここではまず素の docker(または互換の podman)コマンドで、コンテナのライフサイクルを一通りたどってみましょう。
起動する docker run
コンテナを起動する基本コマンドが docker run です。書式は docker run イメージ名 で、たとえば docker run hello-world と打つと、動作確認用の小さなイメージからコンテナが起動します。このとき、もし指定したイメージがローカルに無ければ、docker は自動でレジストリから取得(pull)してから起動するので、初回だけ少し時間がかかり、2回目以降は一瞬で立ち上がります。Webサーバのように起動しっぱなしにしたいコンテナは、-d オプション(detach、バックグラウンド実行)を付けて docker run -d nginx のように起動します。-d を付けると画面が占有されず、プロンプトがすぐ戻ってきます。
起動時によく使うオプションを覚えておくと操作が楽になります。--name web のように名前を付けておくと、後の操作でこの分かりやすい名前を宛先に使えます(付けないと eager_morse のようなランダムな名前が自動で割り振られます)。コンテナの中に入って対話的に操作したいときは -it を付け、docker run -it ubuntu bash のようにシェルを指定すると、そのコンテナの中の bash にそのまま入れます。-i は入力を受け付ける(interactive)、-t は端末をつなぐ(tty)の意味で、2つセットで -it と覚えてかまいません。このときプロンプトが root@(コンテナID) に変わり、exit で抜けるとそのコンテナは停止します。
一覧する docker ps
いま動いているコンテナを確認するのが docker ps です。引数なしの docker ps は稼働中のコンテナだけを表示し、CONTAINER ID・IMAGE・COMMAND・STATUS・NAMES といった列が並びます。ここで覚えておきたい落とし穴が、「起動したはずのコンテナが docker ps に出てこない」というケースです。これはたいてい、そのコンテナが既に停止しているために、稼働中だけを映す docker ps の一覧から外れているだけです。停止済みのものまで含めて全部見たいときは -a(all)を付けて docker ps -a とします。さきほど exit した ubuntu のコンテナが Exited (0) という STATUS で残っているのが、この一覧で確認できます。STATUS 列が Up なら稼働中、Exited なら停止済み、と読み分けます。
止める・消す docker stop と docker rm
コンテナはコンテナID(の先頭数文字)か、付けた名前のどちらでも指定して操作できます。稼働中のコンテナを止めるには docker stop web のように docker stop を使い、止めたコンテナ(箱)を削除するには docker rm web のように docker rm を使います。ここで大事な順序があり、稼働中のコンテナはそのままでは docker rm できません。まず docker stop で止めてから docker rm で消す、という2段階が基本です。「止める前に消そうとしてエラーになる」のはよくある失敗なので、stop してから rm、と手順で覚えておきましょう。急いでいて一度に済ませたいときは docker rm -f web のように -f(force)を付けると、動いていても強制的に止めて削除できます。
なお、ここで消えるのはコンテナ(実体)であって、もとのイメージ(雛形)ではありません。イメージのほうを削除したいときは別コマンドの docker rmi イメージ名 を使います。docker rm(コンテナを消す)と docker rmi(イメージを消す)は名前が似ていて混同しやすいので、対象が違うことをはっきり意識してください。なお、そのイメージを使っているコンテナが残っていると docker rmi は「使用中で消せない」と断られるので、先にコンテナ側を片付けます。
ひとつの流れとして通してみる
ここまでを1本の流れにすると、コンテナのライフサイクルが体感できます。たとえば docker run -d --name web nginx で nginx を名前付き・バックグラウンドで起動し、docker ps で Up になっていることを確認し、用が済んだら docker stop web で止め、docker ps -a で Exited に変わったのを見て、最後に docker rm web で削除する——という一連です。起動した実体は使い終わったら止めて消す、必要ならまた同じイメージから起動し直す、という発想が身につくと、コンテナを「使い捨ての実行環境」として気軽に扱えるようになります。
実務の使いどころ
実務では、コンテナを長く生かし続けるよりも、作っては消し、また作る、という回し方をすることが多くなります。設定を変えたいときは、動いているコンテナを直接いじるのではなく、一度消してオプションを変えて起動し直すほうが、状態が予測しやすく事故が減ります。動作確認のために ubuntu や alpine のような軽いイメージを -it で起動し、中を調べて exit、確認が済んだら docker rm で片付ける、といった使い方は日常的です。停止済みのコンテナは消さない限りディスクに残り続けるため、docker ps -a で定期的に棚卸しして、不要なものを docker rm で掃除する習慣をつけておくと、環境を清潔に保てます。これらのコマンドはそのまま podman に読み替えても同じように動くので、ここで覚えた操作はそのまま応用が利きます。