Docker Runの習得:必須コマンドオプションの解説
Dockerのdocker runコマンドは、Dockerイメージからコンテナを作成および起動するための基盤です。単純なdocker run <image_name>で開始することもできますが、コンテナの全能力を引き出すには、その多数のオプションを理解する必要があります。この記事では、ネットワーキングの管理、環境変数の設定、ボリュームによるデータ永続化、デタッチモードによるコンテナ実行の制御を可能にする、最も重要なdocker runフラグについて詳しく解説します。
これらのオプションを理解することは、効率的なコンテナ化のために不可欠であり、堅牢で柔軟性があり、管理しやすいアプリケーションの構築を可能にします。Webサーバー、データベース、あるいは複雑なマイクロサービスを実行するかにかかわらず、docker runを習得することで、Dockerワークフローが大幅に向上します。
docker runの基本
docker runコマンドの基本的な構文は次のとおりです。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS]: コンテナの動作を変更するフラグです。IMAGE: コンテナを作成するためのDockerイメージの名前(例:ubuntu、nginx:latest)。[COMMAND]: イメージのデフォルトコマンドを上書きする、コンテナ内で実行されるオプションのコマンドです。[ARG...]: コマンドに対する引数です。
最も影響力の大きいオプションのいくつかを詳しく見ていきましょう。
主要なdocker runオプションの解説
デタッチモード (-d または --detach)
デフォルトでは、docker runはコンテナをフォアグラウンドで起動し、ターミナルの標準入力、出力、エラー出力に接続します。これは、コンテナが停止するまでターミナルが占有されることを意味します。デタッチモード (-d) を使用すると、コンテナをバックグラウンドで実行し、ターミナルを解放できます。
例:
docker run -d nginx
このコマンドはNginx Webサーバーコンテナをバックグラウンドで起動します。長いコンテナIDがターミナルに出力され、プロンプトが即座に戻ります。
ヒント: デタッチされたコンテナのログを確認するには、docker logs <container_id_or_name>を使用します。
ポートマッピング (-p または --publish)
コンテナはネットワーク的に隔離された環境です。コンテナのサービスをホストマシンやネットワーク上の他のマシンに公開するには、ポートをマッピングする必要があります。-pフラグを使用すると、コンテナのポートをホスト上の特定のポートに公開できます。
形式は -p <host_port>:<container_port> です。
例:
Nginxコンテナを実行し、コンテナ内のポート80をホストのポート8080にマッピングする場合:
docker run -d -p 8080:80 nginx
これで、Webブラウザでhttp://localhost:8080にアクセスすることでNginxサーバーにアクセスできます。
複数ポートのマッピング: -pフラグを複数回使用することで、複数のポートをマッピングできます。
docker run -d -p 8080:80 -p 4430:443 nginx
IPアドレスの指定: ホストのどのIPアドレスにバインドするかを指定することもできます。
docker run -d -p 127.0.0.1:8080:80 nginx
これは、ホストのポート8080をループバックインターフェイス(localhost)のみにバインドします。
ボリュームマウント (-v または --volume)
コンテナのファイルシステムはデフォルトでは一時的です。コンテナが削除されると、その内部で作成または変更されたデータはすべて失われます。ボリュームは、コンテナのライフサイクル外でデータを永続化するためのメカニズムを提供します。ホストマシンのディレクトリをコンテナ内にマウントするか、Docker管理のボリュームを使用できます。
基本的な形式は -v <host_path>:<container_path> です。
例:
ローカルディレクトリ~/my-nginx-htmlを、コンテナ内のデフォルトのNginx HTMLディレクトリ(/usr/share/nginx/html)にマウントする場合:
docker run -d -p 8080:80 -v ~/my-nginx-html:/usr/share/nginx/html nginx
ホスト上の~/my-nginx-htmlに配置したHTMLファイルはすべてNginxによって提供されます。これらのファイルへの変更は、コンテナ内で即座に反映されます。
名前付きボリューム: ポータビリティと管理の容易さから、Docker管理の名前付きボリュームが好まれることがよくあります。
docker run -d -p 8080:80 -v my-nginx-data:/usr/share/nginx/html nginx
my-nginx-dataが存在しない場合、Dockerが作成します。これらのボリュームは、docker volume ls、docker volume create、docker volume rmを使用して管理できます。
環境変数 (-e または --env)
環境変数は、コンテナ内で実行されるアプリケーションを設定するために使用できるキーと値のペアです。-eフラグを使用すると、これらの変数を設定できます。
例:
アプリケーションのカスタム設定変数を設定する場合:
docker run -d -e APP_ENV=production my-custom-app:latest
複数変数の設定: -eを複数回使用します。
docker run -d -e DB_HOST=database.example.com -e DB_USER=admin my-app:latest
.envファイルの利用: 多くの変数を管理する場合、--env-fileフラグを使用できます。
docker run -d --env-file ./app.env my-app:latest
この場合、app.envには以下が含まれる可能性があります。
DB_HOST=database.example.com
DB_USER=admin
ヒント: パスワードなどの機密情報を、バージョン管理システムにコミットする環境変数や.envファイルに直接含めることには注意が必要です。
コンテナ名の指定 (--name)
コンテナを実行すると、Dockerはランダムでしばしば長い16進数の名前を付けます。--nameフラグを使用してカスタムの人間が読める名前を付けると、docker stop、docker logs、docker execなどのコマンドで後からコンテナを参照するのがはるかに簡単になります。
例:
docker run -d --name my-webserver -p 8080:80 nginx
これで、IDの代わりにmy-webserverとしてこのコンテナを参照できます。
警告: コンテナ名は一意である必要があります。その名前のコンテナがすでに存在する場合、docker runは失敗します。
対話モードとTTY (-i、-t、または-it)
ユーザーの対話や擬似ターミナル(シェルなど)を必要とするコマンドを実行するには、-i(対話的)フラグと-t(擬似TTYを割り当てる)フラグを使用します。これらはしばしば-itとして結合されます。
例:
Ubuntuコンテナ内で対話的なbashシェルを実行する場合:
docker run -it ubuntu bash
このコマンドはUbuntuコンテナを起動し、bashを実行し、ターミナルをそれに接続するため、Linuxシステムにログインしているかのようにコマンドを入力できます。シェルを終了する(exit)と、コンテナは停止します。
終了時の再起動ポリシー (--restart)
再起動ポリシーは、コンテナが停止した場合に自動的に再起動されるかどうか、およびその条件を定義します。
no: コンテナを自動的に再起動しない(デフォルト)。on-failure[:max_retries]: コンテナがゼロ以外の終了コードで終了した場合にのみ再起動します。最大再試行回数をオプションで指定できます。always: 終了ステータスに関係なく、コンテナが停止したら常に再起動します。unless-stopped: ユーザーまたはDockerデーモンによって明示的に停止されない限り、コンテナを常に再起動します。
例:
Webサーバーがクラッシュした場合に確実に自動的に再起動するようにするには:
docker run -d --name my-resilient-webserver --restart always -p 8080:80 nginx
終了時のコンテナ自動削除 (--rm)
特にテストや開発中の使い捨てコンテナの場合、コンテナが終了したら自動的に削除されるようにしたいことがよくあります。--rmフラグがこれを処理します。
例:
一時的なコンテナでコマンドを実行し、その後自動的に削除する場合:
docker run --rm ubuntu echo "Hello from a temporary container"
echoコマンドが終了してコンテナが終了した後、コンテナは自動的に削除されます。これにより、古い停止済みコンテナによるシステムの散らかりを防げます。
すべてをまとめる:実践的な例
カスタムWebアプリケーションを実行するために、いくつかのオプションを組み合わせてみましょう。
- デタッチモードで実行 (
-d)。 - 名前を付ける (
--name my-app)。 - ホストポート3000をコンテナポート80にマッピング (
-p 3000:80)。 - ローカルディレクトリをログ用にマウント (
-v $(pwd)/logs:/app/logs)。 - 環境変数を設定 (
-e NODE_ENV=production)。 - 失敗した場合に再起動するように設定 (
--restart on-failure)。 - 特定のイメージを使用 (
my-node-app:1.0)。
docker run -d --name my-app --restart on-failure -p 3000:80 -v $(pwd)/logs:/app/logs -e NODE_ENV=production my-node-app:1.0
このコマンドは、アプリケーションへのアクセスを可能にし、ログの永続化を許可し、ある程度の回復力を保証することで、効果的にアプリケーションをデプロイします。
結論
docker runコマンドは、基本的な使用法が示唆するよりもはるかに多機能です。-d、-p、-v、-e、--name、--rmなどのオプションを活用することで、コンテナ化されたアプリケーションに対するきめ細かな制御が可能になります。これらの必須フラグを習得することは、洗練されたコンテナ化環境を効率的かつ確実に構築・管理するための基礎的な一歩です。これらのオプションを引き続き試して、ご自身のDockerワークフローに完全に統合していってください。