docker imageを作成して簡単にローカル開発環境を構築しよう

# はじめに

色々な案件にアサインする機会が多く、その都度、案件に合わせたローカル開発環境を構築していました。
mysqlを停止して、mariadbを起動する、apacheを停止してnginxを起動するなど、面倒くさいことが発生していました。

上記の内容を解決するために、2年前くらいからdockerを導入しました。
その内容を記載して、私と同じ状況が打破できれば幸いです。

# dockerを使用する利点について

* ローカルPCの言語やミドルウェアの乱立を防ぐ

* 開発チーム内でローカル開発環境を使いわますことができる

* amazon EC2 Container Serviceなどを使用して、そのまま本番へデプロイできる。
※ 業務に使用できるレベルなのかは検証してください。

# 検証PC

* macOS Mojave バージョン 10.14

# Docker for Macをインストール

URLから「Download from Docker Store」を押下
右上の「Get Docker」を押下し、Dockerのインストーラーをダウンロード

[Docker(公式サイト)](https://docs.docker.com/docker-for-mac/install/)

※最近、docker hubの会員登録が必要になったため、会員登録すること。

ダウンロードが完了した後にターミナルを開き、下記のコマンドを実行

```
$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

```

# docker-composeをダウンロード

「docker-compose」とは複数のコンテナを使うDockerアプリケーションを定義・実行するツールです。

[docker-compose(公式サイト)](https://docs.docker.com/compose/)

最新のdockerのドキュメントを読みましたが、最新の「Docker for Mac」には「docker-compose」がDockerアプリに梱包されいるそうです。

> Follow these instructions if you are running the Docker daemon and client directly on Microsoft Windows Server with Docker Engine - Enterprise, and want to install Docker Compose.

~~下記のコマンドを実行してdocker-composeをダウンロード~~
~~`curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose`~~
~~下記のコマンドを実行~~
~~chmod +x /usr/local/bin/docker-compose`~~

下記のコマンドを実行して正常に表示されればOKです。

```
$ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h  27 Mar 2018
```
# docker-composeファイルの作成

検証用のディレクトリを作成
`mkdir docker-compose-test`

「docker-compose-test」に移動
`cd docker-compose-test`

dockerの設定を記載するymlファイルを作成
`touch docker-compose.yml`


「docker-compose.yml」に下記の内容をコピー

```
version: '3'

services:
  amazonlinux2:
    container_name: amazonlinux2
    image: amazonlinux:2
    ports:
      - 80:80
    tty: true
    privileged: true
    restart: always
```

# docker-composeでdocker containerを起動

下記、コマンドを実行し、コンテナを起動
`docker-compose up -d --build`

下記のように表示されていればOKです。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
96cca54b9e91        amazonlinux:2       "/bin/bash"              44 seconds ago      Up 43 seconds       0.0.0.0:80->80/tcp                  amazonlinux2
```

docker container内にlogin

`docker exec -it amazonlinux2 bash`

# docker imageを作成

docker containerを確認

```
kusunokBookpuro:docker-compose ry_kusunoki$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
96cca54b9e91        amazonlinux:2       "/bin/bash"              16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp                  amazonlinux2
```

docker containerを停止
`docker-compose stop`

docker containerが停止されているのを確認

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                               NAMES
96cca54b9e91        amazonlinux:2       "/bin/bash"              17 minutes ago      Exited (137) 31 seconds ago                                       amazonlinux2
```
docker containerからimageを作成

```
$docker commit amazonlinux2 project_name:1
sha256:1d727fdd2987cfb95f33469648facd6e2b7c2a2d682c9267191346a6c185052e
```

「docker image」が作成されているのを確認

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
project_name        1                   1d727fdd2987        46 seconds ago      163MB
```

先ほどの「docker-compose.yml」を修正

```
version: '3'

services:
  amazonlinux2:
    container_name: project_name1
    image: project_name:1
    ports:
      - 80:80
    tty: true
    privileged: true
    restart: always
```

作成したdocker imageでdocker containerを起動

`docker-compose up -d --build`

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
3849b30ec5bd        project_name:1      "/bin/bash"              6 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp                  project_name1
```

```
$ docker exec -it project_name1 bash
bash-4.2#
```

# 最後に
どうでしたでしょうか？
defaultのコンテナを作成し、そこから案件に沿った環境を構築したdocker imageを作成することによって、ローカルPC内のミドルウェア乱立が防げるのではないのでしょうか？

また、検証用サーバとしても使用でるため、ツール類の動作確認などのテストも実施できます。

急ぎ足で記載したため、ご不明な点がありましたら、お手数ですが、コメントで質問をお願い致します。

最後まで、ご拝読有難う御座いました。