Dockerとは? ビルドとデプロイのためのコンテナを解説
Dockerは、アプリケーションとその依存関係を、ラップトップから本番環境までどこでも同じように動作するポータブルなcontainer imageにパッケージ化するためのツールです。
Dockerはコンテナを主流にしました。アプリケーションの環境をファイルに記述し、それをimageにビルドし、Dockerがインストールされているどこでも隔離されたcontainerとして実行できます。CI/CDでは、buildが再現可能な環境を得る手段であると同時に、アプリケーションがデプロイ用にパッケージ化される手段でもあります。
Dockerとは
Dockerは、containerをビルド、配布、実行するためのプラットフォームです。containerとは、アプリケーションをそのライブラリとruntimeとともにまとめた隔離されたプロセスであり、hostのカーネルを共有しつつ、その他の点では他のプロセスから分離されています。DockerのCLIとdaemonがimageをビルドし、それらをcontainerとして実行します。
imageとcontainer
imageは、Dockerfileの命令からビルドされる、ファイルシステムとメタデータの不変でレイヤー化されたスナップショットです。containerはimageの実行中のインスタンスです。layerはcacheされ共有されるため、imageのrebuildは変更されたステップのみをやり直します。これは高速なbuildのために鍵となります。
Dockerfileの例
Dockerfileはimageのビルド方法を記述します。
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "start"]CI/CDにおける役割
DockerはCI/CDの中心です: pipelineはimageをビルドし、クリーンで再現可能な環境のためにcontainer内でテストを実行し、デプロイのためにimageをregistryにpushします。imageのbuildはI/OとCPUの負荷が高く、効果的なlayerのcacheとbuild cacheが最大のレバーとなります。これらのbuildは、warmなcacheを備えたマネージドrunner上でより速く安価に実行され、加えて一時的なregistryのpull失敗に対する自動retryも得られます。
代替ツール
Podmanは、Docker互換のCLIを持つdaemonlessでrootlessな代替ツールです。BuildKitとBuildahはimageのビルドに焦点を当てており、containerdはより低レベルのruntimeです。Dockerは、開発とCIにおいてcontainerをビルドし実行するための、最も馴染みのあるエンドツーエンドのツールであり続けています。
重要なポイント
- Dockerはアプリケーションをポータブルでレイヤー化されたcontainer imageにパッケージ化します。
- layerのcacheは、変更されたステップのみをやり直すことでrebuildを高速化します。
- CIではimageをビルドし、テストを隔離し、デプロイ可能なartifactを生成します。