CentOSからMySQLが接続出来る環境をDocker Composeを利用して作成する

## 目的

* 既存のDockerコンテナ間で接続不良が発生しているように思える事に対する、比較検証用Dockerイメージを作成
* 筆者が今まで数時間しかDocker使ったことがないため、学習目的を兼ねてます

### Dockerとは

コンテナ型の仮想環境
VirtualBoxなどの仮想環境と比べ、ゲストOSや仮想ハードウェアを利用していないため、軽量で起動が早く利用できる

### Docker Composeとは

複数のDockerコンテナを同時に管理出来る機能

***

## 前提

Mac　OS High Sierra　１０．１３．５
MacのMySQL Ver 8.0.11 for osx10.13 on x86_64 (Homebrew)

***

## Dockerのインストール

[Docker Community Edition](https://www.docker.com/community-edition)をインストールする

```
$ brew cask info docker
docker: 18.03.1-ce-mac65,24312
https://www.docker.com/community-edition
$ brew cask install docker
```

Dockerを起動し、マシンのパスワードを入力した後、インストール確認を行う

```
$ docker version
 ~
 Version:      18.03.1-ce
 ~
```

***

## Docker IDの作成及びログイン

Sign in Create Docker IDからDocker IDを作成してログインする

![signin.png](https://qiita-image-store.s3.amazonaws.com/0/25578/c699dd63-f71f-023a-a9fb-685c28462797.png)

## 作業前

作業用ディレクトリを作成して移動(※必須ではない)

```
$ mkdir dockerpractice
$ cd dockerpractice
```

## Dockerfileの作成

docker-compose用のディレクトリを作成する

```
$ mkdir centos
$ mkdir mysql
```

### CentOS

[Docker Hub:centos](https://hub.docker.com/_/centos/)から対象のタグ(centos6, 6 (docker/Dockerfile))を確認しつつDockerfileに設定する

```
$ vi centos/Dockerfile
```

```:centos/Dockerfile
FROM centos:6

RUN yum -y update && yum -y install mysql && yum clean all
```

### MySQL

[Docker Hub:mysql](https://hub.docker.com/_/mysql/)から対象のタグ(5.6.40, 5.6 (5.6/Dockerfile))を確認しつつDockerfileに設定する

```
$ vi mysql/Dockerfile
```

```:mysql/Dockerfile
FROM mysql:5.6.40
```

## docker-composeを利用した複数コンテナの管理

### 設定ファイル作成

docker-compose.ymlを作成して

```
$ vi docker-compose.yml
```

イメージの構成を記載する

```:docker-compose.yml
version: '3'
services:
  mysql:
    build: ./mysql
    image: mysql:5.6.40
    ports:
     - "3306:3306"
    environment:
     MYSQL_ROOT_PASSWORD: mysql
  centos6:
    build: ./centos
    image: centos:6
```

### Docker image立ち上げ

docker-composeを利用してイメージを立ち上げる

```
$ docker-compose up -d --build
```

### 起動確認

```
$ docker-compose ps
          Name                       Command             State           Ports
---------------------------------------------------------------------------------------
dockerpractice_centos6_1   /bin/bash                     Up
dockerpractice_mysql_1     docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp
```

### 接続確認

#### MySQLから

```
$ docker exec -it dockerpractice_mysql_1 bin/bash
# mysql -uroot -p
Enter password: パスワード
~
mysql>
```

#### ローカルからMySQL

```
$ mysql --port=3306 --host=127.0.0.1 -uroot -p
Enter password: パスワード
~
mysql>
```

#### CentOSからMySQL

docker-compose.ymlで定義したbuildに対して接続を実施する

```
$ docker exec -it dockerpractice_centos6_1 /bin/bash
$ mysql --port=3306 --host=mysql -uroot -p
```

## 結果

CentOSからMySQLに接続する際、127.0.0.1ではなく、docker-compose.ymlに定義したbuildをhostに設定しないとならないのが分かりましたのと、Dockerの操作方法が理解できました。

## 参考

* [DockerでCentOS 7のイメージを利用してみよう](https://weblabo.oscasierra.net/docker-centos7/)
* [Dockerfileを書いてみる](https://qiita.com/nl0_blu/items/1de829288db2670276e8)
* [Compose file version 3 reference](https://docs.docker.com/compose/compose-file/)
* [Dockerの公式MySQLイメージの使い方を徹底的に解説するよ](http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html)
* [DockerのMySQLコンテナに外部からアクセスする方法まとめ改](https://qiita.com/saken649/items/00e752d89f2a6c5a82f6)
* [MySQL コンテナへのカスタム my.cnf 設定の追加](https://docops.ca.com/ca-api-gateway/9-2/jp/mysql-my-cnf-367732006.html)