0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerについての疑問を自分なりに整理してみた【Q&A形式】

0
Posted at

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は何のために使うものなのか」については少しイメージできるようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?