やっとDockerについて調べた

# Dockerとは？

Docker社が開発している、
コンテナ型の仮想環境を作成、配布、実行するための
プラットフォームです。

Dockerは、Linuxのコンテナ技術を使ったもので、
よくVirtualBoxなどの仮想マシンと比較されます。

# 仮想化環境とDockerの違い

仮想化環境でも大きく3つの型に分けられます。

* コンテナ型
* ホスト型
* ハイパーバイザー型

Dockerはコンテナ型にあたります。

## コンテナ型

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/6edba41a-8874-1b8a-696d-efd7a7e40bdd.png)


**メリット**

* 起動が早く、処理が軽量、使用メモリがすくない
* 環境構築が容易

**デメリット**

* Linuxのコンテナ機能を用いているため、カーネルベースのOSじゃないと使えない
* ハイパーバイザー型と比べて分離レベルが低い、コンテナ型はホストOSの1プロセスとして動作するため
他コンテナの影響を受けやすい

※ 補足
WindowsやMacでDockerを動かせるのだが、
厳密には、準仮想化技術を用いて裏でLinuxを動かしているそうです。
[参考](https://teratail.com/questions/142866)

## ホスト型

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/b0bffdf2-c6de-8c35-82f6-57898e3df94d.png)

**メリット**

* ホストOSとは別に任意のゲストOS（WindowsやMacOS）を起動することができる

**デメリット**

* ホストOSに負担がかかると、仮想マシンのパフォーマンスに影響がある
* Vmware等の専用のソフトウェアが必要

## ハイパーバイザー型

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/b1d7ba58-69e5-8f0f-8a36-f9808b6471af.png)

**メリット**

* ハイパーバイザー型はハードウェアに直接インストールするため、
ホスト型のようなOSの成約を受けない

* 異なるOSを並列に実行することが可能

**デメリット**

* 専用のハードウェア、ソフトウェアが必要
* コンテナと比較すると、一台あたりのリソース消費が多く、起動に時間がかかる

# Dockerをプロジェクトに導入するメリット

* Dockerfile でインフラの作業をコードで管理できるので、
手順書作成等の時間を減らせる

* 複数人で開発する際に、環境の差が生まれない

* スクラップ＆ビルドが容易なので、
環境を壊してしまってもすぐに直せる。

* 依存関係ごとバージョンの切り替えが容易なので、
DB等のミドルウェアのバージョンを変えて動作確認などが簡単

# Dockerをプロジェクトに導入するデメリット

* ホストOSがLinuxでないとDockerは使えない

* 結局は、MacやWindowsでDockerを使うには専用の
アプリケーションが必要

* コンテナを立ち上げるまでは学習コストは低いが、
環境構築や運用となっていくと学習コストが高くなりがち

# Dockerを使ってMySQLサーバを立ててみる

構成は下記のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/74cad7c6-32b5-3fab-9c9c-21c2a730ea77.png)

## docker-compose.yml

docker-compose とは
複数のコンテナを操作するのに使用するDockerの機能です。
コンテナ毎のPORTの指定や、Dockerfileの場所等の設定を記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/43253897-399d-3ddc-3cc7-d1b5652760e5.png)

## Dockerfile

Dockerfile とは
コンテナ単体に対して設定や起動時にどのコマンドを実行したり、
使用するバージョンを記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/1c49a80e-c76a-0073-068d-fb473add3cf4.png)

## test-ddl.sql
SQLのCREATE文が書いてある普通のDDL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/43940c9a-254d-9edf-c7d3-19c32ea623c9.png)

## Dokcerの起動

```
# 起動
docker-compose up -d
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/be16717e-0219-fb80-0686-b25cd611d0d7.png)

```
# コンテナが起動しているか確認
docker ps
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/2624ad40-c8c1-4869-417f-d7e8abad913e.png)

## MySQLへの接続

```
# コンテナへ接続
docker exec -it docker-mysql_mysql_1 bash -p

# MySQLへ接続
mysql -u root -p -h 127.0.0.1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/d216b1c9-7942-1c1f-1951-63caf2b012b4.png)

```
SELECT句でデータを確認
select * from key_val;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/fab5a621-50eb-514b-c35d-af50c92dcb3b.png)

# 実際にDockerを触ってみた感想

ローカルの環境に様々なミドルウェアやツールを入れて開発をしていくと、
以前入れていたミドルウェアとの競合や別バージョンのミドルウェアの入れ替えなどを行うと環境が汚染されてOSを入れ直すことが度々ありました。
しかし、Dockerを触ってみて、環境の構築・削除が高速で煩わしい初期設定をしなくて良くなったのが魅力的でした。
ただ、開発をする上で必須なスキルかと言われると半々な気がしますが、
インフラに関する作業が多いなら、覚えておいて損がないと思います。
情報についてはあまり見つからず（探し方が悪い？）、
英語で記載されたドキュメントと向き合う必要があるので、
学習コストがやや高い印象を受けました。

# さいごに

Dockerのクジラの名前は **“Moby Dock”(モビードック）** と言うそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/44c09807-99c2-2dd5-aca6-c1bef37d9285.png)

普段はエラーが出ると超絶イライラするのですが、
クジラさんの表情が可愛いので許してしまいます。
しかし、結局はエラーなのでやっぱりちょっとイライラします。