Dockerとコンテナの整理(概要)
コンテナ・Docker・イメージ・レジストリ・Composeの意味と、ビルドから実行までの流れを俯瞰する
アプリを「コンテナ」として動かすときに出てくる用語と、何がどこまでを担当するかを一枚に整理する。実装手順そのものは、例として NestJSをDocker化する を参照する。
コンテナとは何か
コンテナは、アプリとその実行に必要なファイル・ライブラリなどを ひとかたまりに隔離して動かす単位のことだ。ホストOS(あなたのPCやクラウドのLinux)の上で、複数のコンテナが同時に動いてもお互いのファイルシステムを踏みにくいようにした仕組みがベースにある。
仮想マシン(VM)が「OSごと複製」に近いのに対し、コンテナは 同じOSカーネルを共有しつつ、ユーザー空間を分けるイメージで、起動が軽くなりがちだ(厳密な比較は製品・設定による)。
Dockerとは何か
日常語としての「Docker」は、だいたい次のどれか(または全部)を指す。
- Docker Engine … コンテナを作って動かすための実行基盤(デーモンなど)
- Docker CLI … ターミナルから
docker buildやdocker runを叩くコマンド - Docker社のエコシステム … Docker Desktop、ドキュメント、レジストリ連携など
「Docker=コンテナそのもの」ではない。コンテナは仕様・技術の考え方で、Dockerはそれを扱う代表的な実装のひとつ、と捉えると混乱が減る(他に containerd、Podman などもある)。
イメージとは何か
イメージは、コンテナを起動するための **読み取り専用のひな形(テンプレート)**だ。中にはアプリのコード、node_modules、OSの一部のようなレイヤーが重なった形で入る。
Dockerfile… イメージの作り方を書いたレシピ(FROM node:22で土台を決め、COPYやRUNで中身を足す)docker build… Dockerfileを読み、イメージをビルドする
イメージは「まだ動いていない設計図」に近い。
コンテナ(実行中)との違い
コンテナは、イメージから docker run(や compose の up)で起動したあとの、動いているプロセスの束だ。同じイメージから複数コンテナを起動できる。
- イメージ … ひな形(再利用できる)
- コンテナ … そのひな形から生えた 実行インスタンス(ログや一時ファイルはコンテナ側に載ることが多い)
レジストリとは何か
コンテナレジストリは、イメージを 保管して配布するためのサーバだ。Gitでいうリモートリポジトリに近い。
- 手元で
docker buildしたイメージをdocker pushでレジストリに送る - 別のマシンやクラウドが
docker pullで同じイメージを取りにいく
Docker Hub、GitHub Container Registry、AWS ECR、Google Artifact Registry、Azure Container Registry などがある。本番では プライベートなレジストリに置くことが多い。
Docker Composeとは何か
Compose(docker compose)は、複数コンテナやボリューム・環境変数・ポート公開を、YAMLファイルにまとめて宣言し、一括で起動するための仕組みだ。
- 単一コンテナなら
docker runの長いオプションでも足りることが多い - API+DB、あるいはポートやenvが増えると compose に書いた方が再現しやすい
学習やローカルでは docker-compose.yml(または compose.yaml)で「このAPIを3000番で動かす」「SQLite用のvolumeをここに」などを宣言する、という使い方がよくある。
全体の流れ(よくある一本道)
「コードができた」から「どこかで動く」までを、コンテナ前提で単純化すると次の流れになる。
1. Dockerfile を書く(イメージのレシピ)
2. docker build でイメージを作る(手元またはCI)
3. (本番や共有のため)レジストリへ docker push
4. サーバやクラウドが pull して、コンテナとして起動(Kubernetes / ECS / Cloud Run など)学習用の最小例では、2までを手元で行い、docker compose up で 4 に相当する「自分のPC上での起動」だけを行う、という省略形も多い(レジストリを経由しない)。
「バリエーション」は同列の三択ではない
次のような言い方をするとき、役割が違うので同列に並べない方が整理しやすい。
| 観点 | 内容 |
|---|---|
| 学習・ローカル | Dockerfile + compose で手元起動。レジストリやCIは省略してよいことが多い。 |
| CI(例: GitHub Actions) | イメージのビルド、docker push、ときにはデプロイAPIの起動までを自動化する 工程。 |
| 実行場所(クラウド) | EKS、ECS、Cloud Run、AKS など どのサービスがコンテナを動かすか。 |
CIと「AWSに載せる」は対立ではなく、CIでビルド・push → クラウドが pull して起動と つながることが多い。
PaaSとの関係(ざっくり)
PaaS(Platform as a Service)は、ランタイムやビルドの一部をプラットフォーム側が面倒みるサービスだ。Gitを繋いでデプロイするだけで済む一方、裏でコンテナを使っているが Dockerfile を書かせないプランもある。
「必ず自分でDockerfileを書く」わけではないが、Dockerの概念(イメージ=配布単位)を知っておくと、後からコンテナ運用に寄せたときの会話につながりやすい。
このあと読むとよいもの
- 手を動かす例: NestJSをDocker化する