Docker ContainerでMySQLを立ち上げて外部から接続

記事の目的
Dockerについて学習するにあたり、チュートリアルを行なったため
自分のアウトプットと振り返りを兼ねて残すことが目的

目次
1.Docker概要
2.Docker Container上でMySQLを立ち上げる
3.外部から接続する

# 1.Docker概要

## Dockerとは?
仮想化をコンテナを使用することで実現するためのツール。
仮想化を行うツールにはVMWareやVirtualBoxなどがある。

### コンテナの特徴
DockerがVMWareやVirtualBoxと異なる点について参考
https://www.docker.com/resources/what-container

仮想化は実現方法によっていくつに分類される。
そのには以下のものが存在する。

- 仮想マシン
 - VMとも呼ばれる。
仮想化の実現方法に、ハードウェアを抽象化する方法をとる。
1つのマシン上で複数のVMを起動するためにハイパーバイザというソフトウェアを使用する。
[ハイパーバイザ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)
VM１つ１つにOS（ゲストOS）が必要になる。そのため容量が多く必要になるし、起動に時間がかかる。

- コンテナ
 - アプリケーションが依存する層を抽象化する。
１つのマシン上で複数のコンテナを起動でき、OSの機能は他のコンテナと共有できるため、
コンテナ1つに1つのOSを必要としない。
そのため仮想マシンよりも起動が早い。

Dockerはコンテナの特徴を持つ。

### Dockerで使用する単語
- Docker Container
 - Dockerがある構成によってアプリケーションを起動する単位のこと。  
   Docker Containerは同じ構成のコンテナであっても複数起動することができる。

- Docker Image  
 - Dockerコンテナの構成を管理する単位のこと。  
   異なるコンテナを起動するためには異なるDocker Imageが必要となる。  
コンテナの素のようなもの。イメージには名前とバージョン(TAG)が付けられる。イメージはDocker hubで管理可能。

- Docker hub
イメージを管理するリポジトリ。アカウントを作成して、イメージをpushすることで自分のリポジトリの管理下における。

- DockerFile  
 - Docker Imageのビルドに必要なことを記述したテキストのこと。
 決められた書き方に沿って記述することでイメージやコンテナをどんなものにするか、どんな指示を出すかなどが指定できる。例えばビルドしたいDocker ImageはCentOSを使用する、そのImageが使用するファイルを所定の場所に移動する、ポート80番を使用するなど。

## 2.Docker Container上でMySQLを立ち上げる
コンテナを立ち上げるにはイメージが必要。  イメージはDockerFileからビルドできるが、Docker hubからpullすることでイメージを入手することができるため、DockerFileを1から作る必要はない。
このことを念頭に、Dockerのインストールから進める。

### 環境
macOS Mojave 10.14.5

### Dockerのインストール
Community版をインストールする。Enterpriseは触ったことないから機会があれば。
こちらのリンクからhttps://hub.docker.com/editions/community/docker-ce-desktop-mac
ページ中盤のボタンをから安定版と最新版の好きな方を選ぶ。
![dockerInstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245965/9ec44609-21ab-6805-c3f7-85e46ca4dd85.png)
あとは案内の通りにインストールを進める。
一通り終わったら以下のコマンドでインストールされたことを確認

```shell-session:
$ docker version
Client: Docker Engine - Community
以下略
```

### MySQLをコンテナ上で起動
docker hubにはたくさんイメージがあるので、MySQLのイメージも入手できる。
https://hub.docker.com/

```shell-session:
$ docker image pull mysql
以下略
```
```docker image pull```でdocker hubからイメージを取得できる。今回はMySQLを取得。
次に以下のコマンドでイメージが存在することを確認する。

```shell-session:参考
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              abcdefghijklm       11 days ago         445MB
```
REPOSITORYにmysqlがあればOK
イメージ入手後```docker container run```でコンテナを起動

```
 $ docker container run \
 --detach \
 --name mydb \
 -p 3306:3306
 -e MYSQL_ROOT_PASSWORD=my-secret-pw \
 mysql:latest
```
```--detach ```　バックグラウンドで起動
```--name mydb```　起動するコンテナにmydbという名前をつける
```-p 3306:3306``` 3306番ポートで起動し、ホストOSから3306番ポートでアクセス可能(host:guestの順番)
あとはパスワードとバージョン指定しただけ。

##3.外部から接続する
3306番ポートで接続できるようになっているので、そのポートを指定する。
今回はIntelliJ IDEA CEから接続

IntelliJのDB Browserを開きコマンドで入力した情報をもとに接続情報を設定する。
![intellijDBConnection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245965/e6278746-deef-5860-2933-d42c133f9bbf.png)
Test Connectionを押下して、接続できれば外部からの接続に成功

## 参考
- Dockerのページ
 - [Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
 - [Docker for Beginners - Linux](https://training.play-with-docker.com/beginner-linux/)
 - [What is a Container?](https://www.docker.com/resources/what-container)
- ブログ記事
 - [いまさらDockerに入門したので分かりやすくまとめます](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1#docker%E6%A6%82%E8%A6%81)