awesome-hacks
Docs

Dockerとコンテナの整理(概要)

コンテナ・Docker・イメージ・レジストリ・Composeの意味と、ビルドから実行までの流れを俯瞰する

最終更新:2026/05/16

アプリを「コンテナ」として動かすときに出てくる用語と、何がどこまでを担当するかを一枚に整理する。実装手順そのものは、例として NestJSをDocker化する を参照する。

コンテナとは何か

コンテナは、アプリとその実行に必要なファイル・ライブラリなどを ひとかたまりに隔離して動かす単位のことだ。ホストOS(あなたのPCやクラウドのLinux)の上で、複数のコンテナが同時に動いてもお互いのファイルシステムを踏みにくいようにした仕組みがベースにある。

仮想マシン(VM)が「OSごと複製」に近いのに対し、コンテナは 同じOSカーネルを共有しつつ、ユーザー空間を分けるイメージで、起動が軽くなりがちだ(厳密な比較は製品・設定による)。

Dockerとは何か

日常語としての「Docker」は、だいたい次のどれか(または全部)を指す。

  • Docker Engine … コンテナを作って動かすための実行基盤(デーモンなど)
  • Docker CLI … ターミナルから docker builddocker run を叩くコマンド
  • Docker社のエコシステム … Docker Desktop、ドキュメント、レジストリ連携など

「Docker=コンテナそのもの」ではない。コンテナは仕様・技術の考え方で、Dockerはそれを扱う代表的な実装のひとつ、と捉えると混乱が減る(他に containerd、Podman などもある)。

イメージとは何か

イメージは、コンテナを起動するための **読み取り専用のひな形(テンプレート)**だ。中にはアプリのコード、node_modules、OSの一部のようなレイヤーが重なった形で入る。

  • Dockerfile … イメージの作り方を書いたレシピ(FROM node:22 で土台を決め、COPYRUN で中身を足す)
  • 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とは何か

Composedocker 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の概念(イメージ=配布単位)を知っておくと、後からコンテナ運用に寄せたときの会話につながりやすい。

このあと読むとよいもの

参考