AWSのサービスを開発するにあたってローカルで開発するのにAWSの環境となるべく同じにしたいと思い、提供されているDockerイメージで環境を整えようと思いましたが、そもそもDockerでそもそもどういうものなのか、よくわからないで使っていたので、いまさらかよと突っ込まれそうですが、改めて理解したことをまとめてみました。
そもそもDockerって何?
一言で言うと、アプリをまるごと箱に詰めて動かす仕組みです。
普通、アプリを動かすには「このバージョンのPythonが必要」「このライブラリを先にインストールして」など、環境をいちいち整える必要があります。Dockerを使うと、その環境ごと箱(コンテナ)に閉じ込めて、どのPCでも同じように動かせます。
「自分のPCでは動くのに本番環境では動かない」あるあるを撲滅するための技術です。
「イメージ」と「コンテナ」の違い
AIにわかりやすい例えで教えてと伝えたところ以下の表になりました。なんとなくな納得感・・
| イメージ | コンテナ | |
|---|---|---|
| 何? | 設計図・テンプレート | 実際に動いているプロセス |
| 例え | 料理のレシピ | 作られた料理 |
| 変更できる? | できない(読み取り専用) | できる(起動中に変化する) |
イメージは「この環境でこのアプリを動かす」という設計図です。Dockerfile というファイルに書いたレシピをもとに docker build コマンドで作ります。
コンテナはそのイメージを docker run して実際に起動したものです。同じイメージから何個でもコンテナを起動できます(レシピが1つあれば何皿でも作れるのと同じ)。
# イメージをビルド
docker build -t myapp .
# コンテナを起動(イメージから何個でも作れる)
docker run myapp
docker run myapp # これも動く
JavaScript「Docker Compose」って何が違うの?
ここが今回いちばん「なるほど!」となったポイントです。
実際のWebアプリは、コンテナ1個で完結することはほとんどありません。
- webサーバー(NginxやNode.jsなど)
- データベース(MySQLやPostgresなど)
- キャッシュ(Redisなど)
…といった複数のコンテナが連携して動いています。
Docker Compose はこれらを まとめて管理するための仕組みです。docker-compose.ymlというファイルに「どのコンテナをどう起動するか」を定義しておくと、コマンド1つで全部立ち上がります。
# docker-compose.yml の例
services:
web:
image: nginx
ports:
- "80:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: secret
JavaScript# これだけで web と db が同時に起動する
docker compose up
# 全部止める
docker compose down
JavaScript「Docker = イメージとコンテナ」「Compose = 複数コンテナの指揮官」と覚えると整理しやすいです。
まとめ
- イメージ → アプリ環境の「設計図」。Dockerfileから作る。
- コンテナ → イメージを起動した「実物」。実際に動くプロセス。
- Docker Compose → 複数コンテナをまとめて管理する仕組み。
compose.ymlで定義。
最初は「イメージ?コンテナ?同じものじゃないの?」と混乱しますが、設計図と実物という関係性で捉えるとだいぶスッキリしました。windowsとmacでメンバーのPCが分かれていても環境構築にかかる手間がだいぶ減りました。
まだDockerを触ったことがない方は、ぜひローカル環境にdockerDeskTopなどを入れて docker run hello-world から試してみてください。