close

Docker 面接質問と回答

DockerBeginner
オンラインで実践に進む

はじめに

この包括的なガイドへようこそ。このガイドは、次の Docker 面接で成功するために必要な知識と自信を身につけることを目的としています。開発者、DevOps エンジニア、システム管理者であっても、今日のクラウドネイティブな環境において Docker をマスターすることは非常に重要です。このドキュメントでは、基本的な概念やイメージ管理から、高度なオーケストレーション、セキュリティ、トラブルシューティングまで、幅広い Docker のトピックを網羅しています。役割固有の質問や実践的なチャレンジも含まれています。理解を深め、専門知識を披露し、あらゆる Docker 関連の役割で成功するための準備をしましょう。

DOCKER

Docker の基礎とコアコンセプト

Docker とは何か、そしてなぜ使用されるのか?

回答:

Docker は、コンテナ化を使用してアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースプラットフォームです。アプリケーションに一貫した環境を提供するために使用され、開発から本番環境まで、さまざまなコンピューティング環境でアプリケーションが確実に実行されるようにします。


Docker イメージと Docker コンテナの違いを説明してください。

回答:

Docker イメージは、コード、ランタイム、システムツール、システムライブラリ、設定など、ソフトウェアを実行するために必要なすべてを含む、軽量でスタンドアロンの実行可能なパッケージです。Docker コンテナは、Docker イメージの実行可能なインスタンスです。コンテナを作成、開始、停止、移動、削除できます。


Dockerfile とは何か、そしてその目的は何ですか?

回答:

Dockerfile は、イメージを組み立てるためにユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキストドキュメントです。これにより、イメージ作成プロセスを自動化し、アプリケーション環境の再現性とバージョン管理を保証できます。


Docker はどのように分離を実現していますか?

回答:

Docker は主に、名前空間 (namespaces) やコントロールグループ (cgroups) のような Linux カーネルの機能を通じて分離を実現しています。名前空間はシステムリソース(プロセス ID、ネットワークインターフェースなど)の分離されたビューを提供し、cgroups はコンテナのリソース使用量(CPU、メモリ、I/O)を制限および監視します。


Docker ボリュームとは何か、そしてなぜ重要なのか?

回答:

Docker ボリュームは、Docker コンテナによって生成され、使用されるデータを永続化するための推奨されるメカニズムです。コンテナは一時的なものであるため、ボリュームは重要です。ボリュームがないと、コンテナが削除されたときにコンテナ内のデータは失われます。ボリュームにより、データはコンテナよりも長く存続できます。


Docker レイヤーの概念を説明してください。

回答:

Docker イメージは複数の読み取り専用レイヤーで構成されており、各レイヤーは Dockerfile の命令を表します。イメージをビルドすると、各コマンドは前のレイヤーの上に新しいレイヤーを作成します。このレイヤリングにより、効率的なストレージ、共有、キャッシュが可能になり、共通のレイヤーは複数のイメージで再利用できます。


Docker Hub とは?

回答:

Docker Hub は、Docker が提供するクラウドベースのレジストリサービスで、コンテナイメージの検索と共有に使用されます。ユーザーがカスタムイメージをプッシュしたり、公式またはコミュニティ提供のイメージをプルしたりできる中央リポジトリとして機能します。自動ビルドや Webhook も提供しています。


Docker コンテナからホストマシンにポートを公開するにはどうすればよいですか?

回答:

コンテナを実行する際に -p または --publish フラグを使用してポートを公開します。例えば、docker run -p 8080:80 my_image は、コンテナ内のポート 80 をホストマシンのポート 8080 にマッピングし、外部からのアクセスを可能にします。


.dockerignore ファイルの目的は何ですか?

回答:

.dockerignore ファイルは .gitignore に似ており、Docker イメージのビルド時に除外するファイルやディレクトリを指定します。その目的は、不要なファイル(ソースコード、ビルド成果物、機密データなど)がイメージにコピーされるのを防ぎ、イメージサイズとビルド時間を削減することです。


Docker デーモン (dockerd) について簡単に説明してください。

回答:

Docker デーモン (dockerd) は、ホストマシン上で実行され、イメージ、コンテナ、ネットワーク、ボリュームなどの Docker オブジェクトを管理するバックグラウンドサービスです。Docker API リクエストをリッスンし、それらを処理して、イメージのビルド、コンテナの実行、ストレージの管理などのタスクを実行します。


Dockerfile とイメージ管理

Dockerfile とは何か、そしてなぜ使用されるのか?

回答:

Dockerfile は、イメージを組み立てるためにユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキストドキュメントです。これにより、Docker イメージの作成プロセスを自動化し、さまざまな環境での一貫性と再現性を確保します。


Dockerfile における FROM 命令の目的を説明してください。

回答:

FROM 命令は新しいビルドステージを初期化し、後続の命令のベースイメージを設定します。すべての Dockerfile は FROM で始まり、イメージがビルドされる親イメージを指定します。例:FROM ubuntu:22.04


Dockerfile における CMDENTRYPOINT の違いは何ですか?

回答:

CMD は実行中のコンテナのデフォルト引数を提供し、コマンドライン引数で上書きできます。ENTRYPOINT は実行可能ファイルとして実行されるコンテナを設定し、その引数は通常固定されており、CMD はそれに加えてパラメータを提供します。


Docker のビルドキャッシュはどのように機能し、なぜ重要なのか?

回答:

Docker はビルドプロセス中に各レイヤーをキャッシュします。命令とそのコンテキストが前回のビルドから変更されていない場合、Docker はキャッシュされたレイヤーを再利用し、後続のビルドを大幅に高速化します。これは効率的な開発ワークフローにとって非常に重要です。


.dockerignore ファイルとは何か、そしてその目的は何ですか?

回答:

.dockerignore ファイルは、ビルドコンテキストが Docker デーモンに送信される際に除外されるファイルやディレクトリのリストです。これにより、不要なファイルがイメージに含まれるのを防ぎ、イメージサイズとビルド時間を削減します。これは .gitignore と同様です。


Dockerfile におけるマルチステージビルドの概念を説明してください。

回答:

マルチステージビルドを使用すると、Dockerfile で複数の FROM ステートメントを使用でき、それぞれが新しいビルドステージを開始します。これは、ビルド時の依存関係と実行時の依存関係を分離するために使用され、前のステージから必要な成果物のみをコピーすることで、より小さく、より安全な最終イメージを作成します。


Docker イメージのサイズを削減するにはどうすればよいですか?

回答:

イメージサイズを削減するには、最小限のベースイメージ(例:Alpine)を使用し、マルチステージビルドを活用し、インストール後に不要なファイルやキャッシュをクリーンアップし、RUN コマンドを統合してレイヤーを最小限に抑え、.dockerignore を使用してビルドコンテキストから関連性のないファイルを排除します。


Docker イメージレイヤーとは何か、そしてなぜ重要なのか?

回答:

Docker イメージは複数の読み取り専用レイヤーで構成されており、各レイヤーは Dockerfile の命令を表します。レイヤーは、キャッシュとイメージ間の共通レイヤーの共有を通じて、効率的なストレージと配布を可能にし、ディスク容量とダウンロード時間を削減します。


Dockerfile で ADDCOPY を使い分けるのはいつですか?

回答:

COPY はローカルファイルまたはディレクトリのみをイメージにコピーするため、一般的に推奨されます。ADD は URL やローカルパスからの tarball を自動的に展開するなどの追加機能がありますが、慎重に管理しないと予期しない動作やセキュリティリスクにつながる可能性があります。


Docker イメージにタグを付ける方法と、タグ付けが重要な理由は何ですか?

回答:

イメージにタグを付けるには、docker build -t <image_name>:<tag> . または docker tag <source_image>:<source_tag> <target_image>:<target_tag> を使用します。タグ付けは、イメージのバージョン管理、異なるビルド(例:latestdevv1.0)の識別、レジストリへのプッシュに不可欠です。


WORKDIR 命令は何に使用されますか?

回答:

WORKDIR 命令は、Dockerfile でそれに続くすべての RUNCMDENTRYPOINTCOPY、または ADD 命令の作業ディレクトリを設定します。これにより、コンテナ内のファイルシステムが整理され、デフォルトのパスが提供されることで後続のコマンドが簡素化されます。


コンテナオーケストレーション (Docker Compose & Swarm)

Docker Compose とは何か、そしていつ使用するのか?

回答:

Docker Compose は、マルチコンテナ Docker アプリケーションを定義および実行するためのツールです。YAML ファイルを使用してアプリケーションのサービス、ネットワーク、ボリュームを設定し、単一のコマンド (docker compose up) ですべてを起動します。ローカル開発環境やテストに最適です。


docker-compose.yml ファイルの主要なコンポーネントを説明してください。

回答:

docker-compose.yml ファイルには通常、services(Web サーバー、データベースなどのアプリケーションコンポーネントを定義)、networks(サービス間通信用)、および volumes(永続データストレージ用)が含まれます。各サービスは、イメージ、ポート、環境変数、および依存関係を指定します。


Docker Compose を使用してサービスをスケーリングするにはどうすればよいですか?

回答:

Compose は主に単一ホスト環境向けですが、docker compose up--scale フラグを使用することでサービスをスケーリングできます。例えば、docker compose up --scale web=3 は 'web' サービスのインスタンスを 3 つ起動します。真の分散スケーリングには、Docker Swarm または Kubernetes が使用されます。


Docker Swarm とは何か、そして Docker Compose との違いは何ですか?

回答:

Docker Swarm は、Docker エンジンのクラスターを管理するための Docker ネイティブのコンテナオーケストレーションソリューションです。Compose は単一ホスト上のマルチコンテナアプリの定義と実行用ですが、Swarm はそれらのアプリケーションを複数のホスト(ノード)にわたって耐障害性のある方法でデプロイおよびスケーリングすることを可能にします。


Docker Swarm における「マネージャー」ノードと「ワーカー」ノードの役割を説明してください。

回答:

マネージャーノードは、望ましい状態の維持、タスクのスケジューリング、サービス検出などのクラスター管理タスクを処理します。ワーカーノードはマネージャーノードからタスクを受け取り、実行し、実際のコンテナを実行します。高可用性のために、Swarm は複数のマネージャーノードを持つべきです。


Docker Swarm を初期化し、ノードを追加するにはどうすればよいですか?

回答:

マネージャーノードで docker swarm init を使用して Swarm を初期化します。このコマンドは参加トークンを出力します。ワーカーノードを追加するには、各ワーカーで docker swarm join --token <token> <manager-ip>:<port> を実行します。マネージャーは、異なる参加トークンを使用して同様に追加できます。


Docker Swarm のコンテキストにおける「サービス」とは何ですか?

回答:

Docker Swarm では、「サービス」は Swarm 上で実行したいタスクの定義です。どの Docker イメージを使用するか、いくつのレプリカを実行するか、どのポートを公開するか、その他のデプロイ設定を定義します。Swarm は、指定された数のサービスレプリカが常に実行されていることを保証します。


Docker Swarm はサービス検出とロードバランシングをどのように処理しますか?

回答:

Docker Swarm は組み込みの DNS ベースのサービス検出を備えており、サービスは名前で互いを見つけることができます。また、内部ロードバランシング(ルーティングメッシュ)も提供しており、リクエストがレプリカを実行していないノードにヒットした場合でも、サービスのすべての正常なレプリカにリクエストを分散します。


Docker Swarm における「ローリングアップデート」の概念を説明してください。

回答:

ローリングアップデートにより、ダウンタイムなしでサービスを新しいバージョンに更新できます。Swarm はレプリカを段階的に更新し、新しいコンテナで古いコンテナを 1 つずつまたはバッチで置き換えることで、新しいコンテナが正常になるまで十分な数の古いコンテナが実行され続けることを保証します。


Kubernetes ではなく Docker Swarm を選択する場合、またはその逆の場合はどのようなときですか?

回答:

よりシンプルでネイティブな Docker オーケストレーション、簡単なセットアップ、および複雑さをあまり必要としない場合は Docker Swarm を選択します。非常に複雑で大規模なデプロイ、自動スケーリングやセルフヒーリングなどの高度な機能、およびより広範なエコシステムが必要な場合は Kubernetes を選択しますが、多くの場合、複雑さが増し、学習曲線が急になります。


Docker におけるネットワーキングとストレージ

Docker で利用可能なデフォルトのネットワークドライバーと、それぞれの主なユースケースを説明してください。

回答:

Docker にはいくつかのデフォルトのネットワークドライバーがあります。bridge(スタンドアロンコンテナのデフォルト、隔離されたネットワーク)、host(コンテナがホストのネットワークスタックを共有、隔離なし)、および none(コンテナにネットワークインターフェイスがない)です。overlay は Swarm でのマルチホスト通信に使用され、macvlan はコンテナに MAC アドレスを割り当て、ネットワーク上の物理デバイスのように見せます。


Docker におけるユーザー定義ブリッジネットワークの目的は何ですか?また、デフォルトのブリッジネットワークとの違いは何ですか?

回答:

ユーザー定義ブリッジネットワークは、デフォルトのブリッジネットワークと比較して、より優れた隔離、名前によるコンテナ間の自動 DNS 解決、および簡単なポートマッピング管理を提供します。ユーザー定義ブリッジ上のコンテナは、ホストでの明示的なポートマッピングなしに、サービス名を使用して互いに通信できます。


実行中のコンテナを実行中のユーザー定義ネットワークに接続するにはどうすればよいですか?

回答:

docker network connect コマンドを使用して、実行中のコンテナを実行中のユーザー定義ネットワークに接続できます。例:docker network connect my_network my_container。これにより、コンテナはそのネットワーク上の他のコンテナと通信できるようになります。


Docker で利用可能なさまざまな種類のストレージについて説明し、それぞれいつ使用するかを説明してください。

回答:

Docker は volumesbind mounts、および tmpfs mounts を提供します。Volumes は永続データのための推奨される方法であり、Docker によって管理され、データベースに最適です。Bind mounts はホストパスをコンテナパスに直接リンクし、開発や設定ファイルに役立ちます。Tmpfs mounts はホストのメモリにデータを保存し、非永続的で機密性の高いデータに適しています。


Docker volumes とは何か、そして bind mounts と比較した場合の利点は何ですか?

回答:

Docker volumes は、Docker コンテナによって生成され、使用されるデータを永続化するための推奨される方法です。これらは Docker によって完全に管理されており、バックアップ、移行、管理が容易です。Volumes は bind mounts よりもパフォーマンスが高く、特に I/O 負荷の高いワークロードに適しており、さまざまなオペレーティングシステムで機能します。


名前付き Docker volume を作成して使用するにはどうすればよいですか?

回答:

名前付き volume は docker volume create my_data を使用して作成できます。コンテナで使用するには、コンテナ作成時に -v フラグで指定します:docker run -d -v my_data:/app/data my_image。これにより、my_data volume がコンテナ内の /app/data にマウントされます。


Docker ストレージにおける「コピーオンライト」メカニズムの概念を説明してください。

回答:

コピーオンライト(CoW)メカニズムは、Docker のイメージレイヤーによって使用されます。コンテナが起動すると、不変のイメージレイヤーの上に薄い書き込み可能なレイヤーが提供されます。コンテナによって行われた変更は、この最上位レイヤーにのみ書き込まれ、下位のイメージレイヤーは変更されません。これにより、ストレージが最適化され、複数のコンテナが同じベースイメージを効率的に共有できます。


Docker でネットワークの詳細やボリューム情報を検査するにはどうすればよいですか?

回答:

ネットワークの詳細を検査するには、docker network inspect <network_name_or_id> を使用します。これにより、接続されているコンテナ、サブネット、ゲートウェイを含む包括的な情報が提供されます。ボリューム情報については、docker volume inspect <volume_name> を使用します。これにより、マウントポイント、ドライバー、その他のメタデータが表示されます。


bridge ネットワークドライバーよりも host ネットワークドライバーを選択するのはどのような場合ですか?

回答:

最大のネットワークパフォーマンスが必要な場合や、ポートマッピングなしでホストネットワークサービスに直接アクセスしたい場合は、host ネットワークドライバーを選択します。これは、パフォーマンスが重要なアプリケーションや、コンテナが特定のホストポートに直接バインドする必要があり、Docker のネットワークスタックをバイパスする場合によく使用されます。


Docker でストレージを管理するための --mount フラグと -v フラグの比較における重要性は何ですか?

回答:

--mount フラグは、ストレージ(volumes、bind mounts、tmpfs mounts)を管理するための、より新しく、より明示的で、推奨される構文です。キーと値のペアを使用して明確にし、マウントタイプとオプションを読みやすく理解しやすくします。-v フラグはショートカットであり、ソースパスに基づいてボリュームか bind mount かが曖昧になる可能性があります。


シナリオベースおよびトラブルシューティングの質問

Docker コンテナは実行されていますが、その中のアプリケーションにアクセスできません。この問題をトラブルシューティングするために、最初にどのような手順を踏みますか?

回答:

まず、アプリケーションのエラーを確認するために docker logs <container_id> を確認します。次に、docker ps でポートマッピングを確認し、ホストポートが正しく公開されていることを確認します。最後に、docker exec -it <container_id> bash を使用してコンテナに入り、アプリケーションプロセスが実行されており、期待されるポートでリッスンしているか(例:netstat -tulnp)を確認します。


Docker コンテナが起動直後に繰り返し再起動します。一般的な原因と調査方法は何ですか?

回答:

一般的な原因としては、アプリケーションのエントリポイントスクリプトのエラー、依存関係の不足、またはプロセスを終了させる未処理の例外などが考えられます。クラッシュ前に docker logs <container_id> で出力を確認し、docker inspect <container_id>RestartCountExitCode を確認します。


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 を使用してコンテナに入り、tophtop などのツールを使用してプロセスを特定します。軽減策としては、アプリケーションの最適化、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 を使用して権限を調整することで、これを解決できます。


Docker のセキュリティとベストプラクティス

Docker コンテナを使用する際の主なセキュリティ上の懸念事項は何ですか?

回答:

主な懸念事項としては、コンテナエスケープ、安全でないイメージ、誤設定されたデーモン、権限昇格、サービス拒否、機密データの漏洩などが挙げられます。ホスト、イメージ、コンテナ、ネットワークを保護することが重要です。


Docker イメージのアタックサーフェスを最小限に抑えるにはどうすればよいですか?

回答:

最小限のベースイメージ(例:Alpine)を使用し、不要なパッケージや依存関係を削除し、開発ツールのインストールを避け、マルチステージビルドを使用してビルド時依存関係と実行時成果物を分離します。


なぜコンテナを root として実行するのは悪いプラクティスであり、代替手段は何ですか?

回答:

root として実行すると過剰な権限が付与され、侵害された場合にコンテナエスケープや権限昇格のリスクが高まります。代替手段は、コンテナ内に専用の非 root ユーザーを作成し、そのユーザーとしてプロセスを実行することです。


Docker の文脈における最小権限の原則を説明してください。

回答:

これは、コンテナまたはプロセスが機能するために必要な権限のみを付与することを意味します。これには、ケーパビリティの制限、--privileged フラグの回避、ボリュームマウントの制限、および非 root ユーザーとしての実行が含まれます。


Docker Content Trust と Docker Notary とは何ですか?また、それらはどのようにセキュリティを強化しますか?

回答:

Docker Content Trust (DCT) は、イメージ発行者がイメージに署名し、消費者がイメージの整合性と信頼性を検証できるようにします。Notary は、暗号学的に安全な公開と検証を提供する基盤となるテクノロジーです。


Docker コンテナ内で機密情報(API キー、パスワードなど)を安全に管理するにはどうすればよいですか?

回答:

Dockerfile に秘密情報をハードコーディングしたり、バージョン管理にコミットしたりしないでください。Docker Secrets(Swarm 用)または Kubernetes Secrets(Kubernetes 用)、環境変数(注意して使用)、または HashiCorp Vault のような外部の秘密管理ツールを使用します。


Docker のデフォルトの seccomp プロファイルは何のためにありますか?

回答:

デフォルトの seccomp(secure computing mode)プロファイルは、コンテナがカーネルに対して実行できるシステムコールを制限します。これにより、悪意のある、または不要なシステムコールを防ぐことで、アタックサーフェスが大幅に削減されます。


Docker イメージの脆弱性をスキャンするにはどうすればよいですか?

回答:

Clair、Trivy、Anchore Engine、または Docker Scout のような脆弱性スキャンツールを使用します。これらのツールは、インストールされているパッケージや依存関係の既知の脆弱性についてイメージレイヤーを分析し、実行可能なレポートを提供します。


Docker デーモンを保護するためのベストプラクティスをいくつか教えてください。

回答:

Docker ソケットへのアクセスを制限し、リモートアクセスに TLS を有効にし、適切なロギングを設定し、デーモンと Docker エンジンを最新の状態に保ち、信頼されていないネットワークにデーモンを公開しないようにします。


Docker イメージと Docker エンジンを定期的に更新すべき理由は何ですか?

回答:

定期的な更新により、ベースイメージと Docker エンジン自体の両方に対する最新のセキュリティパッチとバグ修正を入手できます。これにより、既知の脆弱性が軽減され、システム全体の安定性が向上します。


Docker の高度なトピックとパフォーマンス最適化

Docker Overlay Networks の概念と、それを使用する場面について説明してください。

回答:

Docker Overlay Networks は、異なる Docker デーモンホスト上で実行されている Docker コンテナ間の通信を可能にします。これらは、Docker Swarm や Kubernetes クラスターのようなマルチホストコンテナオーケストレーションに不可欠であり、複雑なルーティング設定なしにノード間でサービスがシームレスに通信できるようにします。


Docker Content Trust (DCT) の目的と、その仕組みは何ですか?

回答:

Docker Content Trust (DCT) は、イメージ発行者の暗号学的検証と整合性を提供します。これにより、レジストリからプルされたイメージが信頼できる発行者によって署名されていることを保証し、改ざんされた、または不正なイメージの使用を防ぎます。これは、Notary を使用してイメージマニフェストに署名および検証することで機能します。


Docker コンテナが消費できるリソース(CPU、メモリ)を制限するにはどうすればよいですか?

回答:

リソース制限は docker run フラグを使用して設定できます。CPU については --cpus(例:--cpus='1.5')または --cpu-shares を使用します。メモリについては --memory(例:--memory='2g')および --memory-swap を使用します。これらの設定により、単一のコンテナがホストリソースを独占するのを防ぎます。


Dockerfile における COPYADD の違いを説明してください。

回答:

COPY は、ビルドコンテキストからローカルファイルまたはディレクトリをイメージにコピーします。ADD は同様の機能を持っていますが、ソースからの tar アーカイブを展開したり、URL からファイルをダウンロードしたりすることもできます。一般的に、ADD の追加機能が特に必要でない限り、明確さとセキュリティのために COPY が推奨されます。


Docker におけるマルチステージビルドとは何ですか?また、その利点は何ですか?

回答:

マルチステージビルドは、単一の Dockerfile で複数の FROM 命令を使用し、各 FROM で前のステージの成果物を破棄できます。これにより、最終的な、より小さなランタイムイメージに必要なビルド成果物(例:コンパイル済みバイナリ)のみをコピーすることで、最終イメージサイズが大幅に削減され、セキュリティとデプロイ速度が向上します。


Docker イメージのサイズとビルド速度を最適化するにはどうすればよいですか?

回答:

イメージサイズの最適化には、マルチステージビルドの使用、より小さなベースイメージ(例:Alpine)の選択、.dockerignore の活用、および RUN コマンドの統合を行います。ビルド速度の最適化には、レイヤーキャッシュを最大化するように Dockerfile 命令を並べ替え、.dockerignore ファイルを使用し、ビルドコンテキストを最小限に抑えます。


Docker のストレージドライバーと、それらがパフォーマンスに与える影響について説明してください。

回答:

Docker は、レイヤーの保存方法と結合方法を管理するためにストレージドライバー(例:OverlayFS、AUFS、Btrfs)を使用します。OverlayFS は、特に読み取り負荷の高いワークロードにおいて、そのパフォーマンスとシンプルさから一般的に推奨されます。ドライバーの選択は、コンテナの起動時間、書き込みパフォーマンス、および全体的なディスク I/O に影響します。


Docker Swarm Mode とは何ですか?また、Kubernetes との違いは何ですか?

回答:

Docker Swarm Mode は、Docker エンジンのクラスターを管理するための Docker のネイティブオーケストレーションツールです。Kubernetes よりもセットアップと使用が簡単で、小規模なデプロイメントや、すでに Docker エコシステムに深く投資している場合に適しています。Kubernetes は、より強力で機能が豊富、かつ複雑なオーケストレーターであり、大規模な本番環境デプロイメントで広く採用されています。


再起動を繰り返す Docker コンテナのトラブルシューティング方法を教えてください。

回答:

まず、docker logs <container_id> を使用してコンテナログを確認します。次に、docker inspect <container_id> でコンテナの状態を検査し、終了コードと再起動ポリシーを確認します。また、コンテナをインタラクティブに実行(docker run -it ...)して動作を直接観察したり、アタッチ(docker attach)したりすることもできます。


Docker のネットワーキングモードと、それらのユースケースを説明してください。

回答:

Docker にはいくつかのネットワーキングモードがあります:bridge(デフォルト、コンテナ用の分離されたネットワーク)、host(コンテナがホストのネットワークスタックを共有)、none(ネットワークインターフェイスなし)、および overlay(マルチホスト通信用)。bridge は単一ホストアプリに一般的で、host は直接ポートアクセスを必要とするパフォーマンス重視のアプリに、overlay は分散サービスに使用されます。


役割別の質問(開発者、DevOps、管理者)

開発者:Docker イメージを可能な限り小さくするにはどうすればよいですか?

回答:

ビルド時依存関係と実行時依存関係を分離するためにマルチステージビルドを使用します。さらに、Alpine のようなより小さなベースイメージを活用し、RUN コマンドを統合し、不要なファイルやキャッシュを削除します。


開発者:.dockerignore ファイルの目的を説明し、その使用例を挙げてください。

回答:

.dockerignore ファイルは、Docker イメージをビルドする際に除外するファイルとディレクトリを指定します。.gitignore と同様です。これにより、不要なファイルがビルドコンテキストに追加されるのを防ぎ、ビルドの高速化とイメージサイズの削減につながります。例:*.log または node_modules/


DevOps:Docker 化されたアプリケーションの CI/CD パイプラインをどのように実装しますか?

回答:

CI/CD ツール(例:Jenkins、GitLab CI、GitHub Actions)を使用して、コードコミット時の Docker イメージのビルド、テストの実行、レジストリへのイメージのプッシュ、およびターゲット環境(例:Kubernetes、Docker Swarm)へのデプロイを自動化します。


DevOps:Docker 化された環境で秘密情報(API キー、データベースパスワードなど)をどのように扱いますか?

回答:

開発では、環境変数または .env ファイルを使用することがあります。本番環境では、安全な保存と注入のために Docker Secrets または Kubernetes Secrets を優先します。Vault または同様の秘密管理ツールを統合して、より高度なシナリオに対応することもできます。


DevOps:本番環境で Docker コンテナのローリングアップデートとロールバックを行うための戦略は何ですか?

回答:

Docker Swarm または Kubernetes のようなオーケストレーションツールを使用します。これらは、古いコンテナを新しいコンテナに徐々に置き換えることで、ローリングアップデートをネイティブにサポートします。ロールバックについては、オーケストレーションプラットフォームの機能を利用して、以前のイメージタグまたはデプロイメント構成に戻すことができます。


管理者:Docker コンテナと Docker デーモンのヘルス状態とパフォーマンスをどのように監視しますか?

回答:

簡単なチェックには docker stats を使用します。包括的な監視のために、Prometheus や Grafana のようなツールと統合して、cgroups および Docker API からメトリクス(CPU、メモリ、ネットワーク I/O)を収集し、アラートを設定します。


管理者:Docker のネットワーキングモードと、それぞれの使用場面について説明してください。

回答:

一般的なモードには、bridge(デフォルト、コンテナ用の分離されたネットワーク)、host(コンテナがホストのネットワークスタックを共有)、および none(ネットワークインターフェイスなし)があります。bridge はほとんどのアプリケーションに、host は直接ポートアクセスを必要とするパフォーマンス重視のアプリに、none は特殊なケースやデバッグに使用されます。


管理者:Docker Swarm とは何ですか?また、Kubernetes ではなく Swarm を選択するのはどのような場合ですか?

回答:

Docker Swarm は、Docker ホストのクラスターを管理するための Docker のネイティブオーケストレーションツールです。Swarm は、Kubernetes よりも学習と管理が容易なため、よりシンプルで小規模なデプロイメント、または迅速なセットアップと最小限のオーバーヘッドが必要な場合に選択します。


管理者:Docker コンテナの永続データをどのように管理しますか?

回答:

永続データストレージには Docker volumes を使用します。これらは Docker によって管理され、コンテナのライフサイクルとは独立しています。開発時やホストファイルシステムへのアクセスが必要な場合は、bind mounts を使用することもできます。


管理者:Docker Compose を使用するシナリオを説明してください。

回答:

Docker Compose を使用して、マルチコンテナ Docker アプリケーションを定義および実行します。例えば、Web アプリケーション、データベース、キャッシュサービスで構成されるローカル開発環境をセットアップするために使用します。これらはすべて単一の docker-compose.yml ファイルで定義されます。


実践的でハンズオンなチャレンジ

イメージをビルドする Dockerfile がありますが、レイヤーが多くビルドプロセスが非常に遅いです。ビルド時間とイメージサイズを削減するために、Dockerfile をどのように最適化しますか?

回答:

最適化のために、頻繁に変更される命令(COPY アプリケーションコードなど)を、あまり変更されない命令(FROMRUN apt-get update など)の後ろに配置するように命令を並べ替えます。また、レイヤー数を減らすために && を使用して RUN コマンドを統合し、同じ RUN コマンド内で不要なファイル(rm -rf /var/lib/apt/lists/*)を削除します。


Go アプリケーションのために、小さく本番環境に適した Docker イメージを作成するマルチステージビルドをどのようにセットアップするか説明してください。

回答:

最初のステージでは、Go ビルダーイメージを使用してアプリケーションをコンパイルします。2 番目のステージでは、scratchalpine のような最小限のベースイメージを使用し、最初のステージからコンパイル済みのバイナリのみをコピーします。これにより、ビルドツールや依存関係を除外することで、最終的なイメージサイズが大幅に削減されます。


データベースコンテナ(例:PostgreSQL)とそれに接続するアプリケーションコンテナを実行する必要があります。それらが通信できるようにし、データベースデータがコンテナの再起動後も永続化されるようにするにはどうすればよいですか?

回答:

Docker ネットワーク(例:docker network create my-app-net)を使用して両方のコンテナを接続します。データ永続化のために、Docker volume(docker volume create pg-data)を使用し、それをデータベースコンテナのデータディレクトリにマウントします(-v pg-data:/var/lib/postgresql/data)。


Docker コンテナがすぐに消えてしまうエラーメッセージで起動に失敗しています。この問題をどのようにデバッグしますか?

回答:

docker logs <container_id_or_name> を使用してコンテナの出力を表示します。すぐに終了する場合は、Dockerfile の CMD または ENTRYPOINTtail -f /dev/null または sleep infinity コマンドを追加します(または docker run でオーバーライドします)。これにより、コンテナが検査のために実行されたままになり、その後 docker exec でコンテナに入ることができます。


マルチサービスアプリケーション用の docker-compose.yml ファイルがあります。特定のサービス(例:Web サーバー)を複数のインスタンスで実行するようにスケールするにはどうすればよいですか?

回答:

docker-compose up --scale web=3 コマンドを使用します。ここで web はサービス名、3 は希望するインスタンス数です。Docker Compose は、リバースプロキシが配置されている場合、通常はロードバランシングを行いながら、'web' サービス用に 3 つの別々のコンテナを起動します。


Dockerfile における COPYADD の違いと、それぞれの使用場面について説明してください。

回答:

COPY は、ビルドコンテキストからローカルファイルまたはディレクトリをイメージにコピーします。ADD には追加機能があります。tar ファイルを展開したり、URL からファイルをダウンロードしたりできます。一般的に、明確さと予測可能性のために COPY が推奨され、ADD はその追加機能が特に必要な場合にのみ使用されます。


未使用の Docker リソース(イメージ、コンテナ、ボリューム、ネットワーク)をクリーンアップしてディスク容量を解放するにはどうすればよいですか?

回答:

docker system prune を使用します。このコマンドは、停止中のすべてのコンテナ、すべてのダングリングイメージ、すべてのダングリングビルドキャッシュを削除し、オプションですべての未使用のボリューム(-v)とネットワークも削除します。ディスク容量を回復するための包括的な方法です。


実行中のコンテナに、Dockerfile にハードコードしたりバージョン管理にコミットしたりすることなく、機密情報(API キーなど)を渡す必要があります。これを安全に行うにはどうすればよいですか?

回答:

単一のコンテナの場合は、docker run-e フラグを介して環境変数を使用します。Docker Compose または Swarm の場合は、Docker secrets を使用します。これにより、イメージに組み込んだり、プレーンテキストで公開したりすることなく、実行時に機密データを注入できます。


Docker コンテナがホストマシン上のファイルにアクセスする必要があります。これをどのように実現しますか?

回答:

bind mount を使用します。例えば、docker run -v /host/path:/container/path my-image です。これは、ホストファイルシステムからディレクトリをコンテナに直接マウントし、ファイルへの双方向アクセスを可能にします。


アプリケーションコードに変更を加えました。これらの変更を適用するために、実行中の Docker コンテナをどのように更新しますか?

回答:

実行中のコンテナのコードを直接更新することはできません。新しいコードで Docker イメージを再ビルドし(docker build)、古いコンテナを停止し(docker stop)、削除し(docker rm)、最後に更新されたイメージから新しいコンテナを開始する必要があります(docker run)。オーケストレーションされた環境では、これはローリングアップデートによって処理されます。


まとめ

面接のために Docker をマスターすることは、あなたの献身と現代のソフトウェア開発への理解の証です。このドキュメントに概説されている質問を徹底的に準備することで、知識を効果的に説明できるようになるだけでなく、コンテナ化に関する実践的な理解も深まります。この準備は、潜在的な雇用主への価値を示すための重要なステップであり、希望する役割を確保するためのものです。

テクノロジーの状況は常に進化していることを忘れないでください。新しい Docker の機能、ベストプラクティス、および Kubernetes のような関連テクノロジーを引き続き探求してください。継続的な学習を受け入れ、プロジェクトに貢献し、好奇心を持ち続けてください。あなたの成長へのコミットメントは、DevOps およびクラウドネイティブコンピューティングのダイナミックな世界で、常に需要の高いプロフェッショナルであり続けることを保証します。あなたの旅の成功を祈っています!