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 run の -p パラメーターを使って、コンテナーのポートをホストに割り当てます。これにより、ホストマシンからコンテナー内で動作するサービスにアクセスできます。

ポートを割り当てて Nginx コンテナーを起動します。

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

このコマンドで新しく指定した部分を確認しましょう。

  • -p 8080:80:ホストのポート 8080 をコンテナーのポート 80 に割り当てます。形式は常に host_port:container_port です。

Nginx は、デフォルトでコンテナー内のポート 80 で動作します。このポートをホストのポート 8080 に割り当てたため、Web ブラウザーで localhost:8080 にアクセスすると、Nginx に接続できます。

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

curl --retry 5 --retry-all-errors --retry-delay 1 http://localhost:8080

Nginx のウェルカムページの HTML が表示されれば成功です。curl がインストールされていない場合は、次のコマンドでインストールできます。

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

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

  • コンテナーが実行中か確認します:docker ps | grep nginx-mapped
  • ポートが実際に割り当てられているか確認します:docker port nginx-mapped
  • クラウドサーバーを使用している場合は、ファイアウォールでポート 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

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

  • ホームディレクトリーの project フォルダー内に、nginx-data ディレクトリーを作成します。
  • 新しく作成したディレクトリー内に、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 --retry 5 --retry-all-errors --retry-delay 1 http://localhost:8081

カスタム HTML ファイルの内容である「Hello from mounted volume!」が表示されれば成功です。

カスタムの内容が表示されない場合は、次の点を確認してください。

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

ホストのディレクトリーをコンテナーにマウントする方法を、バインドマウントと呼びます。ホストとコンテナーの間でファイルを共有する簡単な方法です。次の点を覚えておきましょう。

  • ホストのディレクトリーパスには絶対パスを指定する必要があります。
  • ホスト側のディレクトリーが存在しない場合、Docker が自動的に作成します。
  • このディレクトリー内のファイルをホストまたはコンテナーで変更すると、その変更はホストとコンテナーの両方からすぐに確認できます。
  • アクセス権に注意してください。コンテナーはデフォルトで root として実行されるため、ホスト上のユーザーが変更できないファイルが作成されることがあります。

この方法では単一ファイルではなくディレクトリーをマウントするため、「not a directory」エラーを回避できます。また、コンテナーを作り直さなくても、ファイルの追加、削除、変更を柔軟に行えます。

環境変数

このステップでは、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 を設定します。

環境変数は、コンテナー内で実行されるプロセスが参照できるキーと値の組み合わせです。多くの Docker イメージは、設定に特定の環境変数を使うように設計されています。

環境変数が設定されたことを確認します。

docker exec nginx-env env | grep NGINX_

このコマンドは、次の操作を行います。

  • docker exec nginx-env:実行中の nginx-env コンテナー内でコマンドを実行するよう Docker に指示します。
  • env:すべての環境変数を表示します。
  • | grep NGINX_:出力を絞り込み、NGINX_ を含む行だけを表示します。

設定した 2 つの環境変数が表示されれば成功です。

環境変数が表示されない場合は、次の点を確認してください。

  • コンテナーが実行中か確認します:docker ps | grep nginx-env
  • docker run コマンドで環境変数名を正しく入力したか確認します。

リソース制限

このステップでは、docker run のパラメーターを使ってコンテナーのリソースを制限します。特に複数のコンテナーを実行する場合、ホストシステムのパフォーマンスと安定性を保つうえで重要です。

メモリーと CPU に上限を設定してコンテナーを起動します。

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

新しく指定した部分を確認しましょう。

  • --memory 256m:コンテナーが使用できるメモリーを 256 メガバイトに制限します。m はメガバイトを表します。ギガバイトを表す g も使用できます。
  • --cpus 0.5:コンテナーが使用できる CPU を最大で 1 コアの半分に制限します。

これらの上限により、コンテナーが指定した量を超えるリソースを使用できなくなります。その結果、単一のコンテナーがホストのリソースを独占するのを防ぎやすくなります。

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

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

1 つ目のコマンドでは 268435456(256 MB をバイトに換算した値)、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 オプションを指定すると、再起動ポリシーが unless-stopped に設定されます。ユーザーが明示的に停止しない限り、コンテナーは自動的に再起動します。

ほかにも、次の再起動ポリシーがあります。

  • no:デフォルトの設定です。コンテナーを自動的に再起動しません。
  • on-failure:コンテナーがゼロ以外のステータスで終了した場合にのみ再起動します。
  • 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

1 つ目のコマンドでコンテナーが実行中であることを確認できます。2 つ目のコマンドでは、コンテナー内の /app ディレクトリーにある newfile.txt の詳細が表示されます。

まとめ

この実験では、docker run コマンドとさまざまなパラメーターやオプションについて詳しく学びました。取り上げた内容は次のとおりです。

  1. コンテナーの基本的な起動と名前の指定
  2. ホストからコンテナー内のサービスにアクセスするためのポートマッピング
  3. ホストとコンテナーの間でデータを共有するためのボリュームマウント
  4. コンテナーの設定に使う環境変数
  5. コンテナーのリソース使用量を制限するリソース制限
  6. コンテナー間の通信に使うネットワーク設定
  7. コンテナーの安定稼働に役立つ再起動ポリシー
  8. コンテナー起動時の作業ディレクトリーとコマンドの指定

docker run のパラメーターを使うと、Docker コンテナーを柔軟に設定・管理できます。これらのオプションを使いこなせば、要件に合わせた高度なコンテナー環境を構築できます。コンテナーとホストシステムの連携方法、コンテナーが使用できるリソース、さまざまな状況での動作を制御できます。