はじめに
この実験では、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
ページにアクセスできない場合は、以下の点を確認してください。
- コンテナが実行中か確認する:
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 http://localhost:8081
作成した HTML ファイルの内容である "Hello from mounted volume!" が表示されるはずです。
カスタムコンテンツが表示されない場合は、以下を確認してください。
- ホストシステム上に
~/project/nginx-data/index.htmlファイルが存在するか。 - コンテナが実行中か:
docker ps | grep nginx-volume - エラーがないか Nginx のログを確認する:
docker logs nginx-volume
ホストのディレクトリをコンテナにマウントするこの方法は「バインドマウント(bind mount)」と呼ばれます。ホストとコンテナ間でファイルを共有する最も直接的な方法です。以下の重要なポイントを覚えておいてください。
- ホストのディレクトリパスは絶対パスである必要があります。
- ホストのディレクトリが存在しない場合、Docker は自動的にそれを作成します。
- このディレクトリ内のファイルへの変更(ホスト側、コンテナ側どちらからでも)は、即座に双方に反映されます。
- 権限に注意してください。コンテナはデフォルトで 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 つの環境変数が表示されるはずです。
表示されない場合は、以下を確認してください。
- コンテナが実行中か:
docker ps | grep nginx-env 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 コマンドを深く掘り下げ、その様々なパラメータとオプションを探索しました。学んだ内容は以下の通りです。
- コンテナの実行と命名の基本
- ホストからコンテナサービスにアクセスするためのポートマッピング
- ホストとコンテナ間でデータを共有するためのボリュームマウント
- コンテナ構成のための環境変数の設定
- コンテナのリソース使用量を制限するためのリソース制限の適用
- コンテナ間通信のためのネットワーク設定
- コンテナの信頼性を高めるための再起動ポリシー
- コンテナ起動時の作業ディレクトリと実行コマンドの指定
これらの docker run パラメータは、Docker コンテナを構成および管理するための強力なツールとなります。これらのオプションをマスターすることで、より洗練され、用途に最適化されたコンテナデプロイが可能になります。コンテナがホストシステムとどのように相互作用するか、どの程度のリソースを消費するか、そして様々なシナリオでどのように振る舞うかを自在にコントロールできるようになります。



