初めてサービスを実行する

DockerBeginner
オンラインで実践に進む

はじめに

現代のソフトウェア開発では、コンテナはアプリケーションをパッケージ化してデプロイする一般的な方法になっています。コンテナは完全な仮想マシンではありません。ホストのカーネルを共有しながら、独自のファイルシステムビューとネットワーク設定を持つ、分離されたプロセス環境でアプリケーションを実行します。

この実験では、実際のアプリケーションである Nginx Web サーバーを実行して、Docker の基本を学びます。多くのコンテナは一度だけ実行するコマンドではなく、長時間稼働するサービスとして動作するため、コンテナのライフサイクルを理解することが重要です。

これは、hello-world の例からの重要なステップアップです。起動してメッセージを表示した後に終了するコンテナではなく、メインプロセスが実行されている間、稼働し続けるサービスコンテナを扱います。

この実験では、次の操作を学びます。

  • コンテナをバックグラウンド(デタッチモード)で起動する。
  • 実行中のコンテナの状態を確認する。
  • 作業が終わったらコンテナを停止する。
  • コンテナを削除してシステムリソースを解放する。

この実験を終えると、Docker コンテナの完全なライフサイクルである、作成、実行、停止、削除を理解できるようになります。

Web サーバーをバックグラウンドで実行する

このステップでは、Nginx Web サーバーを起動します。

ターミナルでコマンドを実行すると、通常はコマンドが終了するまで画面を占有します。しかし、Web サーバーのようなサービスは、ターミナルをほかの作業に使えるように、バックグラウンドで継続的に実行したい場合があります。Docker では、これを「デタッチモード」と呼びます。

-d フラグを使うと、コンテナをデタッチモードで実行できます。また、--name フラグを使って、コンテナに覚えやすい名前を付けます。

デタッチモードにしても、コンテナが実行する処理は変わりません。変わるのは、ターミナルがコンテナに接続される方法です。サービスは実行を続け、シェルのプロンプトはすぐに戻ります。

my-nginx という名前の Nginx コンテナを起動するには、次のコマンドを実行します。

docker run --name my-nginx -d nginx

コマンドの内訳:

  • docker run: 新しいコンテナを作成して起動するコマンドです。
  • --name my-nginx: コンテナに my-nginx という名前を割り当てます。このオプションを省略すると、Docker は happy_hopper のようなランダムな名前を割り当てます。
  • -d: コンテナを デタッチ モード(バックグラウンド)で実行します。
  • nginx: 使用するイメージです。Docker はまずローカルにイメージがあるか確認し、なければ Docker Hub からダウンロードします。

出力:

ターミナルに長い文字列が表示されます。これは コンテナ ID です。コマンドプロンプトがすぐに戻れば、コンテナがバックグラウンドで実行されていることを確認できます。

コンテナ ID は Docker 内部で使う識別子で、コンテナ名は人が扱いやすいラベルです。日常の作業では、長い ID よりも名前のほうが使いやすいことがよくあります。

コンテナの状態を確認する

コンテナを起動したら、期待どおりに実行されていることを確認します。docker ps コマンドを使うと、実行中のコンテナを一覧表示できます。

次のコマンドを実行します。

docker ps

次のような出力が表示されます。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   80/tcp     my-nginx

出力の見方:

  • CONTAINER ID: このコンテナ固有の ID です。先ほど表示された長い文字列を短縮したものです。
  • IMAGE: 実行中のイメージです(nginx)。
  • STATUS: Up は、コンテナが正常に実行されていることを示します。
  • NAMES: 割り当てた名前です(my-nginx)。

このエントリが表示されれば、Web サーバーはバックグラウンドで正常に実行されています。

docker ps の出力は、運用時に主に確認する情報の一つです。現在アクティブなコンテナ、使用元のイメージ、実行時間を確認できます。

サービスを停止する

サービスの使用を終えた場合や再設定が必要な場合は、実行中のコンテナを停止します。

docker stop コマンドは、コンテナにシグナルを送信して正常にシャットダウンさせます。コンテナ ID または 名前 のどちらでも対象を指定できます。ここではコンテナに my-nginx という名前を付けたため、名前を使います。

正常な停止が重要なのは、多くのサービスがファイルを閉じたり、ポートを解放したり、実行中の処理を完了したりするための時間を必要とするからです。コンテナの停止は単に「電源を切る」ことではなく、メインプロセスに正常終了を要求する操作です。

次のコマンドを実行します。

docker stop my-nginx

コマンドを受け付けたことを確認するため、ターミナルに my-nginx と表示されます。

停止したことを確認する:

もう一度 docker ps を実行します。一覧が空になるか、my-nginx が表示されなくなります。

コンテナが停止したものの、まだ存在していることを確認するには、-a(すべて)フラグを使います。

docker ps -a

今度は、状態が Exited になった my-nginx が一覧に表示されます。

リソースをクリーンアップする

コンテナを停止しても、コンテナ自体は削除されません。ログと設定を保持したまま、ディスク上に残ります。後で docker start を使って再起動したい場合には便利です。

ここでも覚えておくべきライフサイクル上の違いがあります。作成・実行、停止、削除は、それぞれ別の操作です。Docker はこれらの状態を分けて管理するため、削除する前にコンテナを確認したり、再起動したりできます。

ただし、コンテナを完全に使い終えた場合は、システムを整理するために削除します。docker rm コマンドは、停止したコンテナを削除します。

my-nginx を削除するには、次のコマンドを実行します。

docker rm my-nginx

削除を確認するため、ターミナルに my-nginx と表示されます。

最後に確認する:

最後にもう一度 docker ps -a を実行します。コンテナが完全に削除され、一覧からなくなっていることを確認できます。

注記: 通常、実行中のコンテナを docker rm で削除することはできません。まず今回のようにコンテナを停止するか、-f(強制)フラグを使う必要があります。ただし、正常に停止してから削除する方法が推奨されます。

まとめ

この実験では、Docker コンテナの完全なライフサイクルを正常に管理しました。次の操作を学びました。

  • docker run -d を使ってバックグラウンドサービスを 実行 する。
  • docker ps を使ってアクティブなコンテナの状態を 確認 する。
  • docker stop を使ってサービスを正常に 停止 する。
  • docker rm を使って停止したコンテナを 削除 し、リソースを解放する。

これら 4 つのコマンドは、Docker ユーザーが日常的に使う基本コマンドです。これで、実行中のコンテナをより詳しく操作する方法を学ぶ準備ができました。