中学生がDockerについてイチから学んでみた(1)

##まえがき
こんにちは！
二月からプログラミングを始めたとある中学生です。
今までCloud9でRailsを使っていたのですが、最近学校のプロジェクトに参加した際にDockerの存在を知りました。
Cloud9はrails sしてボタンを押すだけなので今まで環境構築に困ったことはなかったのですが、急にDockerに触れて何が何だか全く理解できませんでした。。
これから他の言語を使っていくにあたって、いつまでもCloud9に頼っていてはダメだと思ったので、**イチから**ゆっくり学んでみたいと思います！ 今回は導入編です。
間違えなどありましたらご指摘お願いします。


##そもそもDockerって何？ ざっくりと
![docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617418/b3a45bb8-3e9b-7c0a-b0d0-dd22ed53bcf4.png)
最初はガイドの冒頭部分を翻訳（自分で行っているので、間違っているかもです)して、簡単につかんでみようと思います。

> Docker is a platform for developers and sysadmins to build, run, and share applications with containers. The use of containers to deploy applications is called containerization. Containers are not new, but their use for easily deploying applications is.
Containerization is increasingly popular because containers are:
**Flexible**: Even the most complex applications can be containerized.
**Lightweight**: Containers leverage and share the host kernel, making them much more efficient in terms of system resources than virtual machines.
**Portable**: You can build locally, deploy to the cloud, and run anywhere.
**Loosely coupled**: Containers are highly self sufficient and encapsulated, allowing you to replace or upgrade one without disrupting others.
**Scalable**: You can increase and automatically distribute container replicas across a datacenter.
**Secure**: Containers apply aggressive constraints and isolations to processes without any configuration required on the part of the user.
（Docker公式ガイドから抜粋)
>> Dockerは開発者・システム管理者たちのため、コンテナによってアプリが一通り走るようにしたり、アプリを共有できるプラットフォーム(基盤)です。コンテナを使ってアプリをデプロイすることは、＊コンテナリゼーションと呼ばれます。コンテナは決して新しいものではないですが、簡単にアプリを開発、構築できます。
コンテナリゼーションがますます人気になっている理由は:
**柔軟性**:一番複雑なアプリでさえもコンテナリゼーションにできる(？)
**軽量**:コンテナを活用・ホストのkarnelを共有することでリソースを仮想マシンと比べて遥かに効率的にします。(？)
**携帯性**:自分のローカル環境で構築、クラウドにデプロイ、そしてどこでもアプリを走らせることができます。
**緩やかな結びつき**:コンテナはかなり十分です。コンテナは他のものを混乱させることなく、場所を変更したり更新することを許してくれます。(？)
**拡張性**:コンテナを増やし、複製をデータセンターに自動で分散させることができます。
**安全**:コンテナは、ユーザー側で構成を必要とせずに、積極的な制約と分離をプロセスに適用します。

？がついているところは翻訳が怪しいです。
よくわかんない単語が多いですね、、、
とにかく**Dockerは私たちが簡単に利用できる、軽量なアプリの実行環境を提供する便利なツールであり、しかも他の人が作った環境をクラウドから簡単に利用することができるという機能まで持ち合わせる素晴らしいアプリケーション**ということですね。

＊コンテナリゼーション・・・定規格のコンテナに大小様々な貨物を積み込んで、コンテナごと一斉に運んでしまう輸送体系。つまり、色々な情報を一つのコンテナでまとめて運んじゃうこと。

##イメージ・コンテナとは？
Dockerの記事とかをみても当然のようにイメージとかコンテナとか言っていますが、まず前提が分からない！　ということありますよね、、
この２つはDockerを始めるにあたって重要概念です。
**イメージ**：軽量で単独で動くことができ、ソフトウェアを動かすための部品（設定ファイルなど)が全て詰め込まれたパッケージのこと。
**コンテナ**：イメージが実行されているときにあるもの。イメージからPCのメモリ内に展開し、実際に実行するもの。

コンテナはイメージの受け皿という認識です。
[Dockerについてなるべくわかりやすく説明する](https://qiita.com/rawHam/items/80ba13d2d2d56dba411e)によると
>イメージは冷凍チャーハン、コンテナは皿に盛られたチャーハン

だそうです。冷凍チャーハン（イメージ）は温められ、皿に盛られてはじめて食べる（アプリを走らせる)という行為ができるようになるということですね。　間違っていたらごめんなさい。

##Dockerのコンテナ型仮想化って？
Dockerはコンテナの仮想化ツールと言われます。正直、ド初心者の私にはそれだけ言われても分かりません、、ひとまず図で見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617418/50e2e86c-1658-effe-3a1b-fc7cfcf1331d.png)

ホストOS上にコンテナによって区切った領域を作り出し、その中でプロセスと呼ばれる実行中のプログラムを動かします。
そしてコンテナはホストマシンを利用し、プロセスなどを隔離することで、あたかも別のマシンが動いているかのように振る舞ってくれます。

これらからまとめると、**物理サーバー（実際に存在するサーバー)を必要とせずしない仮想環境で、コンテナという複数の独立した空間からアプリを走らせること**、これがコンテナ型仮想化ということですね。


##Dockerのいいとこ・悪いとこをざっくりと
VMと比べたりされますが、そのあたりはくわしくは説明しません。下のリンクの記事で詳しく書かれています。
[VM・Dockerといった仮想化技術を理解する](https://qiita.com/r-tominaga/items/8ac588d603802572185f)

いいとこ
・高速な起動
・メモリやディスクの消費が少ない
・ハードウェアに依存しない(これがDockerガイドのいう「Portable」ですね)　=> 汎用性
・他のユーザーが構築してくれた環境を簡単にコピーできる、環境構築が簡単になる。
・環境を作るのが失敗しても、ポイ捨てしてやり直せる。(これはありがたい！)

悪いとこ
・Windows Serverには対応しておらず、Docker Toolboxという別のソフトをインストールする必要がある
・コンテナでホストではない別のOSを動かすことはできない(windowsの上でLinuxを立ち上げる)

これ以外にもあるようですが難しいものも多かったのでここまでにしときます

ざっとみていいとこが多いですね！　
Macユーザーにとっては本当に使いやすいアプリです。

##参考文献・画像
[仮想化の新潮流「コンテナ」とは](https://pfs.nifcloud.com/navi/tech/container_virtualization.htm)
[Dockerのメリット・デメリットまとめ](https://omathin.com/2020/03/14/Docker/)

##おわりに
ここまで読んでくださった方ありがとうございました
今回は短くなってしまいましたが、次からは実際にアプリを入れて操作していきます。
かなり習得するのには時間がかかりそうですが、インフラ周りのことを知ることはとても大事だと思うのでDockerと仲良くしていきたいですね！