コンテナの深掘り

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

はじめに

Docker コンテナは、現代のアプリケーションデプロイにおける基盤となる要素です。この実験では、Docker の可能性をより深く理解するために、高度なコンテナ管理テクニックを探索します。具体的には、異なるモードでのコンテナ実行、ライフサイクルの管理、コンテナ詳細のインスペクト(調査)、ログの活用、コンテナ内でのコマンド実行、ファイルのコピー、環境変数の設定、そしてコンテナリソースの制限について学習します。この実験を終える頃には、Docker コンテナを効果的に扱うための包括的な知識が身についているはずです。

異なるモードでのコンテナ実行

Docker では、さまざまなユースケースに合わせて異なるモードでコンテナを実行できます。ここでは、よく使われる 2 つのモード、「デタッチドモード(バックグラウンド実行)」と「インタラクティブモード(対話実行)」について見ていきましょう。

まず、デタッチドモードでコンテナを実行します。

docker run -d --name nginx-detached nginx

このコマンドの各オプションの意味は以下の通りです:

  • -d: コンテナをデタッチドモード(バックグラウンド)で実行します。
  • --name nginx-detached: コンテナに "nginx-detached" という名前を割り当てます。
  • nginx: 使用するイメージを指定します(ローカルにない場合は Docker Hub からプルされます)。

実行すると、コンテナ ID を示す長い文字列が表示されます。

コンテナの状態を確認するには、次のコマンドを実行します。

docker ps

次に、インタラクティブモードでコンテナを実行してみましょう。

docker run -it --name ubuntu-interactive ubuntu /bin/bash

このコマンドの各オプションの意味は以下の通りです:

  • -it: 疑似ターミナル(TTY)を割り当て、インタラクティブモードでコンテナを実行します。
  • --name ubuntu-interactive: コンテナに "ubuntu-interactive" という名前を割り当てます。
  • ubuntu: 使用するイメージを指定します。
  • /bin/bash: コンテナ内で実行するコマンドを指定します(この場合は bash シェル)。

これで Ubuntu コンテナの内部に入った状態になります。exit と入力することで、コンテナから抜けることができます。

実行中のコンテナを一覧表示してみましょう。

docker ps

nginx-detached コンテナは実行中ですが、ubuntu-interactive コンテナは(終了したため)表示されないはずです。

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

コンテナの起動、停止、再起動の方法を理解することは、効果的なコンテナ管理において非常に重要です。

まず、nginx-detached コンテナを停止させてみましょう。

docker stop nginx-detached

ここで、すべてのコンテナの状態を確認します。

docker ps -a

nginx-detached コンテナの状態が "Exited" になっていることが確認できます。

再び起動させます。

docker start nginx-detached

もう一度状態を確認します。

docker ps

nginx-detached コンテナが "Up" 状態に戻っているはずです。

実行中のコンテナを再起動することも可能です。

docker restart nginx-detached

停止しているものも含め、現在のコンテナの全容を確認するには以下を使用します。

docker ps -a

nginx-detachedubuntu-interactive の両方のコンテナが、それぞれの現在のステータスとともにリストに表示されます。

停止している ubuntu-interactive コンテナを削除しましょう。

docker rm ubuntu-interactive

削除されたことを確認します。

docker ps -a

リストから ubuntu-interactive コンテナが消えているはずです。

コンテナ詳細のインスペクト

Docker には、コンテナの詳細情報を調査(インスペクト)するための強力なツールが用意されています。

コンテナに関する詳細な情報を取得するには、inspect コマンドを使用します。

docker inspect nginx-detached

このコマンドは、コンテナに関する詳細情報を JSON 配列形式で出力します。情報量が非常に多いため、フィルタを使用して特定の情報だけを取り出してみましょう。

コンテナの IP アドレスを取得するには:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-detached

コンテナの現在のステータスを確認するには:

docker inspect -f '{{.State.Status}}' nginx-detached

これらのコマンドは Go テンプレートを使用して出力をフィルタリングしています。-f フラグを使うことで、出力フォーマットを指定できます。

次に、ポートマッピングを確認してみましょう。

docker port nginx-detached

ポートマッピングとは、コンテナがホストシステムや外部ネットワークと通信できるようにするための仕組みです。ホストシステムのポートをコンテナ内部のポートに紐付けます。これは、Docker 環境の外部からコンテナ内のサービスにアクセスするために不可欠です。

ポートがマッピングされていない場合、このコマンドは何も出力しません。今回の nginx-detached コンテナでは明示的にポートを指定していないため、出力は表示されないはずです。

ポートマッピングの例を示すために、ポートを指定して新しい Nginx コンテナを作成してみましょう。

docker run -d --name nginx-with-port -p 8080:80 nginx

このコマンドは、ホストのポート 8080 をコンテナのポート 80 にマッピングします。ここでポートマッピングを確認すると:

docker port nginx-with-port

以下のような出力が表示されるはずです。

80/tcp -> 0.0.0.0:8080

これは、ホストマシンのポート 8080 へのトラフィックが、Nginx が待機しているコンテナ内のポート 80 へ転送されることを意味します。

コンテナログの操作

コンテナのログにアクセスし、その内容を理解することは、アプリケーションのトラブルシューティングや監視において極めて重要です。

nginx コンテナのログを表示してみましょう。

docker logs nginx-detached

これにより、コンテナ起動時からのすべてのログが表示されます。直近のログだけを見たい場合は、--tail オプションを使用します。

docker logs --tail 10 nginx-detached

これで最後の 10 行だけが表示されます。

リアルタイムでログを追跡(tail -f のような動作)するには、-f オプションを使用します。

docker logs -f nginx-detached

新しいログが生成されるたびにストリーミング表示されます。終了するには Ctrl+C を押してください。

また、ログにタイムスタンプを付与することもできます。

docker logs --timestamps nginx-detached

これは、時間に依存する問題のデバッグ時に特に役立ちます。

実行中のコンテナ内でのコマンド実行

Docker では実行中のコンテナ内部でコマンドを実行することができ、デバッグやメンテナンスに非常に便利です。

まず、nginx コンテナ内で簡単なコマンドを実行してみましょう。

docker exec nginx-detached echo "Hello from inside the container"

ターミナルに "Hello from inside the container" と表示されるはずです。

次に、コンテナ内のインタラクティブシェルを取得します。

docker exec -it nginx-detached /bin/bash

これでコンテナの内部に入りました。少し探索してみましょう。

ls /etc/nginx
cat /etc/nginx/nginx.conf
exit

これらのコマンドで Nginx の設定ディレクトリの内容を確認し、メインの設定ファイルを表示しました。exit コマンドでホストシステムのシェルに戻ります。

コンテナとのファイルコピー

Docker は、ホストシステムとコンテナの間でファイルをコピーする手段を提供しています。これは設定ファイルの更新やログの回収などに役立ちます。

まず、ホストシステム上に簡単な HTML ファイルを作成します。

echo "<html><body><h1>Hello from host</h1></body></html>" > hello.html

このファイルを nginx コンテナにコピーします。

docker cp hello.html nginx-detached:/usr/share/nginx/html/hello.html

コンテナ内でコマンドを実行して、ファイルがコピーされたか確認します。

docker exec nginx-detached cat /usr/share/nginx/html/hello.html

HTML ファイルの内容が表示されるはずです。

今度は、コンテナからホストへファイルをコピーしてみましょう。

docker cp nginx-detached:/etc/nginx/nginx.conf ~/project/nginx.conf

これにより、コンテナ内の Nginx 設定ファイルがホストの現在のディレクトリにコピーされます。

コピーされたことを確認します。

ls -l ~/project/nginx.conf

nginx.conf ファイルがリストに表示されるはずです。

コンテナでの環境変数の設定

環境変数は、コンテナで実行されるアプリケーションを構成するための主要な方法です。その設定方法と使用方法を見ていきましょう。

まず、環境変数を指定して新しいコンテナを実行します。

docker run --name env-test -e MY_VAR="Hello, Environment" -d ubuntu sleep infinity

このコマンドの動作は以下の通りです:

  • --name env-test: コンテナ名を "env-test" に設定します。
  • -e MY_VAR="Hello, Environment": MY_VAR という名前の環境変数を設定します。
  • -d: デタッチドモードで実行します。
  • ubuntu: Ubuntu イメージを使用します。
  • sleep infinity: コンテナを無期限に実行し続けます。

環境変数が正しく設定されたか確認します。

docker exec env-test env | grep MY_VAR

出力に MY_VAR=Hello, Environment と表示されるはずです。

また、ファイルを使用して環境変数を一括設定することもできます。env_file という名前のファイルを以下の内容で作成します。

nanovim などのエディタを使用してファイルを作成してください。

nano env_file
ANOTHER_VAR=From a file
YET_ANOTHER_VAR=Also from the file

Ctrl+X を押し、YEnter の順に押してファイルを保存しエディタを終了します。

このファイルを使って別のコンテナを起動します。

docker run --name env-file-test --env-file env_file -d ubuntu sleep infinity

新しいコンテナの環境変数を確認します。

docker exec env-file-test env | grep -E "ANOTHER_VAR|YET_ANOTHER_VAR"

ファイルに記述した両方の変数が表示されるはずです。

コンテナリソースの制限

Docker では、コンテナが使用できるリソース(CPU やメモリ)を制限できます。これは、複数のコンテナが動く環境でリソース配分を管理するために不可欠です。

メモリと CPU の制限を設けてコンテナを起動してみましょう。

docker run --name limited-nginx -d --memory=512m --cpus=0.5 nginx

このコマンドの動作は以下の通りです:

  • --name limited-nginx: コンテナ名を "limited-nginx" に設定します。
  • -d: デタッチドモードで実行します。
  • --memory=512m: コンテナの使用メモリを 512 メガバイトに制限します。
  • --cpus=0.5: コンテナが使用する CPU コアを最大で 0.5 個分に制限します。
  • nginx: Nginx イメージを使用します。

inspect コマンドでこれらの制限が適用されているか確認できます。

docker inspect -f '{{.HostConfig.Memory}}' limited-nginx
docker inspect -f '{{.HostConfig.NanoCpus}}' limited-nginx

最初のコマンドは 536870912(512MB をバイト換算したもの)、2 番目のコマンドは 500000000(0.5 CPU をナノ単位で表したもの)を出力します。

これらの制限がリアルタイムでどのように影響しているかを確認するには、stats コマンドを使用します。

docker stats limited-nginx

リソース使用状況の統計がライブストリーミングで表示されます。終了するには Ctrl+C を押してください。

まとめ

この実験では、Docker における高度なコンテナ管理テクニックを学びました。異なるモードでの実行、ライフサイクルの管理、詳細情報のインスペクト、ログの活用、コンテナ内でのコマンド実行、ファイルのコピー、環境変数の設定、そしてリソース制限の方法を習得しました。これらのスキルは、より複雑なシナリオで Docker コンテナを扱うための強固な基盤となります。

効果的なコンテナ管理は、スケーラブルでメンテナンス性の高いコンテナ化アプリケーションを構築するために不可欠です。Docker の学習を続ける中で、これらのスキルはデバッグ、最適化、そして環境管理において非常に価値のあるものになるでしょう。

引き続きこれらのコマンドを練習し、Docker のさらなる可能性を探求してください。コンテナを扱えば扱うほど、より快適に、そして熟練した操作ができるようになります。ハッピー・コンテナライジング!