[備忘録]Dockerの概要について

####本記事について
・自分の整理を兼ねて今更ながら概要をまとめてみたものです。

<img width="600" alt="top" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/e29132a7-acc7-1472-77f2-2df7684f9c2e.png">


#Dockerとは
・アプリケーションやOSの開発及び設備を行うための”コンテナ”を利用した基盤ソフトウェア
・ソフトウェア自体はGo言語で書かれている
・Dockerは、dotCloud社（現Docker Inc.）によって開発され２０１３年にリリース

#Docker（コンテナ）の特徴

####軽量なイメージ
・ハイパーバイザーでは、OS領域を含めた仮想マシンイメージとなるが、コンテナでは必要なアプリとライブラリ／MWで構成されるため軽量となる。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/8d28379e-7b8e-5985-e457-94e363ac69fd.png">

####高いポータビリティ
・複数のアプリケーションを含むOS環境を簡単にパッケージ化でき、開発・検証・商用環境と素早くデプロイできる。DockerHub（Dockerイメージのレジストリ）を通じて世界中で共有することができる。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/e6924e56-adf2-8716-f722-8fffd44d24e6.png">

####高速な起動
・Dockerは稼働済みホストのOSを利用するため、アプリケーション起動時にOS起動のプロセスが不要となる。アプリケーションを停止する場合、仮想マシンやゲストOSの起動／停止は不要。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/6bb5a5c1-c295-3636-fd87-e4391fd3de39.png">

####高い揮発性
　・必要なときだけ作成し、不要になったら削除するというリソースの運用方法を提供しやすい。Dockerコンテナは作成／削除を瞬時にできる。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/f373f8d2-b8f8-e6f6-4112-abd7232846ca.png">

#ユースケース
・アプリケーション開発環境
・Webサーバ、DBサーバなどの構築
・プログラム言語の実行環境

#アーキテクト
・Dockerはクライアント・サーバ型のアーキテクチャ。
・Dockerクライアントとデーモンは、お互いにソケットかRESTful APIを通して通信する。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/30f1905b-4e8f-8e9e-296d-c93b24530b4f.png">

#ハイパーバイザーとコンテナの違い
　・アプリケーションの実行環境を提供するという意味で同じ目的で利用される
　・ハイパーバイザーの仮想化ソフトウェアは、ハードウェアをエミュレーションしているのに対し、コンテナ環境は名前空間（Namespace）とCgroupと呼ばれる資源管理の仕組みを用いることで、単一のOS内で複数のコンテナを起動させ軽量化を実現している。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/67f8d397-4265-0465-e990-8ebe6f425442.png">

#コンテナ環境を用いた開発
・Dockerでは可搬性の高いコンテナイメージとしてミドルウェア/ライブラリとアプリケーションをパッケージ化することで、各環境における差異を吸収して、一貫したアプリケーション環境を実現することが可能。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/9c10ea0e-e122-5cc5-d38e-6fec9d05ceec.png">

#コンテナのネットワーク
・各コンテナは独自のIPアドレスを持ち、コンテナのIPアドレスはLinuxのホスト内でのみ利用可能。
・コンテナが外部と通信するためにはLinuxのIPフォワードやiptablesが使われる。
・一方、Linuxホスト内でコンテナが独自のIPアドレスを持つためネットワークネームスペースを利用。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/6ffb9e42-4dc8-bfc1-857e-7fb0241b5ed5.png">

#Dockerの要素技術

####名前空間
・Namespace（名前空間）を利用しコンテナ毎にプロセスを隔離することで単一OS上に分離された空間を実現している。

####コントロールグループ
・１つのOS上で複数のコンテナ環境が稼働するにあたり、コンテナ毎に使用できるハードウェア資源を制限する必要がある。Cgroupを利用することで、コンテナに割り当てる計算資源（CPU/RAM/IO帯域）を管理する。

####ファイルシステム
・コンテナとして分離されるのはプロセスだけでなくファイルシステムの名前空間も分離する。コンテナ内のファイルシステムは他のコンテナのファイルシステムを見ることはできない。Dockerはコンテナのブロック構築にユニオン・ファイル・システムを利用する。

####ネットワーク
・コンテナ実行環境に対してネットワークを提供するにあたり、以下の機能を組み合わせて実現している。
　・NetWork Namespace(veth)：ホスト内に仮想的なネットワークデバイスを作成する
　・Linux Bridge：作成されたコンテナ間の接続に利用する
　・iptables：コンテナがホスト外のネットワークと通信する場合に利用する

#Dockerに向くシステム／向かないシステム
####向く
・システム改変、開発が頻繁
・比較的、可用性を厳密に求めない
・サポートないOSS
####向かない
・システムの改変をほとんど行わない
・可用性、信頼性、機密性が求められる
・システム停止が社会的影響を及ぼす

##Dockerの課題
・管理工数の軽減
・キャパシティプランニング
・オーケストレーション
・ミッションクリティカル領域での利用
・ライブマイグレーションのサポート


####参考
https://docs.docker.jp/engine/introduction/understanding-docker.html