初心者がDockerを理解してみた

#初心者がDockerを理解してみた


##目次
1,Dockerの概要
2,Dockerのアーキテクチャ
3,コンテナのアーキテクチャ
4,まとめ
5,最後に

##1,Dockerの概要

多くのサービス提供している本番環境と開発環境はどのように構築、運用されているだろうか。また、本番環境のアプリケーションを更新するときはどのような手法を用いるだろうか。多くの場合はベアメタルにそのままOSをインストールして使用するか、ハイパーバイザーなどの仮想環境をインストールして、その上に仮想マシンを構築し、OSをインストールしアプリケーションを実行するかと思われます。
ここで新しい選択肢としてDockerが存在します。DockerとはベアメタルにOSを直接インストールしてリソースを余らすようなことも、ハイパーバイザーを入れて余計にリソースを消費することもないサービスの環境構築に最適なアプリケーションです。
Dockerが作られた背景には、サービスを実行する環境構築を、古くからあるコンテナ技術を利用することで手軽に行えるようにしようという思想があります。そのため、開発環境で構築してテストをしすぐに本番環境に移動し実行するという、<font color="crimson">***構築、移動、実行***</font>が素早く行える仕組みになっています。
ここで前提として言いたいのは<font color="crimson">***「Docker = コンテナではない」***</font>ということです。
コンテナ技術というのはLinuxやUnix界隈では古くから<font color="crimson">***アプリケーションをローカルホストから隔離した環境として実行できる技術***</font>として存在していました。
これに対して、このコンテナをイメージという形にして簡単に構築、移動、実行、削除、複製などを行えるように下のがDockerです。また、作成したイメージを利用して本番環境に複数デプロイすることで少ないディスク容量でリソースを最大限利用することも可能です。これらのことからDockerの特徴は
###***Dockerの特徴***
<font color="crimson">***1,構築したアプリケーションを必要な環境と一緒にコンテナとして構築し、それをイメージという形にすることで手軽に開発、移動、実行などの操作をすることができる。***</font>
<font color="crimson">***2,少ないディスク容量で最大限リソースを無駄なく使用することができる。***</font>

だと考えられます。またこれに対して、Dockerの苦手なところとして挙げられるのが、
###***Dockerの苦手分野***
<font color="crimson">***1,長期的に安定した稼働***</font>
<font color="crimson">***2,比較的複雑なネットワークの利用***</font>
<font color="crimson">***3,実行可能なサービスの環境はLinuxに限られる(ホスト側はWindowsでもMacでも可能)***</font>
<font color="crimson">***4,運用が少し複雑になる可能性あり。***</font>

##2,Dockerのアーキテクチャ
1章でも紹介したようにDocker自体は古くからある技術であるコンテナをイメージという形にして構築、移動、実行ができるようにしたアプリケーションです。このDockerアプリケーションは主に以下の3つのコンポーネントによって成立しています。
2-1,Dockerサーバ
2-2,Dockerクライアント
2-3,Docker hub
この章ではこれらそれぞれを説明していきたいと思います。
###2-1,Dockerサーバ
Dockerサーバはコンテナを作成したり、実行したりすることができます。
Dockerサーバは主に二つの<font color="crimson">***「containerd」と「runC」***</font>の二つで成り立っています。
これらはどのように違っているのかというと、
***containerd:コンテナと、イメージの管理、監視を主に行う。***
***runC:コンテナを実際に実行する。***
というような使い分けがされています。以下のイメージが理解しやすいです。
https://qiita-image-store.s3.amazonaws.com/0/13002/02de6fd8-ea0d-2fc9-a18f-817109819baf.png

このように管理と実行のコンポーネントがわけられて実行されています。


###2-2,Dockerクライアント
上記のDockerサーバに対して操作を実行する方法としてDockerクライアントからCLIによるコマンドの実行、もしくはGUIによるイメージやコンテナの操作ということが可能です。
では、実際にどのような操作をすることができるのかをまずはCLI操作であるコマンドの一部を紹介したいと思います。

```Dockerコマンド
#イメージを持ってくる
docker pull <イメージ名>

#Dockerfaileからコンテナの起動、構成、イメージファイルの作成までを行える
docker build

#Dockerのコンテナ一覧をみる
docker ps

#コンテナのイメージを検索する
docker search TERM

#コンテナ内でコマンドを実行する
docker exec CONTAINER コマンド

etc...
```
などのようにイメージとコンテナの作成、管理を行える様々な種類があります。
これらのコマンドを使用することで、Dockerのイメージとコンテナを操作、実行します。
ちなみに、これらのコマンドはRestful APIの形式で実行できるため、httpを利用しリモートからも実行することが可能です。
次にGUI操作が可能であるクライアントツールを紹介したいと思います。
・[Kitematic](Kitematic)
・[Rancher](http://www.rancher.jp/)
etc...
これらはDockerのコンテナをweb UIを利用することでとても簡単にデプロイが行えたりできるようにされているツールです。実際のサービス提供環境などではこれらのツールを利用することで、開発、運用も手軽かつ確実に行うことができるようになるかと思われます。

###2-3,Docker hub
Docker hubとはコンテナがイメージという形にして容易に移動、実行ができるという特性を生かしたコンポーネントで、Dockerのイメージをクラウド上にアップし、それをダウンロードすることで誰でも手軽に一からイメージを作成せず必要な環境をデプロイすることができるというgithubのDockerバージョンみたいなサービスである。これは以下のサイトから今どのようなイメージがあり利用できるのかを確認することができる。
https://hub.docker.com/

###2-4,まとめ
これらの3つのDockerコンポーネントを利用することで、環境の構築、利用をより便利に行うことができる。
これらの関係性は以下の画像を見ることで関係性がイメージしやすくなる。
<img width="1258" alt="スクリーンショット 2018-05-19 16.37.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/182526/1222ee11-dbeb-1f8b-ea27-ed0025c03adc.png">


##3,コンテナのアーキテクチャ
2章ではDockerがコンテナをどのように操作しているのかを知ることができました。
3章ではその具体的な技術であるコンテナがどのように構成されているのかを説明していきたいと思います。
コンテナは主に以下の3つの

コンテナとはローカルホストで
コンテナを構成しているコンポーネントは主に以下の4種類
1,名前空間(NameSpace)
2,cgroups
3,UNION FileSystem

今回は詳しい技術的な内容に関する説明ではなく、それぞれがどのような機能実装しているのかを説明していきたいと思います。
では,「名前空間」についてです。
DockerはよくESXiやKVM,Xenなどの仮想マシンの軽量版だよねと勘違いされることがあるのですが、これは間違いです。
仮想マシンとはOSに必要なハードウェアシステムをエミュレーションし、その上でOSを実行し、完全にホスト側のシステムから切り離された状況にすることであらゆる環境を再現できるという仕組みです。
それに対してコンテナ技術はハードウェアのエミュレーションなどはせず、実行するアプリケーションのプロセスやディレクトリ構造、ユーザ空間やネットワーク空間を切り離し、その切り離された空間に対してリソースを割り当てているだけにすぎません。このプロセスやディレクトリを切り離す役割を持っているのが名前空間です。また、その空間に対して物理的なリソースを割り当てているのが、cgroupsです。
また、Docker上で実行するコンテナはイメージからビルドすることで実行が可能になっています。この、イメージはレイヤ構造になっています。以下の画像を見てください。
![docker01.jpg](https://qiita-image-store.s3.amazonaws.com/0/182526/0899abf5-f74a-cb58-ce3a-118a6ffe7645.jpeg)
上の画像はイメージからビルドしたコンテナのイメージです。コンテナはこのようにベースイメージとしてLinux OSの任意のディストリビュータのイメージをもち、その上に、追加されたレイヤのイメージ層が追加されて構成されております。このようにレイヤ構造にすることで、管理がしやすく、かつ必要なディスク要領を減らしています。また、上の画像を見るとわかるように基本的にイメージからデプロイしたレイヤーは読み込み専用として扱われ、書き込みを行う際はそれようのレイヤーが必要となる。このようなレイヤー構造のことをUNION File Systemという

##4,まとめ
大切かなと感じた要点を以下に簡単にまとめました。
1,Dockerとはコンテナの利用をより容易にしたものであり、コンテナそのもののことではない
2,Dockerではアプリケーションを必要な環境とまとめて構築、移動、実行できる
3,コンテナはハードウェアをより無駄なく活用できるアプリーションである
4,全ての環境でDockerを使用すれば良いというものではない

##5,最後に
今回このページは自分がどれくらい理解できているかを確認するために作成させてもらったページなので間違いなどございましたらご指摘いただければと思います。