用語辞典・クラウド・開発運用

Docker

Dockerとは

Docker(ドッカー)は、コンテナイメージの作成、配布、実行を行うための代表的なプラットフォームです。Docker Engineはクライアント・API・デーモンを中心に、画像、コンテナー、ネットワーク、容量等のオブジェクトを管理します。

Dockerfile等のrecipeとビルド文脈から画像を作り、レジストリへプッシュ・プルし、その画像からコンテナーを起動します。Dockerはコンテナー一般の唯一の実装ではなく、OCI標準に対応するcontainerd、runc等の構成要素や他実行時とも関係します。

Docker画像は実行前のテンプレート、コンテナーは実行インスタンス、レジストリは画像の配布先です。三つを「Dockerファイル」一種類として扱わないことが最初の整理です。

クライアントがデーモンAPIを呼び、recipeと文脈から画像をビルドしてレジストリと交換する同一画像からコンテナーを起動し、容量・ネットワーク・ライフサイクル・権限を別管理する
開発者側のクライアントからデーモンへAPI要求を送り、Dockerfileとビルドコンテキストから複数層のイメージを作成してローカルに保存し、レジストリとの間でプッシュ・プルし、同じイメージから複数コンテナーを作成・起動・停止・削除する流れのピクトグラム図解
図1コンテナーを削除しても画像・容量・レジストリ上の複製が残る場合があります。オブジェクトごとのライフサイクルと削除範囲を確認します。

Dockerの主要オブジェクト

Client利用者が操作する入口

CLIやSDKがDocker APIへ要求を送り、実処理は接続先デーモンが行います。

Daemonオブジェクトを管理するエンジン

ビルド、プル、create、ネットワーク・容量操作を実行し、コンテナー実行時を呼び出します。

Image読み取り専用テンプレートとメタデータ

層、設定、entrypoint等を持ち、同じコンテンツを複数コンテナーで共有します。

Container画像の実行時インスタンス

処理、書き込み可能層、名前空間、リソース・ネットワーク・マウント設定を持ちます。

Registry画像を保存・配布するサービス

リポジトリ、タグ、マニフェスト、層、ダイジェスト、認証・認可を扱います。

Volume / Networkデータと通信をライフサイクル外へ接続

永続保存領域とコンテナー間・外部接続を画像から分離します。

クライアントとデーモンは同じ端末とは限らない

docker クライアントはAPI要求をデーモンへ送ります。文脈設定によりリモートホストへ接続でき、ビルド文脈や認証情報が意図しないデーモンへ渡る危険があります。

どの文脈・エンドポイントを使っているか、TLS・SSHで認証しているかを確認します。リモートデーモンで作られたファイルパスやポートはクライアント端末ではなくデーモンホスト側です。

Dockerfileとビルド文脈

Dockerfileはベースイメージ、ファイル複製、パッケージインストール、環境、entrypoint等のビルド命令を記述します。ビルド文脈はbuilderが参照できるファイル集合で、不要な秘密情報・巨大ディレクトリーを除外します。

層キャッシュは高速化しますが、古い依存先や秘密情報を残す場合があります。バージョンを固定し、キャッシュを使わない再ビルド、multi-stageビルド、SBOM、脆弱性スキャンで成果物を検証します。

画像タグとダイジェスト

タグは人が扱いやすい別名で、同じタグが新画像へ移ることがあります。ダイジェストはコンテンツを識別し、同一成果物を指定するのに向きます。タグだけで本番環境配備を再現しません。

ベースイメージのダイジェスト固定は再現性を高めますが、セキュリティ更新を自動取得しなくなります。定期rebuildで新基礎を評価し、明示的にダイジェストを更新します。

コンテナーライフサイクルとデータ

createはコンテナーメタデータと書き込み可能層を用意し、開始で処理を実行、stopで信号と猶予後に停止、削除でコンテナーオブジェクトを削除します。stopだけではコンテナーや書き込み可能層は残ります。

ボリュームはコンテナーとは別のオブジェクトなので、コンテナーを削除した後も残せます。バインドマウントはホスト側のパスを直接見せるため、書き込み権限、環境を移したときのパスの違い、ホストデータの意図しない公開に注意します。

ネットワークとポート公開

Dockerネットワークへコンテナーを接続すると、仮想インターフェース、IP、DNSに基づくサービスディスカバリー等を利用できます。ポート公開はホスト側アドレス・ポートからコンテナーポートへNAT・プロキシ経路を作ります。

コンテナー内EXPOSEメタデータだけでは外部公開されず、publishした0.0.0.0 割り当ては意図せず全インターフェースへ公開する場合があります。ホストファイアウォール、IPv6、クラウドセキュリティ規則も確認します。

Composeは複数コンテナーの構成を記述する

Docker Composeはサービス、画像・ビルド、環境、ネットワーク、容量、依存先等を一つのプロジェクトとして定義します。本番環境のオーケストレーターの全機能と同じではなく、配備先サービスの仕様を確認します。

依存先順序はバックエンドが処理可能になったことを自動保証しません。ヘルスチェック、再試行、移行、冪等起動時をアプリケーション側へ持たせます。

EngineとDesktopを分ける

Docker Engineはデーモンとコンテナー機能、Docker DesktopはWindows・macOS・Linux向けのデスクトップアプリケーションで、Engine、CLI、Compose等をまとめます。Windows・macOSではLinuxコンテナーのため内部VMを使う構成があります。

したがって「Dockerコンテナーは常にVMなし」とも「Dockerは必ずVM」とも言えません。コンテナー分離と、DesktopがホストOS差を吸収するVM層を分けます。

デーモンアクセスは強い権限

Dockerデーモンはホスト上で強い権限を持つことが多く、API・ソケットへアクセスできる利用者はホストディレクトリーマウント、特権コンテナー等を通じてホストを実質管理できる場合があります。

ソケットをWebアプリケーションコンテナーへマウントせず、アクセスグループを最小化し、ルートレスモード、認可プラグイン、リモートTLS、監査を検討します。信頼できないイメージを起動する前にソース・署名・スキャン結果を確認します。

Dockerはクライアント・デーモン・画像・コンテナー・レジストリ・ネットワーク・容量をつなぐコンテナープラットフォームです。ビルド成果物の由来、タグとダイジェスト、デーモン権限、永続データ、公開ポートをオブジェクトごとに管理します。

Docker client・daemon・image・container・registry・object architecture:Docker Docs「What is Docker?」、namespace・cgroup・daemon attack surface:Docker Engine security

関連用語