【Docker入門①】そもそも『Docker』とは…？

>この記事では、《Docker や コンテナ》について、
業務を通して学習した内容をまとめています。

- __『Docker』とは…？__
- __『Docker』って何が良いの…？__
- __『Docker』のアーキテクチャ（構成）__

こういった疑問についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

##『Docker』とは…？

![docker.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/3842a806-945a-8d74-bd64-b830c9f81d4e.jpeg)

__『Docker』__とは・・・

Linux上で__コンテナを作成・管理・実行するためのプラットフォーム__です。

[Docker社（旧dotCloud社）](https://www.docker.com/)によって、2013年3月に初版がリリースされ、__現在ではインフラ関係やDevOps界隈で注目されている技術の一つ__です。

>Windowでも・・・
>Windows Server 2016 からはWindowsコンテナが利用できるようになりました。<br>*__※Windowsコンテナは、Windows上でのみ実行可能__です*

##『Docker』を利用すると何がメリットなの…？

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

なので、まずは・・・

__『仮想マシン』と『コンテナ』の違い__

について簡単に見ていきましょう。

###『仮想マシン』と『コンテナ』について

![virtual_machine_and_container.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/26469397-dbc4-e655-e36c-ff2c07b73164.png)

__『仮想マシン』__は・・・

ホストOS上で『[VirtualBox](https://www.virtualbox.org/)』や『[VMware](https://www.vmware.com/jp/products/workstation-player.html)』などの__仮想化ソフトウェア__を利用して仮想マシンを作成し、その仮想マシンのゲストOS上でアプリやミドルウェアを動かします。

>【余談】
>サーバー仮想化は、利用する仮想化ソフトウェアによって__『ホスト型』__と__『ハイパーバイザー型』__の２種類の手法に分類され、上記は__『ホスト型』__に該当します。
『ハイパーバイザー型』についても知りたい方は、ググってみてください。

そのため・・・

__起動に時間がかかるというデメリットがあります。__
（もちろん、完璧に環境を分離できるというメリットもありますが…）

それに対し、__『Docker』__は・・・

ホストOSのみの使用でプロセスやユーザなどを隔離することで、ホストOS上にあたかも別のマシンが動いているかのような環境を作ります。

そのため・・・

__軽量で、且つ高速に起動・停止することが可能__になります。

###『Docker』を利用するメリット【５つ紹介】

![point-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/04bc9221-e001-1e63-aa85-b13b5d92b31a.jpeg)

『Docker』では、__開発環境の構築（ミドルウェアのインストールや各種環境設定）をコード化して管理__します。

そのため・・・

『Docker』を利用することで、以下のようなメリットがあります。

- __コード化して管理することで、<br>誰でも、どこでも同じ開発環境が構築できる__
- __構築した開発環境を簡単に配布できる__

例えば・・・

>__"開発環境(Windows上)では正常に動作したけど、Linuxでは動作しなかった"__

なんて経験がある方もいるかと思いますが…

このケースの場合、開発工程から『Docker』を利用することで防ぐことができます。

さらには・・・

__『開発工程の中で使っていた環境をそのまま本番環境に持っていく』__

なんてことも可能なので、差分の発生がなくなり、環境差分によるトラブルも防ぐことができます。

また・・・

作成した`Docker イメージ`は他の開発メンバーにも渡せるので、それを使ってもらうことで…

- __メンバー間での開発環境のバージョンずれ防止__
- __準備時間（開発環境を準備する時間）の短縮__

にもつながります。

実際・・・

>__"資料の不備や手順ミスが原因で、開発環境の準備に丸一日かかってしまった"__

なんて経験がある方も多いんではないでしょうか…苦笑

そんなところで、__メリット__をまとめると下記の５つのようなモノが挙げられます。

1. &ensp;__起動が速い__
2. &ensp;__コード化して管理することで、<br>&ensp;誰でも、どこでも同じ開発環境が構築できる__
3. &ensp;__構築した開発環境を簡単に配布できる__
4. &ensp;__メンバー間での開発環境のバージョンずれ防止__
5. &ensp;__準備時間（開発環境を準備する時間）を短縮できる__

*__※あくまで一部なので、他にもたくさんあると思います__*

##『Docker』のアーキテクチャ（構成）

![shells_script_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/3245943b-9da4-e8bf-de6f-c70327a69127.jpeg)

『Docker』のシステム構成に関してのお話で、要は…

__『コンテナをどうやって動かすか』__

ってことについてです。

具体的には、『Docker』は下記の４つで構成され、サービスを提供しています。

1. &ensp;__Docker デーモン__
2. &ensp;__Docker クライアント__
3. &ensp;__Docker イメージ__
4. &ensp;__Docker コンテナ__

それでは、ひとつずつ見ていきましょう。

###①：Docker デーモン

![docker_daemon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/55828652-db30-46ee-ea39-80c9c12e87b3.png)

`Docker デーモン`は・・・

__コンテナの管理・実行を行います。__

`Docker デーモン`はイメージからコンテナを作成したり、実行したりするだけの存在なので・・・

実際は、`Docker デーモン`に対して指示を出すシステムが必要です。

それが、お次に紹介する__『Docker クライアント』__です。

###②：Docker クライアント

![docker_client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/adeeee8d-4c37-5b25-7850-b984030a09f5.png)

`Docker クライアント`は・・・

__『Docker』を操作するためのアプリケーション__です。

管理者からのコマンドを受け付けたら、その先にある`Docker デーモン`へ指示を飛ばし、それによってコンテナが動いたり止まったりする訳です。

###③：Docker イメージ

![docker_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/c3aa9627-fc7b-1e27-b4f6-225a83c71d19.png)

`Docker イメージ`は・・・

__コンテナの元になるひな形__で、`Docker レジストリ`に保管されます。

`Docker レジストリ`としては、[Docker Hub](https://hub.docker.com/)と呼ばれるオンラインサービスが提供されており、そこではイメージの共有やダウンロードが可能です。

###④：Docker コンテナ

![docker_container.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/eac6c1ad-c437-ef67-3ba9-1ff92e603d15.png)

`Docker コンテナ`は・・・

__Docker イメージを元にして実行されたプロセス__です。

各コンテナは分離されているので、独立したホストの同じように扱うことが可能です。

## まとめ・感想

![surfing-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/2218daee-da1d-1b3c-3282-a612d24fe7b3.jpeg)

『Docker』に関しても『業務のなかでもやってみたい！』と思ってますが、なかなかチャンスがなさそう…。
（待っててもチャンス来ないので、行動するしかないですね笑）

今後は…

__『Dockernのセットアップやコンテナの起動方法』__

についてもまとめる予定です。

__＜次のお話＞__
[【Docker入門②】『Docker』のセットアップと基本操作](https://qiita.com/yaaabu51/items/c018fee42e9605b57d62)