コンテナ管理を便利にするDockerComposeを学ぶ

# 目次
１.はじめに
２.Docker Composeとは？
３.Docker Composeを利用するメリット
４.Docker Composeを導入してみよう
５.最後に

# １.はじめに
前回、[Dockerで学ぶコンテナ技術](https://qiita.com/sabapro/items/f0a3aa1ef8a9b8007e25)ではDockerを用いたコンテナ技術についてご紹介させていただきましたが、今回はDocker Composeというツールを紹介しようと思います。
言葉としてはDockerをcompose(まとめ上げる、組み上げる)するという意味になるので、Dockerで出来たコンテナ制御を複数まとめて制御できそうな言葉に見えますね。
概要から使い方含めて本記事内でご紹介していこうと思いますので、もしこれから仕様を考えている方いたらご参考ください。

# ２.Docker Composeとは？
Dockerという仕組み自体とても便利なもので、特に複数人で開発する上で効果を発揮しますが、Dockerは
コンテナを一つしか管理できず、管理するコンテナごとにDockerファイルを用意していく必要があります。
例えば、サーバ処理であるJava用のコンテナ、DBの為のコンテナ、フロント処理の為のコンテナとした際に、別々に作成し管理していかなければなりません。
そしてそれを複数の開発環境や検証用の環境など10数個の環境でメンテナンスすると何十ファイルもの修正影響が出てしまい、とてもじゃないですが保守にかかるコストが高くなってしまいます。

しかし、今回ご紹介させていただくDocker Composeを使えば、定義用のyamlファイルに立ち上げたい複数コンテナを定義できるので1ファイルで設定やコンテナ管理を完結させることができるという優れものです。
※似た仕組みにKubernetes(通称：k8s)がありますが、こちらは複数コンテナ管理に加えスケーリングなど優れた機能を持っておりDocker Composeとは別物です。


# ３.Docker Composeを利用するメリット
基本はDockerを利用することとメリットが同じになってしまうため、
Docker Composeを使用するメリットを紹介します。

・**複数コンテナ管理ができることにより1ファイルで開発環境が用意できる**
　複数開発者に展開/共有しやすい。

・**管理が簡単になる**
　Dockerを用いるだけでは実現できなかった煩わしい管理がなくなる。


# ４.Docker Composeを導入してみよう
## 4‐1.Docker Composeのインストール
前回の記事の通りにDocker Desktopのインストールが完了していればDocker Composeもセットでプラグインのインストールが実施されているため不要になります。
Docker Composeを個別にインストールする方法もあるようですが、DockerDesktopのインストールのほうが簡単なのでこちらを推奨します。

## 4-2.Docker Composeファイルの作成
早速docker-composeの設定ファイルから用意していきましょう。
設定は以下のような形になります。
※今回はDockerファイルを参照する形でbuildしようとしてます(build:部分)が、使用しない場合はbuildは記載せずに`image: postgres:latest`を記載することで最新のイメージを取得してあげることが可能です。
```yaml:docker-compose.yml
version: '3'
services:
  # postgresの設定情報
  postgres:
    # コンテナ名
    container_name: sample-db
    # ビルドするDockerImageが格納されているディレクトリ
    build: ./postgres
    # OS起動時に自動でコンテナを起動させる(=always)
    restart: always
    # hostポート番号:コンテナポート番号
    ports: 
      - "5432:5432"
    # 初期実行させるSQL
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
```
また、設定ファイルの`volumes`に記載している設定についてですが、
`./postgres/init`は参照してほしいローカルのディレクトリで`/docker-entrypoint-initdb.d`はDockerのコンテナ起動時にSQLを処理してくれるディレクトリとなってます。
（この設定を入れることで、コンテナ起動時に自動的に指定したSQLを流してくれるというものになってます。）

(参考)
今回は初期実行SQLに使用してますが、volumesタグはコンテナ管理とは別にデータを残しておくことが可能になる設定になります。
設定していない場合は、コンテナを落としてしまうと保存してあるデータも消えてしまいますが、このvolumesに設定しておくことで外付けのHDDの要領でデータを残しておいてくれるようになります。
例：`./db/postgres:/var/lib/postgresql/data`

今回、コンテナ起動されたときに実行したいSQLは以下。
```SQL:init.sql
-- DB作成
CREATE DATABASE sampledb;
-- 作成したDBに接続
\c sampledb;
-- テーブル作成
DROP TABLE IF EXISTS sample;
CREATE TABLE sample (
	id integer NOT NULL PRIMARY KEY,
	name char(30) NOT NULL,
	created_date_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- ID用シーケンス作成
CREATE SEQUENCE sample_id_seq START 1;
-- サンブルデータの登録
INSERT INTO sample (id, comment) VALUES(nextval('sample_id_seq'), 'Hello world');
```
ディレクトリ構成は以下になります。
※postgresディレクトリ配下と直下にあるdocker-compose.ymlがあれば他は不要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/be7cf2fc-4227-e09e-e14d-200e111a1346.png)

## 4-3.Docker Composeの実行

まず、以下のコマンドを実行しDockerコンテナを起動します。
```
docker-compose up -d
```
起動が完了すると以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/d458b1c9-3bec-779f-effb-18ec010e99fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/0493a445-43c7-e5ce-eebb-eb05029d3384.png)

以下のdockerコマンドを実行し起動しているコンテナの中に入る為のdockerコマンドを実行します。
※sample-dbは設定したコンテナ名
```docker:dockerコマンド
docker exec -it sample-db bash
```
以下のコマンドを実行し作成されているDBに接続。
```:psqlコマンド
psql -U postgres -d sampledb
```
接続出来たらSQLを実行し、結果が取得できることを確認
```SQL:SQL
SELECT * FROM sample;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/b91756b3-7ffd-663f-bfd3-fb2105292d69.png)

# ５.最後に
今回はDBをDocker-composeで実行してみましたが、ここにSpring-bootなどを合わせることで開発環境をまとめてコンテナ化することができるようになるため次回以降でやってみようと思います。
まずは作ってみると理解につながるので是非ご参考ください。