コンテナの起動と管理
コンテナの基本操作は、起動する・一覧する・止める、の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 に読み替えても同じように動くので、ここで覚えた操作はそのまま応用が利く。