dockerの概要を知ろう！

Dockerをさわりでとらえてみる
-------------------------------------------------------------------------
環境構築ってめんどくさいですよね？
今回、上記の理由からdockerに関しての備忘録として残しました。
今回は以下を対象に書いていますのでご確認ください。
・dockerの概要のみを書き出します
・用語や関係性について書き出します
・詳細のコマンドや実際にコンテナを作成したりはしません

Dockerとは
-------------------------------------------------------------------------
よく見るあのクジラがコンテナを積んでいるやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/70035dc9-3a6b-e841-f3ea-4327d437e57e.png)

dockerとは簡単に説明すると環境構築をパッケージ化して管理・配布などをできるようにするアプリケーションです
良く比較として出てくるのは仮想PCですが、dockerは仮想コンテナと呼ばれておりゲストOSを持たないのが特徴です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/37c357ad-a6ef-3d55-7d6c-75ce757e6903.png)


仮想PCとdockerコンテナの比較について
-------------------------------------------------------------------------
| 項目| 仮想PC（Virtual Machine） | Docker コンテナ |
|:-:|:-:|:-:|
| アーキテクチャ  | 各VMに独立したOSを持つ仮想ハードウェアを提供  |  ホストOSのカーネルを共有する軽量な環境 |
| 構成要素  | ハイパーバイザー、ゲストOS、アプリケーション  | Dockerエンジン、コンテナ、アプリケーション  |
| リソース使用  | 高い (OSごとにメモリやストレージを割り当て)  |  低い (ホストのリソースを効率的に共有) |
| 起動速度  |遅い (OSのブート時間が必要)   | 速い (ホストOSのカーネルを利用し即時起動)  |
| 独立性  | 高い (各VMは独自のOSを持ち、完全に独立)  | 中程度 (カーネルを共有するが、アプリごとに隔離)  |
| 適用例  | マルチOS環境のテスト、独立環境の強い分離が必要な場面  | マイクロサービス、開発/テスト環境の構築  |
|  オーバーヘッド | 高い (ゲストOSと仮想化による)  | 低い (コンテナ技術のみによる)  |
|  可搬性 | ハイパーバイザーに依存  | Dockerエンジンさえあれば、ほぼどこでも同じ動作が可能  |
| スケーラビリティ  | 制限あり (リソースの大幅な割り当てが必要)  |  高い (複数のコンテナを軽量に実行可能) |

・抑える点としては以下で十分かと思います

**①ゲストOSを持たないので仮想PCに比べると起動が早い**
仮想PCを使用したことある人はご存じでしょう、ゲストOSがあるので立ち上がりが遅いです。
仮想コンテナはゲストOSを持たないので起動が早いです
Q、ではどのようにOSによる操作を行うのか？
↓

**➁dockerはdockerエンジンによってホストOSのカーネルを使ってコンテナの操作/管理を行っている**
カーネルとはOSに存在する司令塔のようなもので、リソース管理をしてくれてます。
この子のおかげでPCは常に効率よく動いています。
Q、windowsOSの人が作成したコンテナ※はMacOSでは使えない？
↓

**③ゲストOSに依存しない**
➁でお伝えしたようにホストOSのカーネルを使用するので異なるOS間での使用制限がありません。
※厳密にはイメージを配布します


dockerに関する単語
-------------------------------------------------------------------------
dockerを始めるといろいろな単語が出てきます。
必要な単語をまとめました。(全部ではありません)
実際にコンテナの作成と合わせて確認しましょう。
<details><summary>docker単語一覧</summary>
・docker Hub
・docker Registry
・docker Desktop
・docker Daemon
・docker file
・docker image
・docker Container
・docker Compose
</details>

docker コンテナを管理する(docker Desktop・daemon)
-------------------------------------------------------------------------
docker Daemonとはdockerの中核プロセス、コンテナの作成、実行、管理を行ものです。
またdocker Daemonに対して簡単に操作できるのがdocekr Deaktopです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/ff851fea-63fb-46ff-a5f7-7e81ff03242f.png)

docker コンテナを作成する(docker file・image・container)
-------------------------------------------------------------------------
コンテナ作成の順序としては
①定義→➁レシピ→③実物
となります。
①使用するアプリ、ミドルウェアの情報を設定します(docker file)
➁上記を確定させたレシピを用意します(docker image)
③レシピから実際に作成されたものです(docker container)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/813f8e21-d285-d654-733b-d05e81ed8718.png)

docker コンテナを作成・配布する（docker Registry・Hub）
-------------------------------------------------------------------------
docker fileで作成したイメージはほかのユーザに共有したり、逆にすでに作成されているイメージを使用することができます。
ここがdockerの一番の魅力かと思います、開発環境構築でテスト環境や本番環境をスムーズに用意することができ、バージョン違いなどによる不備を防止できます。
また配布することで同じチームのメンバ―も即座に環境構築できるのが魅力的です。
イメージを持ってくるだけでできるので、学習用にサクっと開発環境を用意できるのが素晴らしいです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/0905b19b-e879-e607-e61d-9b3f4416b0c6.png)

私が疑問に思ったこと
-------------------------------------------------------------------------
①imageを挟む理由って何？docker file→docker containerで良くない？
➁docker imageの中に例えばPHPやMySQLなどの情報が入っているの？

①→正解は×
-------------------------------------------------------------------------
docker fileとはあくまで定義している段階なので、例えば配布時にバージョンがズレてしまうなどのミスが起こりかねません。
docker fileをビルド段階で、作成されたイメージは不変です。
また、コンテナを起動する際は毎回docker image→docker containerの順で実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/ce409e35-826d-c9bc-3acc-b9d44dc8c29c.png)

➁→コンテナは１つではない（docker compose）
-------------------------------------------------------------------------
実際のプロジェクトでコンテナを1つといった現場はほぼ無いかと思います。
コンテナが複数あり、それぞれ連携しています。
また1つのイメージには1つのアプリ情報があるので
1個目のコンテナ：php・laravel
2個目のコンテナ：Nginx
3個目のコンテナ：MySQL
上記のようなコンテナをそれぞれ連携させます、複数のコンテナを管理できるのがdocker composeなのです。
docker composeでは「docker-compose.ymlファイル」にそれぞれのアプリ・ミドルウェア情報を記載していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/3cc71acf-4e04-dfb0-b2ef-1963f403b7e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569214/f3eed81c-0889-fcb1-c717-a5481ba140b7.png)

最後に
-------------------------------------------------------------------------
dockerの概要について触れてみました。
私は先にdockerを触って、コンテナを作って触ってからこれらについて学習しました。
先に触ったので「あ、ここってそういう意味だったんだ」となることが多かったです。
使ってみると便利だと思うので、機会がありましたらご参考ください！