概要: 本記事では、Dockerコンテナの基本的な実行方法から、その状態確認、効率的な管理コマンドまでを網羅的に解説します。実務で役立つトラブルシューティングや注意点も紹介し、Dockerをより深く使いこなすための知識を提供します。
Docker実行と状態確認の基本コマンドを最短でマスター
導入と最初のコンテナ実行
Dockerは、アプリケーションとその実行環境を「コンテナ」としてパッケージ化する技術であり、開発環境の統一やデプロイの効率化を可能にする現代の標準ツールです。この技術は、IT人材の需要が高まる現代において、ITエンジニアにとって必須のスキルとなりつつあります。経済産業省の調査(2019年3月公表)では、2030年までに最大79万人ものIT人材が不足すると推計されており、効率的な開発・運用を実現するDockerの重要性は増すばかりです。
最初のDockerコンテナを起動するには、docker runコマンドを使用します。例えば、Webサーバーとして広く使われるNginxをバックグラウンドで起動し、ホストOSの80番ポートをコンテナの80番ポートにマッピングするには、docker run -d -p 80:80 nginxと実行します。これにより、ローカル環境でNginxが数秒で起動し、ブラウザからアクセスできるようになります。この手軽さこそが、従来の仮想マシンと比較してDockerが軽量かつ高速である理由の一つです。
コマンド実行後、コンテナが正しく動作しているかを確認するには、docker psコマンドを使用します。このコマンドは現在実行中のコンテナの一覧を表示し、コンテナID、イメージ名、ポートマッピング、稼働時間などの基本的な情報を確認できます。もしコンテナが期待通りに起動しない場合は、後のトラブルシューティングのセクションで詳しく解説しますが、まずはこの基本コマンドで状況を把握することが第一歩となります。
Dockerは「コンテナ型仮想化」という技術を基盤としています。これは、従来の仮想マシンと異なり、ホストOSのカーネルを共有しながらアプリケーションの実行環境をプロセスレベルで隔離するものです。この仕組みにより、仮想マシンに比べて軽量かつ高速な起動(数秒単位)が可能となり、リソース消費も抑えられます。開発から本番まで同じ環境を提供できるため、環境差異に悩まされることがなくなります。
実行中のコンテナの状態確認と詳細情報の取得
Dockerコンテナが意図通りに動作しているか確認するには、いくつかの重要なコマンドがあります。まず、docker psコマンドは、現在実行中のコンテナの概要を一覧で表示し、コンテナID、使用しているイメージ、ポートマッピング、ステータス、起動時間といった基本的な情報を瞬時に把握できます。これにより、どのコンテナが稼働しているか、また意図しないコンテナが動いていないかを素早くチェックすることが可能です。
さらに詳細な情報を得るためには、docker inspect <コンテナIDまたはコンテナ名>コマンドが非常に役立ちます。このコマンドは、コンテナのIPアドレス、ボリュームマウント情報、ネットワーク設定、環境変数、リソース制限など、JSON形式で膨大な詳細データを出力します。トラブルシューティング時や、コンテナの構成を確認したい場合に不可欠な情報源となります。
リソース使用状況をリアルタイムで監視したい場合は、docker statsコマンドが有効です。このコマンドを実行すると、実行中の全コンテナのCPU使用率、メモリ使用量、ネットワークI/O、ディスクI/Oなどを動的に表示します。これにより、パフォーマンスボトルネックの特定や、リソースが過剰に消費されていないかの監視が容易になります。これらのコマンドを組み合わせることで、コンテナの健全性を多角的にチェックし、安定した運用をサポートできます。
コンテナ内でのコマンド実行とログの監視
コンテナ内部の状況を直接確認したり、特定のコマンドを実行したりする必要がある場合、docker execコマンドが非常に強力なツールとなります。このコマンドを使えば、実行中のコンテナ内でシェルにアクセスしたり、診断用のツールを実行したりすることが可能です。例えば、docker exec -it <コンテナIDまたはコンテナ名> bashと入力することで、コンテナ内にインタラクティブなシェルセッションを開き、あたかもそのコンテナが個別のOSであるかのように操作できます。これにより、ファイルシステムの確認や、アプリケーションの内部状態調査が行えます。
アプリケーションの挙動やエラーの原因を特定する上で、ログは最も重要な情報源です。Dockerでは、docker logs <コンテナIDまたはコンテナ名>コマンドを使ってコンテナが出力する標準出力・標準エラー出力を取得できます。このコマンドは、コンテナが起動してから出力されたログ全てを表示します。
リアルタイムでログを追跡したい場合は、docker logs -f <コンテナIDまたはコンテナ名>オプションを使用します。これにより、新たなログが生成されるたびにコンソールに表示されるため、アプリケーションの挙動を監視したり、問題発生時の初動対応で原因を特定したりする際に非常に有効です。これらのコマンドを適切に使いこなすことで、コンテナ内部で何が起きているかを正確に把握し、迅速な問題解決に繋げることができます。
出典:IT人材需給に関する調査(経済産業省)、2025 Dockerアプリケーション開発の現状レポート(Docker Inc.)
Dockerコンテナの起動・停止・削除ステップバイステップ
コンテナのライフサイクル管理の基本
Dockerコンテナは、アプリケーションの実行だけでなく、そのライフサイクル全体を適切に管理することが重要です。基本的な操作として、一度停止したコンテナを再び起動するにはdocker start <コンテナIDまたはコンテナ名>コマンドを使用します。これにより、コンテナの状態が保存されたまま、アプリケーションを素早く再開できます。逆に、実行中のコンテナを安全に停止したい場合は、docker stop <コンテナIDまたはコンテナ名>コマンドを実行します。このコマンドは、コンテナ内のプロセスに終了シグナルを送り、設定されたタイムアウト期間内に graceful shutdown を促します。
アプリケーションの更新や、設定変更を適用した後にコンテナを再起動したい場合は、docker restart <コンテナIDまたはコンテナ名>コマンドが便利です。これはstopコマンドとstartコマンドを一度に実行するのと同様の働きをします。これらのコマンドは、コンテナIDだけでなく、docker run時に指定したコンテナ名でも操作が可能です。例えば、docker stop my-nginxのように直感的に操作できるため、命名規則を定めることで管理の複雑さを軽減できます。
コンテナは停止しても、その状態や設定は保持されます。しかし、コンテナを完全に破棄したい場合は、次のセクションで説明する削除コマンドを使用する必要があります。これらのライフサイクル管理コマンドを習得することは、日常的なDocker運用において不可欠であり、アプリケーションの安定稼働に直結します。
Dockerの真価は、Dockerfileを用いることで環境構築の手順をテキストファイルとして定義・共有できる「構成のコード化(IaC: Infrastructure as Code)」にあります。これにより、「開発環境では動くが本番環境で動かない」といった環境差異の問題を根本的に解決し、チーム開発における再現性と効率性を飛躍的に向上させます。Docker ComposeもこのIaCの原則に基づいています。
不要なコンテナとイメージの効率的な削除
Dockerを継続的に使用していると、不要になったコンテナやイメージが蓄積され、ディスク容量を圧迫したり、管理を複雑にしたりする原因となります。このような「運用の無秩序化」を防ぎ、効率的な管理を維持するためには、定期的なクリーンアップが不可欠です。まず、停止中のコンテナを削除するには、docker rm <コンテナIDまたはコンテナ名>コマンドを使用します。実行中のコンテナは削除できないため、事前にdocker stopで停止しておく必要があります。
次に、コンテナの元となるイメージを削除するには、docker rmi <イメージIDまたはイメージ名>コマンドを使います。ただし、そのイメージから作成されたコンテナが存在する場合は、先にそれらのコンテナを削除しないとイメージは削除できません。複数のイメージやコンテナが関連している場合、この手動での削除作業は煩雑になりがちです。
そこで非常に有効なのが、docker system pruneコマンドです。このコマンドは、停止中のコンテナ、未使用のネットワーク、ダングリング(どのコンテナにも関連付けられていない)イメージ、ビルドキャッシュなどを一括で削除します。特にdocker system prune -aオプションを付加すると、使用されていない全てのイメージも削除対象となり、大幅なディスク容量の解放が期待できます。この強力なコマンドを定期的な運用フローに組み込むことで、ディスク容量の逼迫を防ぎ、Docker環境を常にクリーンに保つことが可能です。
ボリューム管理とデータ永続化の重要性
Dockerコンテナは、その性質上、削除されると内部のデータも一緒に消滅します。これは一時的な処理には適していますが、データベースのデータやユーザーがアップロードしたファイルなど、永続的に保存する必要があるデータには不向きです。このような問題に対処するため、Dockerでは「ボリューム」という仕組みが提供されています。ボリュームを使用することで、コンテナのライフサイクルとは独立してデータを保存し、コンテナが削除されてもデータが失われることを防ぎます。
最も一般的なボリュームの使用方法は、ホストOS上のディレクトリをコンテナ内にマウントする「バインドマウント」です。これはdocker run -v /host/path:/container/path <イメージ名>のように-vオプションで指定します。例えば、WebサーバーのコンテンツをホストOSの特定ディレクトリから提供したり、データベースのデータをホストOSに保存したりする場合に利用されます。
もう一つは、Dockerが管理する「匿名ボリューム」または「名前付きボリューム」を使用する方法です。名前付きボリュームは、docker volume create <ボリューム名>で作成し、docker run -v <ボリューム名>:/container/path <イメージ名>でコンテナにアタッチします。これにより、ボリュームの実体がどこにあるかを意識せずにデータ永続化を実現できます。docker volume lsで既存のボリュームを確認し、docker volume rm <ボリューム名>で不要なボリュームを削除できますが、大切なデータを誤って削除しないよう十分な注意が必要です。
出典:Dockerコンテナとコンテナイメージの管理(LPI-Japan)
動作環境のトラブルシューティングとコンテナ一括管理の具体例
コンテナ起動失敗時の診断と復旧手順
Dockerコンテナが期待通りに起動しない、または起動後すぐに停止してしまう状況は、運用中に頻繁に発生する可能性があります。このようなトラブルに直面した際の診断と復旧手順を理解しておくことは、システムを迅速に復旧させる上で不可欠です。まず、docker ps -aコマンドを実行して、停止しているコンテナを含め、すべてのコンテナの状態を確認します。ここで停止しているコンテナがあれば、そのコンテナIDを控えます。
次に、最も重要なステップとして、docker logs <コンテナIDまたはコンテナ名>コマンドを使用して、該当コンテナのログを詳細に確認します。ログには、起動失敗の原因となったエラーメッセージや警告が出力されていることが多く、ポートの競合、必要なファイルが見つからない、設定ファイルのエラー、メモリ不足などの具体的な問題を示唆している場合があります。例えば、「Address already in use」というエラーはポート競合を示しています。
さらに、docker inspect <コンテナIDまたはコンテナ名>コマンドで、コンテナの詳細な設定情報(ネットワーク設定、マウントされたボリューム、環境変数、リソース制限など)を調査することも有効です。これらの情報とログを照らし合わせることで、問題の根本原因を特定しやすくなります。原因が特定できたら、設定ファイルの修正、ポートの変更、リソースの増強などの適切な対策を講じ、再度コンテナを起動(docker startまたはdocker run)して動作を確認します。迅速なトラブルシューティングのためには、これらのコマンドを効果的に活用するスキルが求められます。
Docker Composeによる複数コンテナの統合管理
現代のアプリケーションは、Webサーバー、データベース、キャッシュサーバー、メッセージキューなど、複数のコンポーネントで構成されることが一般的です。これらの各コンポーネントを個別のDockerコンテナとして管理する場合、一つ一つ手動で起動・停止・設定を行うのは非常に手間がかかり、ミスが発生するリスクも高まります。このような課題を解決するのが、Docker Composeです。
Docker Composeは、YAML形式のファイル(docker-compose.yml)に複数のコンテナサービスの設定、ネットワーク、ボリュームなどを一元的に定義し、単一のコマンドでアプリケーション全体を管理できるツールです。例えば、Webアプリケーションとデータベースからなる環境を、docker compose up -dというコマンド一つでまとめて起動できます。これにより、開発環境のセットアップが劇的に簡素化され、メンバー間での環境差異による「開発環境では動くが本番環境で動かない」といった問題が根本的に解決されます。
このアプローチは「構成のコード化(IaC: Infrastructure as Code)」の典型的な例であり、環境構築の手順をテキストファイルとして定義・共有することで、再現性と保守性を大幅に向上させます。また、docker compose downコマンドで、定義されたすべてのサービスとネットワークを一度に停止・削除できるため、クリーンアップも容易です。Docker Composeを導入することで、複雑な多層アプリケーションの管理がシンプルかつ効率的になり、開発者体験と運用の安定性が向上します。
コンテナのヘルスチェックと監視のベストプラクティス
Dockerコンテナが「実行中」であるというステータスだけでは、そのコンテナ内で動作しているアプリケーションが実際に健全であるとは限りません。例えば、Webサーバーのプロセス自体は動いていても、内部でデータベース接続に失敗している、あるいは特定のエンドポイントがエラーを返しているといった状況も考えられます。このようなアプリケーションレベルの異常を早期に検知し、自動的に対応するために、ヘルスチェックの導入が推奨されます。
DockerfileにはHEALTHCHECK命令を記述することで、コンテナが特定のコマンドを定期的に実行し、その終了コードに基づいてコンテナのヘルスステータスを評価するよう設定できます。例えば、HEALTHCHECK CMD curl --fail http://localhost/health || exit 1のように定義することで、Webサーバーの特定のパスにアクセスして正常な応答がなければ「unhealthy」と判断させることが可能です。これにより、異常なコンテナを自動的に再起動させたり、ロードバランサーから切り離したりといった自動化された運用が可能になります。
さらに、システム全体の安定性を確保するためには、ログ監視やリソース監視を継続的に行うことがベストプラクティスです。docker logs -fでリアルタイムのアプリケーションログを追跡し、docker statsでCPUやメモリの使用状況を定期的にチェックすることで、潜在的な問題を早期に発見できます。これらのヘルスチェックと監視の仕組みを組み合わせることで、コンテナ環境の信頼性を高め、アプリケーションのダウンタイムを最小限に抑えることが可能になります。
出典:ログとトラブルシューティング(Docker-docs-ja)、Dockerコンテナ運用トラブルシューティング(Qiita)
Docker運用で陥りがちな権限問題とディスク容量の注意点
コンテナ内のユーザー権限設定とセキュリティ対策
Dockerコンテナを安全に運用するためには、コンテナ内のユーザー権限管理が非常に重要です。デフォルトでは、コンテナ内のプロセスはrootユーザーとして実行されることが多く、これはセキュリティ上のリスクを高めます。もしコンテナが攻撃を受けた場合、root権限で実行されているとホストシステム全体に影響が及ぶ可能性があります。このリスクを軽減するため、コンテナ内のアプリケーションプロセスは非特権ユーザーで実行するべきです。
Dockerfile内でUSER命令を使用することで、コンテナ内のどのユーザーでプロセスを実行するかを指定できます。例えば、RUN adduser --system --no-create-home appuserで非特権ユーザーを作成し、その後にUSER appuserと指定することで、後続のコマンドやアプリケーションがこの非特権ユーザーとして実行されるようになります。これにより、万が一コンテナが侵害されたとしても、攻撃者が得られる権限が制限され、ホストシステムへの影響を最小限に抑えることが可能です。
また、ボリュームマウントを行う際には、ホストOS上のファイルやディレクトリの権限と、コンテナ内のユーザーの権限が適切に設定されているかを確認することも重要です。権限の不一致は、ファイルへの書き込みエラーやアプリケーションの起動失敗につながることがあります。このようなセキュリティ対策は、堅牢なDocker運用環境を構築する上で不可欠であり、ベースイメージの選択から、個々のユーザー権限の設定まで、細部にわたる注意が求められます。
ディスク容量逼迫を防ぐためのクリーンアップ戦略
Dockerを長期間運用していると、使われなくなったコンテナ、古くなったイメージ、参照されなくなったボリュームなどがシステム上に蓄積され、気づかないうちにディスク容量を圧迫することがあります。このような状態は「運用の無秩序化」と呼ばれ、システムのパフォーマンス低下や予期せぬ障害の原因となるため、積極的なクリーンアップ戦略が不可欠です。ディスク容量が逼迫すると、新しいコンテナの起動に失敗したり、既存のコンテナの動作が不安定になったりするリスクが高まります。
最も効果的なクリーンアップコマンドの一つがdocker system pruneです。このコマンドは、停止中のコンテナ、未使用のネットワーク、そしてどのコンテナにもタグ付けされていないダングリングイメージを削除します。さらに、docker system prune -aオプションを使用すると、使用されていない全てのイメージも対象となり、大幅なディスク容量の解放が期待できます。ボリュームも削除したい場合は、docker system prune --volumesオプションを追加します。
これらのクリーンアップ作業を一時的な対処療法として行うだけでなく、定期的な運用フローに組み込むことが重要です。例えば、CI/CDパイプラインの終端でビルドキャッシュを削除したり、cronジョブを設定して定期的にdocker system prune -aを実行したりするなどの自動化を検討すると良いでしょう。これにより、手動による作業負荷を軽減しつつ、常に最適なディスク利用状況を維持し、安定したDocker運用を実現することができます。
【ディスク容量確保のためのDockerクリーンアップ】
-
不要な停止中コンテナの削除:
docker rm $(docker ps -aq) -
使用されていないDockerイメージの削除:
docker rmi $(docker images -qf "dangling=true") -
未使用のボリューム削除(データ削除に注意):
docker volume prune -
全未使用リソースの一括削除:
docker system prune -a -
定期的なクリーンアップを運用フローに組み込む
ベースイメージ選定とイメージサイズの最適化
Dockerイメージのサイズは、デプロイ時間、ストレージ使用量、そしてセキュリティに直接影響を与える重要な要素です。大規模なイメージは、ダウンロードに時間がかかり、CI/CDパイプラインの効率を低下させるだけでなく、不必要なソフトウェアが含まれていることで潜在的なセキュリティ脆弱性を抱えるリスクも高まります。そのため、ベースイメージの選定とイメージサイズの最適化は、効率的かつ安全なDocker運用において欠かせないプロセスです。
ベースイメージを選ぶ際は、必要最小限の要素で構成された軽量なイメージを優先的に選択することが推奨されます。例えば、Debianベースのイメージの代わりに、Alpine Linuxのような非常に小さなディストリビューションをベースとするイメージは、イメージサイズを大幅に削減できます。これにより、イメージのダウンロードやコンテナの起動が高速化され、全体的なシステムリソースの消費も抑えられます。
さらに、イメージサイズを最適化する技術として「マルチステージビルド」があります。これは、複数のFROM命令をDockerfile内で使用し、ビルドに必要なツールや中間成果物を含むステージと、最終的なアプリケーションのみを含む軽量な実行ステージを分離する手法です。これにより、開発やビルドの過程で使われた一時的なファイルや不要な依存関係が最終イメージに含まれることを防ぎます。イメージを小さく保つ努力は、長期的な運用コストの削減とセキュリティ強化に繋がり、より堅牢なDocker環境の構築に貢献します。
出典:Dockerイメージの安全性を高める10のセキュリティハック(Zenn)、ログとトラブルシューティング(Docker-docs-ja)
【ケース】コンテナ異常停止からの復旧と安定運用への学び
架空のケーススタディ:Webサーバーコンテナの異常停止
ここでは、架空のケースとして、ある企業で運用中のWebサーバーコンテナが深夜に突然異常停止した状況を想定してみましょう。このWebサーバーは、顧客向けの重要なサービスを提供しており、停止は直ちにビジネスに影響を及ぼします。深夜の緊急連絡を受け、担当エンジニアはシステムの状況確認から復旧までの対応を迫られました。顧客からのアクセスは途絶え、社内からも「サイトが見られない」との問い合わせが入り始めるなど、緊張感が高まる中での対応となります。
このような状況下では、迅速かつ正確な情報収集と対応が求められます。まず、Webサーバーが稼働しているはずのコンテナが本当に停止しているのか、それともアプリケーション内部でエラーが発生しているだけなのかを判断する必要があります。もしコンテナ自体が停止していれば、何らかの致命的な問題が発生した可能性が高いでしょう。
このケースでは、Webサーバーコンテナが予期せず停止し、docker psコマンドで確認しても該当のコンテナが表示されないという状況でした。しかし、docker ps -aで確認すると、停止状態のコンテナとしてリストアップされており、何らかのエラーで終了したことが示唆されました。このような緊急事態において、次のステップとして、なぜコンテナが停止したのかという根本原因の特定が復旧への鍵となります。
復旧までの具体的なステップと根本原因の特定
前述のWebサーバーコンテナ異常停止のケースにおいて、担当エンジニアは以下の具体的なステップで復旧と原因特定を進めました。まず、docker ps -aで停止しているコンテナのIDを確認し、直ちにdocker logs <コンテナID>コマンドを実行してログを調査しました。ログには、繰り返し出力される「Out of Memory (OOM) error」というメッセージが明確に記録されており、コンテナが割り当てられたメモリ上限を超過したためにOSによって強制終了されたことが判明しました。
さらに、docker inspect <コンテナID>コマンドでコンテナに割り当てられていたメモリ制限(例:"Memory": 536870912、つまり512MB)を確認し、アプリケーションが実際に使用していたメモリ量がこれを超過していたことを確認しました。このOOMエラーが根本原因であることが特定できたため、暫定的な復旧策として、コンテナのメモリ割り当てを増やす対応を行いました。具体的には、docker runコマンドの--memoryオプションの値を増やし、新しい設定でコンテナを再起動しました。
コンテナは無事に起動し、Webサービスも復旧しました。この迅速なコマンドベースでの診断と対応により、サービス停止時間を最小限に抑えることができました。しかし、これはあくまで応急処置であり、なぜメモリ使用量が増加したのか、どのような負荷状況でOOMが発生したのかといった、より詳細な分析と恒久的な対策が求められます。
異常停止から学ぶ安定運用への改善策と予防措置
Webサーバーコンテナの異常停止事例から得られる最も重要な学びは、単に問題を解決するだけでなく、将来的な再発を防ぐための恒久的な改善策と予防措置を講じることです。今回のOOMエラーの根本原因が、アプリケーションのメモリリークや、突発的なアクセス増加によるリソース不足であったと仮定し、以下のような対策が考えられます。
まず、リソース監視の強化です。docker statsだけでなく、PrometheusやGrafanaといった監視ツールを導入し、CPU、メモリ、ディスクI/O、ネットワークなどのリソース使用状況を継続的に監視します。同時に、しきい値を超過した場合に自動的にアラートが発報される仕組みを構築し、問題が顕在化する前に検知できる体制を整えます。次に、DockerfileやDocker Composeファイルに、コンテナのリソース制限(memoryやcpu_shares)を明示的に設定し、特定のコンテナが過剰なリソースを消費しないように制御します。
また、今回のケースではログから問題が早期に特定できましたが、ログの集約・分析システム(ELK Stackなど)を導入することで、複数のコンテナログを効率的に検索・分析できるようになります。さらに、コンテナのヘルスチェックを導入し、アプリケーションの応答性も監視することで、サービスが停止する前に異常を検知し、自動的に復旧させる仕組みを構築することも可能です。これらの改善策を積み重ねることで、IT業界で92%もの企業が活用するコンテナ技術を、より安定した運用へと導くことができます。(Docker Inc.のレポートより)
出典:2025 Dockerアプリケーション開発の現状レポート(Docker Inc.)、Dockerコンテナ運用トラブルシューティング(Qiita)、ログとトラブルシューティング(Docker-docs-ja)
まとめ
よくある質問
Q: Dockerコンテナを実行する基本的なコマンドは何ですか?
A: `docker run` コマンドでイメージからコンテナを起動します。必要なオプションでポート転送やボリュームマウントを設定し、環境に応じた実行が可能です。
Q: 起動中のDockerコンテナの状態を確認するには?
A: `docker ps` コマンドで稼働中のコンテナ一覧と状態が表示されます。停止中のコンテナを含める場合は `-a` オプションを使用し、詳細な情報を得られます。
Q: 不要になったDockerコンテナを安全に削除するにはどうしますか?
A: まず `docker stop [ID]` で停止し、その後 `docker rm [ID]` で削除します。全ての停止コンテナを一括で削除するには `docker container prune` が便利です。
Q: Dockerが使用するディスク容量を確認・管理する方法は?
A: `docker system df` で全体のディスク使用状況を確認できます。不要なイメージやボリューム、キャッシュを削除するには `docker system prune` コマンドが効果的です。
Q: Docker環境のバージョン情報を確認するコマンドは?
A: `docker version` コマンドでDockerクライアントとサーバーのバージョン情報を表示します。これにより環境の互換性や機能の確認が可能です。
