Docker 基礎

#前提
Dockerについて学んだことを書いていきます。

#本題

##Dockerとは
コンテナ型仮想化技術を実現するために実行される常駐アプリケーションと、それを操作するためのコマンドフロントインターフェイスから成るプロダクト。
アプリケーションのデプロイに特化しており、コンテナを中心とした開発・運用を可能とする。

軽量な仮想環境として検証に用いること。
例えば、webアプリケーションを開発する上でApacheやNginxのようなwebサーバをローカル環境に構築する作業を考えた場合、仮想環境上に本番環境と同じOSをセットアップし、ドキュメントを参考にパッケージマネージャを操作して必要なものを入れていく、こういった逐次的な環境構築の経験が多くあるかと思います。

dockerではより簡潔に環境を構築できる。

ローカル環境でdockerのセットアップが済んでいれば、数行の構成ファイルとコマンドとコマンド1つ叩くだけで検証環境が作成される。
アプリケーションやミドルウェアがすでにセットアップされている状態の仮想環境（dockerコンテナー）が素早く準備できる。

さらにdockerコンテナは仮想化ソフトウェアと比較して、より少ないオーバーヘッドで動作する。
このような操作そのものの簡便さや、コンテナなの軽量さからdockerはローカル環境で開発環境の再現に広く用いられるようになった。
dockerは開発環境の準備だけでなく、その後の本番環境への展開や、アプリケーションプラットフォームとして機能する点でこれらより優れている。

###dockerは優れたポータビリティを持つ。
ローカルのdocker環境で実行しているコンテナを、別のサーバにあるdocker環境で動作するコンテナをローカルに持ってくることが可能。
つまり、開発環境と本番環境をほぼ同時に再現できる。

dockerが単なる検証環境ではなく、優れたアプリケーションのデプロイ・実行環境として機能する。

・インストールに癖があるコマンドラインツールをdockerコンテナとして入手し、ホストをよござず即座に実行する。
・依存する様々なライブラリーやツールをdockerコンテナに同梱して配布することで実行環境を問わず高い動作再現性をもつスクリプトを実現する。
・HTTP負荷テストでworkerをDockerコンテナとして用意して、HTTPリクエスト数をあげる。


##コンテナ型仮想化技術
dockerはコンテナ型仮想化技術を利用しています。
コンテナ型仮想化技術では仮想化ソフトウェアなしにOSのリソースを乖離し、仮想OSにします。
この仮想OSをコンテナと呼びます。
コンテナを作り出すためのオーバーヘッドは、他の仮想化ソフトフェアと比較して少ない。
高速に起動・終了でき、必要なマシンリソースも少なくて済みます。

コンテナ型仮想化技術によってコンテナを軽量に作成、利用、破棄できるのはdockerの重要な特徴の1つ。

###アプリケーションにフォーカスしたdocker
dockerはコンテナがもたらす性能面での利点を活かしつつ、アプリケーションのデプロイにフォーカスを置いています。

LXCとは違い、特徴があります。
・ホストに左右されない実行環境
・DSL（Dockerfile）によるコンテナの構成やアプリケーション配置定義
・イメージのバージョン管理
・レイヤ構造をもつイメージフォーマット（差分ビルドが可能）
・dockerレジストリ（イメージの保管サーバのようなもの）
・プログラマブルな各種API


##dockerコンテナ
OS（インフラ）とアプリケーションを同梱した箱のようなもの。
dockerイメージのビルドはインフラとアプリケーションをセットでビルドできることに他ならない。

SaaS系のCIのサービスでもdockerが広く利用されている。
Travis CIやCircleCI、Codeshipといったサービスではdockerを使ったCIが可能のため、作成したdockerイメージを使ってE2Eテストをしたりといった応用が可能です。

#なぜdockerが必要なのか

##現在のシステム開発の2代特徴
継続的インテグレーション

ウォーターフォール
一回アプリを作るとそこで終わり

継続的デリバリー
頻繁にバージョンアップとリリースを繰り返す
短いサイクルを繰り返す

...そうすると
各々のバージョンアップによって整合性をとるのが大変！！
前のバージョンだったら動いたのにバージョンアップで動かない。。。など

DevOpsが必要
開発チームと運用チームがお互いに協調しあうこと
dockerが必要


dockerコンテナ
インフラ環境をまとめたもの
・アプリケーションの実行モジュール
・ミドルウェアやライブラリ群

dockerイメージ
イメージからコンテナ作成
みんなそれを使える

仮想マシンとコンテナの違い
仮想マシン
・どんなOSでも基本的にOK
・それぞれの仮想マシンには独自のOSが搭載
・ディスク容量を占有する
・OSのアップデートやパッチの適用を独自にやる必要がある
コンテナ
・ベースとなるOSはあくまでもLinux
・OS環境（カーネル）を共有

dockerのエディション
CE
無料版
EE
docker社のサポートが受けられる

dockerの機能
build
・dockerイメージ
アプリケーション実行に必要なファイル群が格納されたディレクトリ
・
ship
・dockerイメージは

RUN
・イメージを元にしてコンテナを作る
・一つのイメージから複数のコンテナを作ることができる
・dockerがインストールされていればどこでもコンテナ実行可能
・dockerコマンド

dockerコンポネート
docker engine
・dockerのコア機能
・docker
docker　registry
・dockerイメージの共有

docker　Compose
・複数コンテナの一元管理するためのツール
・複数コンテナに構成情報をコードで

dockermachine
docker実行環境

dockerSwarm
・クラスタ管理


#環境構築
１、VirtualBoxのインストール・ダウンロード
２、centOS０７


#Dockerの機能
１、Dockerイメージを作る機能（build）
２、Dockerイメージを共有する機能（ship）
３、Dockerコンテナを動かす機能（run）

##Dockerイメージを作る機能（build）
Dockerは、アプリケーションの実行に必要になるプログラム本体・ライブラリ・ミドルウェアや、OSやネットワークの設定などを１つにまとめてDockerイメージを作ります。Dockerイメージは、実行環境で動くコンテナのひな形になります。Dockerでは１つのイメージには、１つのアプリケーションのみを入れておき、複数のコンテナを組み合わせてサービスを構築するという方法が推奨されています。

Dockerイメージは、Dockerのコマンドを使って手動で作ることも、Dockerfileという設定ファイルを作ってそれをもとに自動でイメージを作ることもできます。

しかし、コードによるインフラの構成管理を考えた時、Dockerfileを使って管理することが望ましいと言えます。

また、Dockerイメージは積み重ねて使うことができます。例えば、OS用のイメージにWebアプリケーションサーバ用のイメージを重ねて、別の新しいイメージを作成できます。Dockerでは構成に変更があった部分を差分（イメージレイヤー）として管理します。また、アプリケーションの実行に必要なファイルはサイズが大きくなる場合があります。そこで、なるべく効率の良いイメージを作成することが必要です。

##Dockerイメージを共有する機能（ship）
DockerのイメージはDockerレジストリで共有できます。例えば、公式のDockerレジストリであるDocker HubではUbuntuやCentOSなどのLinuxディストリビューションの基本機能を提供するベースイメージが配布されています。これらのベースイメージにミドルウェアやライブラリ、デプロイするアプリケーションなどを入れたイメージを積み重ねて独自のDockerイメージを作っていきます。

また、公式のイメージ以外にも、個人が作成したイメージをDocker Hubで自由に公開して共有できます。すでにたくさんのDockerイメージが公開されているので、要件に合うものがあればそれをダウンロードして使うことができます。

Dockerコマンドを使うと、Docker Hubにログインして、レジストリ上のイメージの検索やアップロード・ダウンロードができます。

また、Docker Hubは、GitHubと連携できます。例えば、GitHub上でDockerfileを管理し、そこからDockerイメージを自動生成し、Docker Hubで公開することが可能です。

##Dockerコンテナを動かす機能（run）
Dockerは、コンテナ単位でサーバ機能を動かします。このコンテナのもとになるのが、Dockerイメージです。Dockerイメージさえあれば、Dockerがインストールされた環境であればどこでもコンテナを動かすことができます。また、Dockerイメージから複数のコンテナを起動することもできます。コンテナの起動・停止・破棄は、Dockerのコマンドを使います。

Dockerは、１つのLinuxカーネルを複数のコンテナで共有しています。コンテナ内で動作するプロセスを１つのグループとして管理し、グループごとにそれぞれファイルシステムやホスト名・ネットワークなどを割り当てています。グループが異なればプロセスやファイルにアクセスできません。この仕組みを使って、コンテナを独立した空間として管理しています。




docker image ls

ホスト側：コンテナ側
8000:80


ECS
コンテナ管理サービス

タスク定義

ECSクラスター


ECR
DockerHubのようなもの

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Docker自体はGo言語で書かれている
ホスト型仮想化
ハイパーバイザー
複数の仮想マシーン
リソースの面でオーバーヘッドが多く、起動や停止に時間がかかる
仮想マシンの環境の違いによりアプリケーションが動作しなくなることが稀に発生する
ハードウェアレベルで仮想化されており、ホストOSや仮想マシン間の分離レベルが高く、それぞれが影響を受けにくい


コンテナ型仮想化
Docker Engine
Dockerの操作はDocker Engine
コンテナはゲストOSを持たない
軽量に動作する
CentOS
ホストOSのカーネルを使用するため動作が早くリソースの使用率も少なくてすむ
特定のアプリケーションを動作させるため必要なものは、Dockerイメージにまとまっており
OSの機能を使用した仮想化は、従来の


DockerのEditionとバージョン
Docker CE

```
$ docker run hello-world
```
↑<code>docker run</code>は複数のコマンド下記を一度に行うコマンド
pull
create
start


Dockerイメージとは
・コンテナ実行に必要なファイルをまとめたファイルシステム
・AUFSなどの特殊なファイルシステムが使用されている
・イメージ上のデータは読み取り専用