Dockerについての疑問を自分なりに整理してみた
Dockerを触り始めて、「Dockerって結局いつ使うの?」「コンテナってプロジェクトごとに1つなの?」「Gitには何を入れるの?」など、いくつか疑問に思うことがありました。
今回は、Dockerについて自分が疑問に思った部分を、Q&A形式で自分なりに整理してみます。
1. Dockerを使うべき環境と、使わなくてもいい環境は?
Q. Dockerはどんな環境で使うと便利?
A. 「環境を再現したい」「複数のサービスを組み合わせたい」場合に特に便利
Dockerの大きなメリットは、
アプリケーションと、そのアプリケーションを動かすために必要な環境をまとめて扱えること
だと思います。
例えば、Webアプリケーションで、
- Node.js
- PostgreSQL
- Redis
など複数のソフトウェアを使っているとします。
Dockerを使うと、
Docker
├── Webコンテナ
├── DBコンテナ
└── Redisコンテナ
のように、それぞれの環境を分けて管理できます。
また、開発者のPCによって、
- OSが違う
- Node.jsのバージョンが違う
- Pythonのバージョンが違う
- ライブラリのバージョンが違う
といった問題が起きるのを減らすことができます。
そのため、特に以下のような環境ではDockerの恩恵が大きいと思います。
- チーム開発
- 複数のサービスを使用するWebアプリ
- 開発環境と本番環境をできるだけ揃えたい場合
- CI/CDを利用する場合
- AWSやGCPなどにアプリケーションをデプロイする場合
Q. 逆にDockerを使わなくてもいい場合は?
例えば、
Python
↓
hello.py
のような非常にシンプルなプログラムを、自分のPCだけで動かすのであれば、Dockerを使うメリットはそこまで大きくないと思います。
Dockerを使う場合、
Dockerfileを用意
↓
イメージを作成
↓
コンテナを起動
といった手順が必要になります。
単純なプログラムなら、普通に環境を用意して実行した方が早い場合もあります。
つまり、
Dockerを使うこと自体が目的にならないようにする
ことが重要だと思います。
「環境を揃える・再現する・分離する」といったDockerのメリットが、Dockerを導入する手間を上回るかどうかで判断するのがよさそうです。
2. Dockerは1プロジェクトに対して1環境(コンテナ)を構築するもの?
Q. 1つのプロジェクトにつき、1つのコンテナを作るの?
A. 必ずしもそうではない
ここはDockerを触り始めたときに特に混乱した部分です。
「1プロジェクト = 1コンテナ」ではありません。
例えばWebサービスの場合、
1つのプロジェクト
│
├── Webコンテナ
│ └── Next.js
│
├── APIコンテナ
│ └── Java / Spring Boot
│
├── DBコンテナ
│ └── PostgreSQL
│
└── Redisコンテナ
└── Redis
のように、1つのプロジェクトの中で複数のコンテナを動かすことがあります。
では、どういう単位で考えればいい?
個人的には、
1プロジェクト = 1つのアプリケーション環境
その中に必要な数のコンテナを用意する
と考えると分かりやすいと思います。
例えば、
ECサイト
│
├── フロントエンド
├── バックエンド
├── データベース
└── キャッシュ
という構成なら、
ECサイト
│
├── Frontendコンテナ
├── Backendコンテナ
├── PostgreSQLコンテナ
└── Redisコンテナ
という構成にできます。
このような複数コンテナの構成をまとめて定義・管理するために、Docker Composeが使われます。
3. DockerもGitとしてリポジトリに格納するのか?
Q. Dockerの環境もGitHubに保存するの?
A. Dockerそのものではなく、「Docker環境を作るための設定ファイル」をGitで管理する
ここも最初は勘違いしやすい部分でした。
例えばプロジェクトが、
my-app/
│
├── src/
├── Dockerfile
├── compose.yaml
├── .dockerignore
└── .gitignore
という構成になっていたとします。
この場合、
Dockerfile
compose.yaml
.dockerignore
などは、ソースコードと一緒にGitで管理します。
つまり、
「Dockerそのもの」をGitHubに入れるのではなく、「Dockerを使って同じ環境を再現するための設定」をGitで管理する
というイメージです。
Dockerfile → Image → Container
Dockerについて調べていると、この3つがよく出てきます。
Dockerfile
↓
Docker Image
↓
Container
簡単に考えると、
- Dockerfile:コンテナを作るための設計図
- Image:コンテナを作るための元になるもの
- Container:実際に起動して動いている環境
というイメージです。
Gitで管理するのは主にDockerfileやComposeファイルなどの設定ファイルです。
一方、実際に起動しているコンテナそのものをGitHubに入れるわけではありません。
4. Dockerの起動手順、作業を始めるまでの手順がいまいち分からない
Q. Dockerを使うプロジェクトでは、最初に何をすればいい?
A. 大まかには「環境を定義 → 作成 → 起動 → 開発」という流れ
Dockerを使った開発の流れを簡単にすると、
① Dockerをインストール
↓
② プロジェクトを用意
↓
③ Dockerfileなどで環境を定義
↓
④ Dockerイメージを作成
↓
⑤ コンテナを起動
↓
⑥ 開発・動作確認
という流れになります。
すでにDocker環境が用意されている場合
実際のチーム開発などでは、すでにDockerfileやComposeファイルが用意されていることが多いと思います。
その場合は、
GitHubからプロジェクトを取得
↓
Dockerの設定を確認
↓
必要なイメージ・コンテナを準備
↓
コンテナを起動
↓
開発開始
という流れになります。
つまり、毎回自分でDockerfileを書いて環境を作るとは限りません。
ここまでの内容をまとめる
今回の疑問をまとめると、以下のようになります。
| 疑問 | 自分なりの理解 |
|---|---|
| Dockerはいつ使う? | 環境の再現・分離・共有が必要なときに便利 |
| 1プロジェクト = 1コンテナ? | いいえ。1プロジェクトで複数コンテナを使うことがある |
| GitHubにDockerを入れる? | DockerそのものではなくDockerfileやComposeファイルなどを管理する |
| Dockerで開発を始めるには? | 環境を定義 → イメージ作成 → コンテナ起動 → 開発 |
Dockerについて最初に勉強したときは、
Docker
コンテナ
Dockerfile
Image
Compose
など似た言葉がたくさん出てきて混乱しました。
しかし、ざっくり整理すると、
Docker
│
├── Dockerfile
│ ↓
│ Image
│ ↓
│ Container
│
└── Compose
↓
複数のContainerをまとめて管理
という関係だと分かってきました。
まだDockerについて完全に理解できたわけではありませんが、今回の疑問を整理することで、「Dockerは何のために使うものなのか」については少しイメージできるようになりました。