Docker Run コマンドのパラメータ

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

はじめに

この実験では、docker run コマンドとその様々なパラメータに焦点を当てます。docker run コマンドは Docker 操作の基本であり、特定の構成でコンテナを作成し、起動するために使用されます。

このコマンドのパラメータをマスターすることで、コンテナ化されたアプリケーションをより高度に制御できるようになり、Docker コンテナを効果的にデプロイおよび管理する能力が向上します。

命名、デタッチモード(バックグラウンド実行)、ポートマッピング、ボリュームマウント、環境変数、リソース制限など、幅広いパラメータを網羅します。

すでに馴染みのあるパラメータもあれば、初めて目にするものもあるでしょう。

Docker Run の基本とコンテナの命名

まずは docker run の基本から始め、コンテナに名前を付ける方法を確認しましょう。

最初に、基本的な Nginx コンテナを実行します。

docker run nginx

このコマンドは、Nginx コンテナをフォアグラウンドで実行します。ターミナルにログ出力が流れるのが見えるはずです。これはコンテナがフォアグラウンドで動作しており、ログを直接表示しているためです。

このコンテナを停止するには、Ctrl+C を押します。停止までに数秒かかる場合がありますが、これは Docker がコンテナを正常にシャットダウン(クリーンアップ)するための時間を確保しているためで、正常な動作です。

次に、デタッチモードで実行し、名前を付けてみましょう。

docker run -d --name my-nginx nginx

このコマンドの内容を分解して説明します。

  • docker run: コンテナを実行するための基本コマンドです。
  • -d: このオプションはコンテナをデタッチモード(バックグラウンド)で実行します。ターミナルには出力が表示されません。
  • --name my-nginx: コンテナに "my-nginx" という名前を割り当てます。名前を指定しない場合、Docker はランダムな名前を自動的に割り当てます。
  • nginx: コンテナの作成に使用するイメージの名前です。

このコマンドを実行すると、長い文字列が表示されます。これがコンテナ ID です。Docker はバックグラウンドでコンテナを起動しました。

もし「名前が既に使用されている」というエラーが出た場合は、その名前のコンテナが既に存在することを意味します。別の名前を選ぶか、既存のコンテナを削除してください(削除方法は後の実験で学びます)。

ポートマッピング

docker run-p パラメータを使用すると、コンテナのポートをホストマシンのポートにマッピング(紐付け)できます。これは、ホストマシンからコンテナ内で実行されているサービスにアクセスするために不可欠です。

ポートマッピングを指定して Nginx コンテナを実行します。

docker run -d --name nginx-mapped -p 8080:80 nginx

このコマンドの新しい部分を説明します。

  • -p 8080:80: ホストのポート 8080 をコンテナのポート 80 にマッピングします。形式は常に ホスト側のポート:コンテナ側のポート です。

Nginx はデフォルトでコンテナ内のポート 80 で動作します。これをホストのポート 8080 にマッピングすることで、Web ブラウザから localhost:8080 にアクセスできるようになります。

では、Nginx のウェルカムページにアクセスできるか確認しましょう。コマンドラインから HTTP リクエストを送信できる curl コマンドを使用します。

curl http://localhost:8080

Nginx のウェルカムページの HTML コンテンツが表示されるはずです。もし curl がインストールされていない場合は、以下のコマンドでインストールできます。

sudo apt-get update && sudo apt-get install -y curl

ページにアクセスできない場合は、以下の点を確認してください。

  1. コンテナが実行中か確認する:docker ps | grep nginx-mapped
  2. ポートが正しくマッピングされているか確認する:docker port nginx-mapped
  3. クラウドサーバーを使用している場合は、ファイアウォールでポート 8080 の通信が許可されているか確認する。

ボリュームマウント

docker run-v パラメータを使用すると、ボリュームをマウントしてホストとコンテナ間でデータを共有できます。これはデータの永続化や、コンテナへの設定ファイルの提供に非常に便利です。

まず、ホスト側に簡単なディレクトリ構造を作成しましょう。

mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html

これらのコマンドは以下の操作を行います。

  1. ホームディレクトリの project フォルダ内に新しいディレクトリ nginx-data を作成します。
  2. この新しいディレクトリ内に index.html という名前のシンプルな HTML ファイルを作成します。

次に、このディレクトリをマウントして Nginx コンテナを実行します。

docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx

このコマンドを分解して説明します。

  • docker run: 新しいコンテナを実行するコマンド。
  • -d: デタッチモード(バックグラウンド)で実行。
  • --name nginx-volume: コンテナに "nginx-volume" という名前を割り当て。
  • -p 8081:80: ホストのポート 8081 をコンテナのポート 80 にマッピング。
  • -v ~/project/nginx-data:/usr/share/nginx/html: ホストの nginx-data ディレクトリをコンテナの /usr/share/nginx/html ディレクトリにマウントします。ここは Nginx がコンテンツを配信するために参照する場所です。
  • nginx: 使用するイメージ名。

では、カスタムページが配信されているか確認しましょう。

curl http://localhost:8081

作成した HTML ファイルの内容である "Hello from mounted volume!" が表示されるはずです。

カスタムコンテンツが表示されない場合は、以下を確認してください。

  1. ホストシステム上に ~/project/nginx-data/index.html ファイルが存在するか。
  2. コンテナが実行中か:docker ps | grep nginx-volume
  3. エラーがないか Nginx のログを確認する:docker logs nginx-volume

ホストのディレクトリをコンテナにマウントするこの方法は「バインドマウント(bind mount)」と呼ばれます。ホストとコンテナ間でファイルを共有する最も直接的な方法です。以下の重要なポイントを覚えておいてください。

  1. ホストのディレクトリパスは絶対パスである必要があります。
  2. ホストのディレクトリが存在しない場合、Docker は自動的にそれを作成します。
  3. このディレクトリ内のファイルへの変更(ホスト側、コンテナ側どちらからでも)は、即座に双方に反映されます。
  4. 権限に注意してください。コンテナはデフォルトで root ユーザーとして実行されるため、ホストユーザーが変更できないファイルを作成してしまう可能性があります。

この方法でディレクトリごとマウントすることで、単一ファイルの不整合によるエラーを避け、ファイルの追加・削除・変更をコンテナの再作成なしに柔軟に行うことができます。

環境変数

docker run-e パラメータを使用すると、コンテナ内に環境変数を設定できます。これは、コンテナ内のアプリケーションのコードを変更せずに設定を調整するのに役立ちます。

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

docker run -d --name nginx-env -e NGINX_HOST=mywebsite.com -e NGINX_PORT=80 nginx

新しい部分を説明します。

  • -e NGINX_HOST=mywebsite.com: NGINX_HOST という名前の環境変数に mywebsite.com という値を設定します。
  • -e NGINX_PORT=80: NGINX_PORT という名前の環境変数に 80 という値を設定します。

環境変数はキーと値のペア(key-value pair)であり、コンテナ内で実行されているプロセスからアクセスできます。多くの Docker イメージは、特定の環境変数を使用して設定を行うように設計されています。

設定された環境変数を確認してみましょう。

docker exec nginx-env env | grep NGINX_

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

  • docker exec nginx-env: 実行中の nginx-env コンテナ内でコマンドを実行するよう Docker に指示します。
  • env: すべての環境変数を表示するコマンドです。
  • | grep NGINX_: 出力をフィルタリングして "NGINX_" を含む行だけを表示します。

リストに 2 つの環境変数が表示されるはずです。

表示されない場合は、以下を確認してください。

  1. コンテナが実行中か:docker ps | grep nginx-env
  2. docker run コマンドで環境変数名のスペルが正しいか。

リソース制限

Docker では、docker run の様々なパラメータを使用してコンテナにリソース制限を設けることができます。これは、特に複数のコンテナを実行する場合に、ホストシステムのパフォーマンスと安定性を維持するために非常に重要です。

メモリと CPU の制限を指定してコンテナを実行します。

docker run -d --name nginx-limited --memory 256m --cpus 0.5 nginx

新しい部分を説明します。

  • --memory 256m: コンテナが使用できるメモリを 256 メガバイトに制限します。'm' はメガバイトを表します。'g' を使ってギガバイトを指定することもできます。
  • --cpus 0.5: コンテナが使用できる CPU コアを最大で 0.5 個(半分)に制限します。

これらの制限により、コンテナが指定以上のリソースを消費するのを防ぎ、特定のコンテナがホストのリソースを独占してしまう事態を回避できます。

制限が正しく適用されたか確認します。

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

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

異なる値が表示される場合は、docker run コマンドで制限を正しく指定したか再確認してください。

注意:リソース制限を低く設定しすぎると、コンテナのパフォーマンスが低下したり、クラッシュしたりすることがあります。コンテナに問題が発生した場合は、これらの制限値を上げることを検討してください。

ネットワーク設定

docker run--network パラメータを使用すると、コンテナを特定のネットワークに接続できます。これはコンテナ間の通信や、コンテナグループの分離に役立ちます。

まず、カスタムブリッジネットワークを作成します。

docker network create my-custom-network

これにより、my-custom-network という名前の新しいブリッジネットワークが作成されます。ブリッジネットワークは Docker で最も一般的なネットワークタイプです。

次に、このネットワークに接続した状態でコンテナを実行します。

docker run -d --name nginx-networked --network my-custom-network nginx

--network my-custom-network オプションにより、コンテナは先ほど作成したネットワークに接続されます。

同じネットワーク上のコンテナ同士は、コンテナ名をホスト名として使用して互いに通信できます。これにより、複数のサービスを簡単に連携させることができます。

ネットワークが存在しないというエラーが出た場合は、docker network create コマンドで正しくネットワークが作成されているか確認してください。

再起動ポリシー

docker run--restart パラメータを使用すると、コンテナの再起動ポリシーを指定できます。これは、コンテナがクラッシュしたり、Docker デーモンが再起動したりした場合でも、コンテナの稼働を維持するのに役立ちます。

再起動ポリシーを指定してコンテナを実行します。

docker run -d --name nginx-restart --restart unless-stopped nginx

--restart unless-stopped オプションは、ユーザーによって明示的に停止されない限り、コンテナを自動的に再起動するように設定します。

その他の再起動ポリシーには以下があります。

  • no: デフォルト設定。コンテナを自動的に再起動しません。
  • on-failure: コンテナが 0 以外のステータスで終了(異常終了)した場合のみ再起動します。
  • always: 終了ステータスに関わらず、常にコンテナを再起動します。

再起動ポリシーを確認します。

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' nginx-restart

unless-stopped と出力されるはずです。

期待通りの出力が得られない場合は、docker run コマンドで再起動ポリシーを正しく指定したか確認してください。

作業ディレクトリとコマンド

このステップでは、コンテナ内の作業ディレクトリ(ワーキングディレクトリ)を設定する方法と、コンテナ起動時にカスタムコマンドを実行する方法を学びます。

docker run-w パラメータはコンテナ内の作業ディレクトリを設定し、イメージ名の後に実行したいコマンドを指定できます。

これらの概念を組み合わせてみましょう。

docker run -d --name nginx-custom -w /app nginx sh -c "mkdir -p /app && touch newfile.txt && nginx -g 'daemon off;'"

このコマンドを分解して説明します。

  • -d: デタッチモード(バックグラウンド)で実行。
  • --name nginx-custom: コンテナ名を "nginx-custom" に設定。
  • -w /app: コンテナ内の作業ディレクトリを /app に設定。
  • nginx: 使用するイメージ名。
  • sh -c "...": シェルコマンドを実行します。
    • mkdir -p /app: /app ディレクトリが存在しない場合は作成します。
    • &&: 前のコマンドが成功した場合に次のコマンドを実行します。
    • touch newfile.txt: newfile.txt という名前の空ファイルを作成します。
    • &&: 前のコマンドが成功した場合に次のコマンドを実行します。
    • nginx -g 'daemon off;': Nginx をフォアグラウンドで起動し、コンテナを実行し続けます。

では、コンテナが実行されており、ファイルが作成されたか確認しましょう。

docker ps | grep nginx-custom
docker exec nginx-custom ls -l /app/newfile.txt

最初のコマンドでコンテナが実行中であることが確認でき、2 番目のコマンドでコンテナの /app ディレクトリ内に newfile.txt ファイルの詳細が表示されるはずです。

まとめ

この実験では、docker run コマンドを深く掘り下げ、その様々なパラメータとオプションを探索しました。学んだ内容は以下の通りです。

  1. コンテナの実行と命名の基本
  2. ホストからコンテナサービスにアクセスするためのポートマッピング
  3. ホストとコンテナ間でデータを共有するためのボリュームマウント
  4. コンテナ構成のための環境変数の設定
  5. コンテナのリソース使用量を制限するためのリソース制限の適用
  6. コンテナ間通信のためのネットワーク設定
  7. コンテナの信頼性を高めるための再起動ポリシー
  8. コンテナ起動時の作業ディレクトリと実行コマンドの指定

これらの docker run パラメータは、Docker コンテナを構成および管理するための強力なツールとなります。これらのオプションをマスターすることで、より洗練され、用途に最適化されたコンテナデプロイが可能になります。コンテナがホストシステムとどのように相互作用するか、どの程度のリソースを消費するか、そして様々なシナリオでどのように振る舞うかを自在にコントロールできるようになります。