シナリオベースおよびトラブルシューティングの質問
Docker コンテナは実行されていますが、その中のアプリケーションにアクセスできません。この問題をトラブルシューティングするために、最初にどのような手順を踏みますか?
回答:
まず、アプリケーションのエラーを確認するために docker logs <container_id> を確認します。次に、docker ps でポートマッピングを確認し、ホストポートが正しく公開されていることを確認します。最後に、docker exec -it <container_id> bash を使用してコンテナに入り、アプリケーションプロセスが実行されており、期待されるポートでリッスンしているか(例:netstat -tulnp)を確認します。
Docker コンテナが起動直後に繰り返し再起動します。一般的な原因と調査方法は何ですか?
回答:
一般的な原因としては、アプリケーションのエントリポイントスクリプトのエラー、依存関係の不足、またはプロセスを終了させる未処理の例外などが考えられます。クラッシュ前に docker logs <container_id> で出力を確認し、docker inspect <container_id> で RestartCount と ExitCode を確認します。
Docker イメージのビルドを試みていますが、RUN 命令中に「command not found」エラーで失敗します。これをデバッグするにはどうすればよいですか?
回答:
これは通常、コマンドがベースイメージで利用できないか、前の RUN ステップで正しくインストールされていないことを意味します。失敗したコマンドの前に echo ステートメントを追加してパスを確認するか、一時的に RUN コマンドを sh -c 'set -x; <original_command>' に変更してコマンド実行の詳細を確認します。あるいは、失敗したレイヤーまでビルドし、その中間イメージを docker run して対話的にデバッグします。
Docker イメージのサイズが過剰に大きいです。そのサイズを削減するためにどのような戦略を採用しますか?
回答:
ビルド時依存関係と実行時成果物を分離するために、マルチステージビルドを使用します。また、より小さなベースイメージ(例:Alpine)を選択し、不要なファイルやキャッシュを削除し、RUN コマンドを && で結合してレイヤーを最小限に抑えます。関連性のないファイルを排除するために .dockerignore を使用することも重要です。
複数の Docker コンテナ間でデータを共有する必要があります。どのような選択肢があり、それぞれいつ選択しますか?
回答:
選択肢としては、Docker volumes、bind mounts、および共有ネットワークストレージがあります。Docker volumes は、特にデータベースの場合、永続データとデータライフサイクルの管理に推奨されます。Bind mounts は開発に適しており、ホストファイルの変更が即座に反映されます。共有ネットワークストレージ(NFS など)は、複数のホストにわたる共有アクセスを必要とする分散アプリケーション向けです。
Docker コンテナが過剰な CPU/メモリを消費しています。原因を特定し、問題を軽減するにはどうすればよいですか?
回答:
リアルタイムのリソース使用状況を監視するために docker stats を使用します。特定のコンテナが問題である場合は、docker exec を使用してコンテナに入り、top や htop などのツールを使用してプロセスを特定します。軽減策としては、アプリケーションの最適化、docker run 時のリソース制限(--cpus、--memory)の設定、またはサービスのスケールアウトが挙げられます。
Docker イメージを更新しましたが、docker run は古いバージョンを起動します。何が起こっていますか?
回答:
これは通常、使用しているイメージタグ(例:myimage:latest)がローカルで更新されていないことを意味します。まず docker pull myimage:latest を実行して、最新のイメージがダウンロードされていることを確認します。問題が続く場合は、docker images でイメージ ID を確認し、正しいイメージをプルしていることを確認します。
Docker デーモン自体が再起動したり、ホストマシンが再起動したりした場合に、Docker コンテナが自動的に再起動するようにするにはどうすればよいですか?
回答:
コンテナを実行する際に、--restart unless-stopped または --restart always のような再起動ポリシーを使用します。unless-stopped は、コンテナが明示的に停止されない限り再起動しますが、always は手動で停止した場合でも、常にコンテナを再起動します。
同じホスト上の 2 つの Docker コンテナ間のネットワーク接続の問題が発生しています。これを診断するためにどのような手順を踏みますか?
回答:
まず、docker inspect <container_id> を使用して、両方のコンテナが同じ Docker ネットワーク上にあることを確認します。次に、コンテナ名または IP アドレスを使用して、一方のコンテナからもう一方のコンテナに ping を試みます。ホスト上およびコンテナ内のファイアウォールルールを確認し、ポートを公開している場合はポートの競合がないことを確認します。
Docker コンテナは実行されていますが、その中の特定のディレクトリに書き込めません。問題は何でしょうか?
回答:
これは多くの場合、権限の問題です。コンテナに docker exec で入り、ls -ld <directory> を使用してディレクトリの所有権と権限を確認します。コンテナ内でアプリケーションを実行しているユーザーが書き込みアクセス権を持っていない可能性があります。Dockerfile またはエントリポイントスクリプトで chmod または chown を使用して権限を調整することで、これを解決できます。