【初学者】Dockerに関する基本情報とMySQL接続までの流れ

RailsとSQL、Dockerについて改めて学習し直しています。
今回は、Dockerについて、学んだことをまとめ、引用・参考したサイトをこちらに記していきます。

# Dockerとは？
>Dockerを一言で表すと、データやプログラムを隔離できる仕組みです。
私たちが使用しているパソコンやサーバでは、複数のプログラムが動いています。パソコンであれば、ExcelやWordなどのソフトウェアを同時に立ち上げて使用していますし、サーバでは、ApacheやMySQLなどの複数のソフトウェアが同時に動いています。
こうした複数のデータやプログラムを、独立した環境に構築することができるのがDockerです。

<a href="https://qiita.com/3y9Mz/items/26521b00f097044e9388">【Docker】Dockerについて</a>

# Dockerの特徴
- 「コンテナ」と呼ばれる仮想環境を構築する。

#### 【補足】Apacheとは？

> Apacheは、無償で利用できるオープンソースのWebサーバーソフトウェアです。 汎用性が高く、WindowsやLinuxなどの様々なOSで動作させることができます。 また、高い安定性と信頼性、動作の軽さから人気を集めており、個人から企業などのエンタープライズ市場まで幅広く利用されています。

引用：<a href="https://www.winserver.ne.jp/column/about_apache/">Apacheとは。Webサーバーソフトとしての特徴や将来性を解説</a>

# Dockerが動く仕組み

> Dockerを使うにはいくつかの制限があります。それは、WindowsでもMacでもDockerを使うことが可能ですが、Linuxが必要になることです。これはDockerはLinux OSを使うことを前提に開発されているため、別途Linux環境が必要になります。また、Dockerを使うにもまずは、Docker Engineをインストールしなければなりません。このエンジンはコンテナの作成や移動を実現してくれます。

<a href="https://qiita.com/tumu1632/items/06b4f3a189d828181536">[Docker]Dockerの概要</a>

https://qiita.com/tumu1632/items/06b4f3a189d828181536


つまり、Dockerを使うには、2つの環境が必要ということ。
- Linux OS
- Docker Engine


#### 【補足】Docker Engineとは
> Dockerのイメージとしては、パソコン上やサーバ上の環境をコンテナという単位で分けて、この独立したコンテナにデータやプログラムなどが入っています。そして、このコンテナを支える仕組みがDocker Engineです。
Dockerを使用するには、Docker Engineというソフトウェアをインストールする必要があります。

引用：<a href="https://qiita.com/3y9Mz/items/26521b00f097044e9388">【Docker】Dockerについて</a>



#### 【補足】Linux OSとは
- Linux OSとは、オープンソースのオペレーティングシステム。
- オープンソースとは、世界中に公開されている無料のソースコードのことである。
- なので、いろんな企業がLinux OSを使ったサービスを開発している。
- スマートフォンのOS Androidが有名である。

過去にあげた記事もぜひ参考にしてみてください。

https://qiita.com/ym0628/items/a2fd98e17a415c8c26bf

# MacやWindowsでもDockerを使うことができる。

> Dockerは、Linux OS上でしか動きません。コンテナの中に入れるソフトウェアもLinux用のものしか入れることはできません。このようにDockerはLinuxを前提としたソフトウェアなので、MacやWindowsでは動かないはずです。しかし、`Docker Desktop for Mac`やDocker `Desktop for Windows`を使用することでDockerを使用することができるようになります。これらは、MacやWindows用のDockerではありますが、ユーザーからは見えない仮想のLinux環境を作成してそこでDockerを動かします。このソフトウェアはダブルクリックで起動できますが、実際にDockerを操作するにはコマンド（CLI）で操作することになります。


引用：<a href="https://qiita.com/3y9Mz/items/26521b00f097044e9388">【Docker】Dockerについて</a>



# Dockerを使う理由・メリット

Dockerにはどんな理由・メリットがあるから使われるのでしょうか？
- マシンへの負荷が軽く、仮想環境の構築から開発作業まで快適に、高速で行える。
- 共通の開発環境を簡単に構築できるため、複数人でのチーム開発に便利である。
- Dockerは、1台のマシンの上に複数の環境を構築でき、コスト削減に繋がる。

などのメリットがある。



# Dockerを使い始めるには？
Dockerを使い始めようという方は、大体の方が、WindowsかMacを使っているかと思います。
前述した通り、Linux OS環境で動くのがDockerであるのですが、ポピュラーな方法として、Dockerのデスクトップ版をインストールすることです。

https://www.docker.com/products/docker-desktop/

デスクトップ版である、`Docker Desktop for Mac`やDocker `Desktop for Windows`は、`Docker Engine`と`Linux OS`がパッケージになっています。

Dockerの環境を簡単に構築できます。

# Dockerの活用例

こちらの記事にて、Dockerの活用事例が解説されています。
とても参考になりました。

> 事例①開発環境の違いを回避
すでに見てきたとおり、Dockerを使うと開発環境の共通化・統一化を実現することができます。Dockerイメージを利用して、独自の環境を配布することも可能です。
大規模なシステムやサービスの開発で、開発にかかわる人数も大規模になっている場合、あるいは日本だけでなく、オフショア拠点を利用して開発している場合、開発環境や検証環境にわずかでも違いがあると、思わぬトラブルやエラーの原因となります。
Dockerを活用すれば、そうしたトラブルやエラーを回避できます。

引用：<a href="https://www.brain-gate.net/content/column/engineer-tips-docker/">Dockerって？できることやメリット・デメリットを解説！</a>

> 事例②クラスタ構成を構築
システムやサービスの拡張性（スケーラビリティ）や可用性（アベイラビリティ）を向上させ、高品質なシステムやサービスを実現するために、複数のサーバを連携させて動作させる「クラスタ構成」を利用することがあります。
クラスタ構成は、ユーザーから見たときに、複数のサーバをあたかも1台のサーバを使っているかのように連携させるので、構築が複雑になりますが、Dockerを使えば、クラスタ環境も複数のコンテナを管理するためのオーケストレーションツールを使って、より簡単に構築できます。

引用：<a href="https://www.brain-gate.net/content/column/engineer-tips-docker/">Dockerって？できることやメリット・デメリットを解説！</a>


https://www.brain-gate.net/content/column/engineer-tips-docker/




# Dockerを使った環境構築からMySQL接続まで

試しに、Dockerを使ってMySQLを実行するための環境構築を行なっていきます。

#### MacにDocker Desktopをインストールする。

Macを使っている方であれば、公式ドキュメントを参考に、こちらのサイトからインストールを行なっていきます。

https://docs.docker.jp/docker-for-mac/install.html#mac-docker-desktop


#### 任意のディレクトリを作成する
任意の場所に、適当に名前をつけて新しいディレクトリを作成します。


#### docker-compose.yml ファイルを作成

作成したディレクトリに移動して、`docker-compose.yml`というファイルを新規作成します。
```terminal
$ touch docker-compose.yml
```
#### docker-compose.yml に設定を記述する。
作成したファイル`docker-compose.yml`に設定を記述していきます。

```ruby:docker-compose.yml
version: '3.1'

services:

  db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    platform: linux/x86_64
    environment:
      MYSQL_ROOT_PASSWORD: ******* #ここには任意のパスワードを記述する
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - 3308:3306
volumes:
  mysql_data:
```
#### このコードの解説
- このコードはDocker Composeの設定ファイルで、MySQL 5.7を実行するための設定が記述されている。
- つまり、MySQLのDockerコンテナを起動するための設定を定義している。
1. `version: '3.1'` : Docker Composeのバージョンを指定している。
1. `services:` : 実行するサービスの設定を開始している。
1. `db:` : このサービスの名前を`db`としている。
1. `image: mysql:5.7` : 使用するDockerイメージを指定している。ここでは`mysql:5.7`を指定している。
1. `command: --default-authentication-plugin=mysql_native_password` : MySQLサーバーの起動時に実行するコマンドを指定している。
1. `restart: always` : コンテナが停止した場合に常に再起動するように指定している。 
1. `platform: linux/x86_64` : Dockerプラットフォームを指定している。
1. `environment:` : 環境変数の設定を開始している。
1. `MYSQL_ROOT_PASSWORD: ******` : MySQLのrootユーザーのパスワードを`******`としている。
1. `volumes:` : ボリュームの設定を開始している。
1. `mysql_data:/var/lib/mysql` : ホストのmysql_dataボリュームとコンテナの`/var/lib/mysql`ディレクトリをマウントしている。
1. `ports:` : ポートの設定を開始している。
1. `3308:3306` : ホストの3308ポートとコンテナの3306ポートをつなげている。
1. `volumes:` : グローバルボリュームの設定を開始している。
1. `mysql_data:` : ボリューム`mysql_data`を作成している。

この記述によって、MySQLのDockerコンテナを起動するための設定が定義されます。


#### Dockerコンテナを起動・停止する
作成したコンテナを起動するには以下のコマンドを実行します。
```
$ docker compose up
```

作業を終了する時は以下のコマンドでコンテナを停止させます。
```
$ docker compose down
```

#### コンテナ内部に移動する・抜ける

コンテナの起動後は、コンテナ内部に入ることで、MySQLに接続してデータベースを作成したりといった作業が行えるようになります。

```
$ docker compose exec サービス名 bash
```

また、Dockerコンテナの内部から抜ける際は、以下のコマンドを実行します。
```
# exit
```

その他、`docker-compose`コマンドについてこちらの記事が大変参考になりました。

https://qiita.com/nikadon/items/995c5705ff1171f7484d


#### Dockerデスクトップを立ち上げておく
MySQLへの接続には、Dockerを立ち上げておく必要があります。
アプリ先ほどインストールしたDocker Desktopを起動させておきましょう。

#### MySQLに接続する

```
$ docker compose up -d && docker compose exec `db（コンテナ名）` bash
```

- このコードは`Docker Compose`を使ってコンテナを起動し、その後`MySQL`の`bash`に接続するコマンド。
- `$ docker compose up -d` : `Docker Compose`で定義したサービスを起動する。`-dオプション`は`デタッチモード（バックグラウンド実行）`を意味する。
- `&&` : この記号は前のコマンドが成功した場合に後のコマンドを実行する。つまり、`Docker Compose`でコンテナの起動が成功したら次に進むことである。
- `docker compose exec db bash` : `Docker Compose`で実行中の`db`という名前のサービス（この場合、MySQLのコンテナ）に対して`bash`コマンドを実行する。これにより、MySQLのコンテナのシェルに接続できる。
- 全体として、このコードは`Docker`で`MySQL`のコンテナを起動し、そのシェルに接続するコマンドである。

#### MySQLから抜ける
MySQLを抜けるには以下のコマンドを実行します。

```
mysql> exit
```


Dockerを起動して入るまでの手順について、こちらでもわかりやすく解説しています。

<a href="https://qiita.com/tsuboyataiki/items/90dbe94553d3dea39b19">【Docker-Compose】コンテナ起動から入るまでを丁寧に</a>

https://qiita.com/tsuboyataiki/items/90dbe94553d3dea39b19




# 参考サイト

https://www.brain-gate.net/content/column/engineer-tips-docker/

https://qiita.com/3y9Mz/items/26521b00f097044e9388

https://qiita.com/tumu1632/items/06b4f3a189d828181536

https://qiita.com/search?q=Docker%E3%81%A8%E3%81%AF%EF%BC%9F

https://qiita.com/nikadon/items/995c5705ff1171f7484d

https://qiita.com/tsuboyataiki/items/90dbe94553d3dea39b19