はじめに
この実験では、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 コマンドとさまざまなパラメーターやオプションについて詳しく学びました。取り上げた内容は次のとおりです。
- コンテナーの基本的な起動と名前の指定
- ホストからコンテナー内のサービスにアクセスするためのポートマッピング
- ホストとコンテナーの間でデータを共有するためのボリュームマウント
- コンテナーの設定に使う環境変数
- コンテナーのリソース使用量を制限するリソース制限
- コンテナー間の通信に使うネットワーク設定
- コンテナーの安定稼働に役立つ再起動ポリシー
- コンテナー起動時の作業ディレクトリーとコマンドの指定
docker run のパラメーターを使うと、Docker コンテナーを柔軟に設定・管理できます。これらのオプションを使いこなせば、要件に合わせた高度なコンテナー環境を構築できます。コンテナーとホストシステムの連携方法、コンテナーが使用できるリソース、さまざまな状況での動作を制御できます。



