
Dockerはコンテナの起動や管理を容易にしますが、そのコンテナを実行するための基盤となるシステムは依然として必要です。これらのシステムはコンテナが稼働するインフラストラクチャを構成し、DevOps Tools Engineer試験の目的702.3で扱われています。
コンテナイメージは、現代のクラウドネイティブなインフラストラクチャの基盤です。アプリケーションを実行環境、依存関係、設定とともにパッケージ化し、移植性と再現性を確保する手段を提供します。Docker、Podman、その他OCI準拠ツールを扱うDevOpsエンジニアにとって、イメージの作成方法、安全な管理、適切な配布方法を理解することは不可欠です。
コンテナイメージの作成は、Dockerfile(Podman環境ではContainerfile)から始まります。このファイルには、イメージのビルド方法が宣言的に記述されます。たとえば、シンプルなNode.jsアプリケーションでは、FROM node:25-alpineのようにFROM命令でベースイメージを指定することから始まります。この記述は、既存のOCI準拠イメージを基盤として使用することを意味します。
その後の各命令は新しいイメージレイヤーを作成します。WORKDIRはコンテナ内の作業ディレクトリを指定し、COPYはアプリケーションのソースコードをイメージに取り込み、RUNはnpm installなどのコマンドを実行します。最後に、CMDまたはENTRYPOINTによってコンテナ起動時の動作が定義されます。
最小構成の例は以下のとおりです。
このイメージは軽量なAlpineベースのNodeイメージから開始され、作業ディレクトリを/appに設定し、アプリケーションファイルをコピー、依存関係をインストールし、node server.jsでサーバーを起動するように構成されます。
「docker build -t myapp:1.0 .」コマンドを実行すると、DockerはDockerfileを読み込み、myappという名前でタグ1.0のイメージを作成します。
タグの形式はOCIの命名規則に従い、通常は以下のように構成されます:
[registry]/[namespace]/[repository]:[tag]
たとえば、docker.io/library/nginx:latestは、Docker Hubレジストリ、library名前空間、nginxリポジトリ、latestタグを示します。
OCIイメージ名は標準化されており、異なるコンテナエンジン間でも互換性が保たれます。たとえば、ghcr.io/example/api:2.1は、レジストリ(GitHub Container Registry)、組織、リポジトリ、バージョンを明確に示しています。レジストリを省略した場合、DockerはデフォルトでDocker Hubを使用します。この命名構造を理解することは、異なる環境間でイメージを取得・タグ付け・プッシュする際に非常に重要です。
イメージをビルドした後は、他のシステムやデプロイメントパイプラインから利用できるようにレジストリへアップロードする必要があります。その際にはdocker loginで認証を行い、適切にタグ付けした後、docker image pushでアップロードします。
たとえば、myapp:1.0に対してregistry.example.com/team/myapp:1.0というタグを付与してプッシュすれば、CI/CDシステムやKubernetesクラスターから利用可能になります。レジストリにはDocker Hubのような公開型と、企業内で運用されるプライベート型があります。
セキュリティはコンテナイメージ管理において非常に重要です。コンテナイメージには、ベースイメージ由来の脆弱性や、アプリケーション依存関係による問題が含まれる可能性があります。
イメージスキャナは既知のCVE(共通脆弱性識別子)、古いライブラリ、不適切な設定を検出します。Trivy, Clair, Docker Scoutといったツールはイメージレイヤーを解析し、脆弱性データベースと照合します。たとえば、古いOpenSSLが含まれている場合、デプロイ前に警告が出され、修正済みの依存関係で再ビルドすることが可能になります。
コンテナ仮想化には固有のセキュリティリスクも存在します。コンテナはプロセスを分離しますが、ホストのカーネルを共有しています。そのため、rootで実行される不適切に設定されたコンテナは、カーネルの脆弱性を悪用したり、隔離を突破する可能性があります。
対策としては、USER命令で非rootユーザーを使用する、イメージサイズを最小化する、読み取り専用ファイルシステムを利用する、プロセスの権限を制限する、定期的にスキャンを行う、などが挙げられます。また、VOLUME命令はデータ漏えいを防ぐため慎重に使用する必要があります。EXPOSEはポートを文書化するだけであり、実際の通信制御はランタイム側で行う必要があります。
ビルド時のリスク軽減と性能向上のため、最新のコンテナエンジンは高度なビルダー機能を提供しています。Docker BuildKitは並列ビルド、レイヤーキャッシュ、シークレット管理により性能を向上させます。また、ビルド時にSSHキーを一時的にマウントし、最終イメージに残さないといった高度な構文もサポートしています。
Docker buildxはさらに拡張され、amd64やarm64など複数アーキテクチャ向けのイメージを同時にビルドできます。これはクラウドやエッジ環境などの異種混在環境において特に重要です。
Podmanではpodman buildコマンドを使用してContainerfileを読み込み、デーモン不要でOCI準拠イメージを作成します。Buildahはさらに細かい制御を可能にし、スクリプト化やrootlessビルドに対応します。これらのツールはLinuxのnamespacesやcgroupsと連携し、セキュリティ重視の設計となっています。
また、.dockerignoreファイルも重要です。これは不要なファイルや機密情報がイメージに含まれるのを防ぎます。たとえば、.gitディレクトリやローカル設定ファイル、認証情報などは除外することで、イメージサイズの削減と情報漏えい防止につながります。
まとめると、DockerfileおよびOCIイメージ管理を習得するには、技術面とセキュリティ面の両方を理解する必要があります。イメージの作成は単なるパッケージングではなく、不変で移植性のある成果物を構築し、それを最適化・バージョン管理・スキャン・安全に配布するプロセスです。
適切なDockerfile設計、レジストリ運用、脆弱性スキャン、BuildKitやbuildx、Podman build、Buildahといった最新ツールを組み合わせることで、DevOpsエンジニアは効率的かつ安全で本番運用に適したコンテナ環境を実現できます。
また、LPIはDevOps Tools Engineer 2.0試験向けの公式ラーニングマテリアルを提供しています。これらは包括的で無償公開されており、試験範囲に完全準拠した優れた学習リソースです。
You are currently viewing a placeholder content from Vimeo. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from YouTube. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou need to load content from reCAPTCHA to submit the form. Please note that doing so will share data with third-party providers.
More InformationYou need to load content from reCAPTCHA to submit the form. Please note that doing so will share data with third-party providers.
More Information