Dockerfile と docker-compose を利用すると何がうれしいのか？


# はじめに

Docker を勉強し始めると `Dockerfile` や `docker-compose` などの用語が出てくると思いますが、『これらを利用すると何がうれしいのか』を軸にそれぞれについて説明したいと思います。

`Dockerfile` や `docker-compose` を勉強する前に見ていただければよりすんなり、頭に入っていきやすいと思います。

**この記事で触れること**

- Dockerfile の使い所、メリット
- docker-compose の使い所、メリット

**この記事で触れないこと**

- Dockerfile の書き方、サンプル
- docker-compose の書き方、サンプル

# Dockerfile と docker-compose を利用すると何がうれしいのか？

先に結論からいうと、できるようになることは以下のようになります。

- `Dockerfile`
これができると（Dockerfile を書けるようになると）自分の好きなようにカスタマイズした Docker Image をコマンド1行で作成できるようになります。

- `docker-compose`
これができると（コンテナ管理を docker-compose による管理で行うと）複数のコンテナで構成されるアプリケーションについて、Docker Image のビルドや各コンテナの起動・停止、ネットワーク接続をコマンド1行で実行できるようになります。

**つまり、Docker のコンテナ環境が楽に構築できるようになります。**

# 最も効力を発揮する場面

**Dockerfile と docker-compose が 最も効力を発揮する場面は、チームメンバーに同じ Docker 環境を構築してもらうときです。**

チームメンバーに Docker 環境の構築手順書を共有し、その手順書通りに環境を作ってもらうのではなく、**Dockerfile や docker-compose を使ったコマンドを1行連携するだけで、Docker 環境を構築してもらうことができるようになります。**

**OUT：膨大な構築手順書**
**IN：Dockerfile、docker-compose(.yml)、実行コマンド1行**

また、共有するものが、構築手順書であればエクセルなどのバイナリファイルだったものが、Dockerfile や docker-compose(.yml) ではテキストファイルとなるため、
**Git での構成管理がとても楽になります。**

-おしまい-

# （ここからは余談） Dockerfile や docker-compose が何者かについての補足

## Dockerfile について

### Dockerfile について説明する前に

皆さんはこんな経験ありませんか？

『Docker を勉強して使えるようになったけど、毎回毎回 `docker container run` コマンド実行後、コンテナにログインして足りないモジュールを導入したり、必要なディレクトリやファイルを作成するのが大変だわ。。。どうにかならないかしら。。。』

**それ、Dockerfile なら解決できます！**


### Dockerfile

Dockerfile とは自分の好きなようにカスタマイズした Docker Image を作成するためのファイルになります。

Docker を使用する際に `docker container run` コマンド実行後に `docker exec -it [コンテナID] /bin/bash` コマンドでコンテナにログインしたあとに、足りないモジュールのインストールやディレクトリ・ファイルの作成など、各種コマンドを実行することがあるかと思われます。

それをあらかじめ Dockerfile に記述することで、そのようなコマンドを起動時に自動で実行してくれるカスタマイズ版 Docker Image を作成することができます。


#### Dockerfile を用いた Docker Image の作成の方法
Dockerfile の配置されたディレクトリで `docker build -t [イメージ名] .` コマンドを実行するとローカル環境に Dockerfile の内容を元にローカル環境に Docker Image が作成されます。

#### メリット
Dockerfile ファイルを記述することで、

『この Docker Image を pull してから、`docker container run` コマンドを実行した際は、必ず毎回、そのコンテナにログインして、このコマンドとこのコマンドを実行して〜（省略）』

などの手順書が

『 Dockerfile があるディレクトリで `docker build -t [イメージ名] .` コマンドを実行する。』

の1行で済むようになります。

Dockerfile ファイルについてのお話は以上になります。
つづいて、docker-compose について説明します。


## docker-compos について

### docker-compose について説明する前に

皆さんはこんな経験ありませんか？

『動かすコンテナが一つの場合はあまり気にならないけど コンテナが複数ある環境を構築する場合、それらのコンテナ同士の接続の設定とかを `docker container run` コマンドのオプションで指定したり、その手順書をいちいち記述するのが大変だわ。。。どうにかならないかしら。。。』

**それ、docker-compose なら解決できます！**


### docker-compose
docker-compose とは複数のコンテナで構成されるアプリケーションについて、Docker Image のビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。

複数のコンテナを起動させる場合、各コンテナを起動するために、それぞれ起動コマンドを実行する必要がありました。

また、コンテナを起動する際に、環境変数の設定やポートの接続やらディスクのマウントやらいろいろなオプションを指定する必要があります。

コマンドや手順が複雑になると、他の環境で使う／使ってもらう場合に、ミスが発生しやすくなります。

他の環境でも同じ構成（同じ Docker イメージ）で動かせるという Docker のメリットを生かすには、起動手順なども簡単であってほしいですよね。

docker-compose では、Docker Image の作成やコンテナ起動のオプションなどを含め、複数のコンテナの定義を yml ファイル（docker-compose.yml）に書き、それを利用してDockerビルドやコンテナ起動をすることができます。

#### docker-compose を用いた環境構築の仕方

docker-compose.yml の配置されたディレクトリで `docker-compose up -d` コマンドを実行するだけです。

ちなみに docker-compose.yml に書かれている内容で以下のような処理を実行します。

1. Docker Image 作成する（Dockerfile からイメージを作成することも可能）
2. その Docker Image を使って `docker container run` コマンドをいろいろオプションをつけて実行する（環境変数の宣言、ポートやボリュームの設定など）


#### メリット
docker-compose.yml ファイルを記述することで、

『まず、このディレクトリで `docker build -t [イメージ名] .` コマンド実行後に、これとこれのコマンドを実行して、`docker container run [イメージA]` と `docker container run [イメージB]` を行って〜』

などの Docker 環境構築手順書が

『docker-compose.yml ファイルがあるディレクトリで `docker-compose up -d` コマンドを実行する。』

の1行で済むようになります。


# さいごに
『今まで頑張って書いてきた構築手順書とは一体何だったんだろう？』とちょっと悲しくなりますが、どんどん便利な世の中になっていきますね。