Dockerはじめました~その１~

##〜目次〜
・まえがき
・今回の目的
・Dockerとは
・Dockerをとりまくあれこれ
・Dockerのインストール
・Dockerを使用してコンテナを作る
・DockerでHello World
・あとがき

---

##・まえがき
今回初めてDockerに触れてみて、色々と勉強したので、やってきたことを忘れないためと今後触れてみようと思っている方の参考に少しでもなればと思いスライドにまとめてみました。
なぜスライド？？って思うかもしれませんがそこはスルーでお願いします。気にしたら負けです。


※このスライドは2017年2月時点のものです。

---

##・今回の目的
今回の目的はまずDockerとは何か、またそれをとりまく様々なツールをざっくりと説明しながら実際に自身のPCにDockerをインストールして、実践としてブラウザで「Hello World」と表示させるところまでやります。

---

##・Dockerとは

Docker,Incという企業が開発している仮想環境を構築するためのOSSです。
**「コンテナ型仮想化」**という概念の元で仮想化を実現しています。 

とは言ったものの、全然しっくりこないので調べました。

---

####従来の仮想環境構築の種類
今まで主流だった仮想環境構築は大きく分けて２つ、**「ホスト型」**と**「ハイパーバイザー型」**というものがありました。

文章だけではまだ構造がよくわからないので色々参考にしながら自分なりにイメージ図を作成しました。

---
####仮想環境イメージ図(ホスト型)

　　![host.png](https://qiita-image-store.s3.amazonaws.com/0/156243/f59bd902-916b-5111-6842-e9dbf41859f1.png)
　　例：VMware Player、Oracle VM VirtualBox...etc

---

####仮想環境イメージ図(ハイパーバイザー型)
　　![hypervisor.png](https://qiita-image-store.s3.amazonaws.com/0/156243/04c17cb8-d58b-db66-836b-3d399914bfd7.png)

　　例：VMware ESXi、Windows Hyper-V...etc

---

####Docker環境イメージ図(コンテナ型)
　　![docker_engine.png](https://qiita-image-store.s3.amazonaws.com/0/156243/2434bec3-3320-ca1c-1169-7097c5d1f372.png)

---

Docker(コンテナ型)は他の二つと違い「コンテナ」という形でアプリケーションをそれぞれ管理しています。**一つのOS上で複数のアプリケーションを分離した環境で動かすことを実現**してます。

これにより、アプリケーションごとに仮想マシンやそれに伴ったOSを用意する必要がなく、ハードウェアリソースを有効に使うことができます。

---

####Dockerを使用する際のメリット

ここでは従来の仮想環境と比較した際のメリットを意識して挙げてみました。

・コンテナ型の仮想化はホストOSとゲストOSの間でkernelを共有しているためゲストOSの起動が早い、すなわちゲストOSが個々にKernelを持たないため、メモリ消費量やディスク消費量を節約できる
・コンテナのイメージ(雛形)からコンテナ(実体)を作るため、同一構成のOSを簡単に複数作れる
・またコンテナを捨てる・再生成するのが容易。
・複数人で開発する際に、環境の差が生じにくい。
・テストが通ったイメージは本番環境でもすぐに使える。
などがあります。

---

####Dockerを使用する際のデメリット

デメリットというよりもDockerの特性上向いてないシステムがあります。

・システムの改変をほとんど行わない
・商用のOSとアプリが稼働し、保守が必要
・可用性、信頼性、機密性が求められる
・システム停止が社会的影響を及ぼす

例を挙げると、銀行のオンラインシステム、鉄道や航空機のチケット予約・販売システム、通信インフラなど
これらの例以外には、向いているということになります。

---

##・Dockerをとりまくあれこれ
開発効率を上げてくれるツールが幾つか存在します。
次はそれらの大まかな説明をしていこうと思います。

---

####Docker Compose
Docker Compose とは、複数のコンテナから成るサービスを構築・実行する手順を自動化し、管理を容易にするツールです。
composeファイル(Docker ComposeのファイルはYAML形式で書いていきます)を用意してコマンドを1回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができるということです。

---

####Docker Machine
Dockerホストをローカルマシンやクラウド等に構築するツールです。ローカルマシン上で操作する感覚でDockerを操作することができます。
以前はDockerがLinux上でしか動作しなかったため、Windows、macユーザーがLinux環境を用意してそこにDockerの設定をしてました。
それを全て自動化して、すぐにDockerを動かせる環境を構築してくれるのがこのDocker Machineです。

ですが最近はDocker for Windows、Docker for macなるものが出ているのでDocker Machine必要あるのかなという印象ですが、おそらく必要になってくる機会があるかもなので使い方は覚えていこうと思います。。。

---

####Kitematic
Dockerを扱うためのGUIツールです。黒い画面で色々操作するのが難しいって人にはとても便利なツールだと思います。

---

####Docker Toolbox
Dockerの環境を簡単にセットアップできるツールです。
このDocker Toolboxをインストールすることで、今までに説明した便利ツール達(Docker Compose、Docker Machine、Kitematic、VirtualBox)をセットでインストールしてくれます。VirtualBoxに関してはLinuxを動作させるための仮想環境として利用します。

ですが最近はDocker for Windows、Docker for macなるものが出ているのでDocker Toolbox必要あるのか(以下略

---

####Docker for Windows/mac
Windows、macでDockerを使用可能にするアプリケーションです。
VirtualBoxを使用せずにWindows、mac上でDockerが使えます。

現在ではすぐにDockerを使ってみたい！という人には先ほど紹介したDocker Toolboxよりこちらが推奨されているのではないかと思います。

※2017年2月現在

---

####Docker Hub
Docker HubはDockerのイメージを自身のリポジトリにpushして共有したり、公式リポジトリから公式イメージをpullしてきて利用したりすることができます。
GithubやBitbucketのようなサービスに似ています。

公式ページ：https://hub.docker.com/

---

##・Dockerのインストール

Dockerをインストールする方法は色々あるのですがここでは大きく３つの方法(OS基準)に分けてご紹介します。
それぞれ自身のPCにあったインストール方法を選択してください。
(それ以外のスライドは飛ばしてください。)

１、Macにインストールする

２、Windowsにインストールする

３、Linuxにインストールする

---

####Macにインストールする

Macの方はDocker for macというアプリがありますのでそれをインストールすればOKです！

以下のサイトでDocker for macをダウンロードしてください。
https://docs.docker.com/docker-for-mac/

---

Docker for macのダウンロードが終わったらFinderにあるDockerのインストーラー(Docker.dmgってやつです）をダブルクリックします。

するとインストーラーが起動しますのであとは公式サイトを参考にしながらOK,yesyes,Got itしていけば大丈夫です。

これで無事、Dockerをインストールできました。
インストールが完了したら、次項目の「Dockerを使用してコンテナを作る」まで飛ばして結構です。

---

####Windowsにインストールする
Windowsの方にもmacと同じようにDocker for Windowsというものがあるのですが、以下の要件を満たさなければ利用することができないので、もしインストールしても起動できない場合はDocker Toolboxを利用した方が良いです。
要件を満たしている場合はdocker for macと同じ流れでインストールしてください。

・64bit版のWindows 10（バージョン1511、ビルド10586以降）、ProもしくはEnterprise／Educationエディション
・Hyper-Vが利用できること
・コンテナ実行用の仮想マシンには、メモリ2GB、ディスク60GB（容量可変タイプの仮想ディスクで、初期サイズは4GB程度）のリソースが必要

Docker Toolboxのインストール方法もDocker for mac/Windowsと同じくらい簡単なので調べてインストールしてみてください。

Docker for Windows：https://docs.docker.com/docker-for-windows/
Docker Toolbox：https://www.docker.com/products/docker-toolbox

インストールが完了したら、次項目の「Dockerを使用してコンテナを作る」まで飛ばして結構です。

---

####Linuxにインストールする

Linuxにインストールするとは言ってもおそらく仮想環境上にあるLinuxにインストールする状況がほとんどだと思うので、ここではあくまでLinuxにDockerをインストールする方法だけを書いていきます。
LinuxOSを動かす環境の構築は各自調べてください。

Linuxには色々種類があるのですがここではcentosを用いてインストールする手順を書いていきたいと思います。

Linux環境で以下のコマンドを入力してください。
```$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6```

```$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm```

```$ sudo yum -y install docker-io```

これでDockerをインストールすることができます。
次はDocker Composeをインストールするために以下のコマンドを入力します。

```$ curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose```
```$ chmod +x /usr/local/bin/docker-compose```

これでLinux(centos)にDockerをインストールすることができました。
インストールが完了したら、次項目の「Dockerを使用してコンテナを作る」まで飛ばして結構です。

---

##・Dockerを使用してコンテナを作る

インストールが終わったらいよいよDockerを動かしていきます。
この項目ではDockerを使用して**イメージからコンテナを生成**してみるところまでやります。
最初はイメージやらコンテナやらよくわからないと思いますがそれらも踏まえて少しづつ解説しながら進めていければと思います。

ちなみに自分はmacを使用しておりますのでここから先はmacでの解説のみとなってしまいますがあらかじめご了承ください。

---

####バージョンの確認
ではターミナルを開いてください。
すでにDockerをインストールしたと思いますがターミナル上でも確認します。
以下のコマンドを入力してDocker、Docker Compose のバージョンを確認してください。

Dockerのバージョン確認
```$ docker -v```

Docker Composeのバージョン確認
```$ docker-compose -v```


これでそれぞれのバージョンの確認がとれればOKです。

---

####イメージを取得後、コンテナを生成する

まずDockerを動かすためには**「イメージ」**が必須になります。
これは簡単にいうと実行環境(**コンテナ**)を生成するための設計図になります。

このイメージを元に**「コンテナ」**が生成されます。
このコンテナが先ほどのイメージを元に生成された実行環境ということになります。
それらひとつひとつのコンテナを連携させることによって開発環境を構築することができます。

---

以下の図はWordPressの環境を構築した際のイメージ図です。
　　　![wordpress_docker.png](https://qiita-image-store.s3.amazonaws.com/0/156243/ebeebe52-c7a6-5e9c-ce27-88abb3a1a221.png)

---

ではDockerでイメージからコンテナを生成していきます。

DockerのイメージにはDockerの公式から直接イメージをpullしてくる方法とDockerfileに色々と設定を記述しそれをbuildする方法があります。

公式では様々なイメージを提供してくれており先ほどの図のWordpressのイメージ等も実際に存在する公式イメージです。
なので公式からそれらをpullしてしまえばわざわざインストールすることなくWordpressやらApacheやらを準備できます。

---

最初はDockerの公式イメージからpullしてくる方法を試してみます。
試しにwebサーバーであるnginxのイメージをpullしてきてそれをコンテナ化し、実際にブラウザでnginxのWelcomeページを表示させてみましょう。
ターミナルで以下のコマンドを入力してください。

```$ docker pull nginx:latest```

ちなみに:latestの部分はタグというものでイメージのタグ情報にlatestというタグ付けをしたという感じです。

次に以下のコマンドを入力して確認してみます。

```$ docker images```
これで現在ローカルにあるイメージの情報を下図のような形式で閲覧することができます。
![docker_images.png](https://qiita-image-store.s3.amazonaws.com/0/156243/04cb1947-ef2c-4487-fd73-2a2cdba182ed.png)

---

次はこのイメージから実際に動かすためにコンテナを生成します。
では以下のコマンドを入力してコンテナを生成してみましょう。
(testの部分は基本的になんでもいいですが、[--name]オプションでコンテナに名前をつけているのでなるべくわかりやすいものにしましょう。)

```$ docker run -d -p 8080:80 --name test nginx```

これでコンテナが生成され同時にnginxも起動することができます。

---

ターミナル上で確認するために以下のコマンドを入力してください。

```$ docker ps ```

![docker_ps.png](https://qiita-image-store.s3.amazonaws.com/0/156243/ee48b3c3-5d74-ef40-8938-1637f56eee98.png)

するとさっきと似たようなリストが表示されますが、これは現在起動中のコンテナの情報を表示してくれます。
あくまで起動中のコンテナだけですので他の起動していないコンテナもすべて見たい場合はオプションで -a をつけて```$ docker ps -a```としましょう。

---

では次にブラウザで確認してみます。
先ほど生成したnginxコンテナが起動してますので、ブラウザで確認することができます。
ここで先ほどの -p 8080:80の部分の説明ですがこれはローカルのMacの8080ポートをNginxコンテナの80ポートにフォワーディングしています。
これによりlocalhost:8080で確認することができます。

 [localhost:8080](http://localhost:8080/)

![welcom_nginx.png](https://qiita-image-store.s3.amazonaws.com/0/156243/d31952ef-11e5-96b1-2ba4-a83d39185dd4.png)

ブラウザでこの画面が表示できれば成功です。

---

##・DockerでHello World

次はほんの少し難易度を上げてDockerfileからイメージを生成してみようと思います！
では始めます。が、その前に以前のスライドで作成したnginxのコンテナとイメージは紛らわしくなるかもしれないので削除しておきましょう。(もう消したor作成してない場合ここはスルーで大丈夫です。)

まずは```$ docker ps ```で現在起動中のコンテナを確認します。
nginxコンテナがまだ起動中の場合、削除する前に停止しなくてはいけません。

なので以下のコマンドを入力してnginxコンテナを停止しましょう。
コンテナIDというのは```$ docker ps``` で一番左に表示された CONTAINER ID の部分の英数字の羅列の事です。

```$ docker stop コンテナID ```

ちなみに起動は```$docker start コンテナID```です。

これで停止したので次は```$ docker ps -a``` で全てのコンテナを表示させてみます。(今停止したので```$docker ps```だと表示されません)

---

これでコンテナを削除する準備が整いましたので以下のコマンドでコンテナを削除します。

```$ docker rm コンテナID```

これで削除されたので再び```$ docker ps -a```で確認します。
するとnginxコンテナは削除されたので表示されなくなってます。

コンテナは削除することができましたがnginxのイメージがまだ存在していますので次はnginxイメージを削除してみます。

※ちなみに削除する順番も決まっており、削除したいイメージから生成されたコンテナが存在している限りイメージを削除することができません。なので先にコンテナを削除してからそのイメージを削除しましょう。

---

では今度は今あるイメージを```$ docker images```で一覧表示させます。
するとnginxのイメージが存在しているので削除します。

以下のコマンドを入力してください。
イメージIDはコンテナと同じ要領で一覧にあったIMAGE IDの事です。

```$ docker rmi イメージID```

これでイメージも削除できて全てまっさらな状態にすることができたので次はDockerfileを作成していきます！

---

まずDockerfileについて少しだけ補足します。

Dockerfileとは：
「Dockerfile」は、コンテナ(イメージも同様)の構成内容をまとめて記述できるシンプルなテキスト形式のファイルです。
1行につき1つの操作を記述します。そしてその作成したDockerfileに対しdocker buildをすることでDockerイメージが生成されます。
docker buildコマンドでは、「Dockerfile」ファイルの上から順番に処理が実行されます。

---

ではDockerfileを作成していくのでローカルの適当な場所に適当なディレクトリを作成します。

そしてその中にDockerfileという名前のファイルと、index.htmlファイルを作成します。
今回はこのindex.htmlの中身をブラウザに表示させる方法でやります。
なのでindex.html内に「Hello world！」と記述して保存しておきましょう。

構造としてはこんな感じです
[sampleディレクトリ]
├── Dockerfile
└── index.html(hello world)

---

####Dockerfileへの記述

次にDockerfileをテキストエディタで開いて以下のように記述していきます。

```Dockerfile:Dockerfile

#FROM：媒体にするイメージ名。ローカルになければ dockerhub から取ってくる
FROM centos

#MAINTAINER：メンテナンスする人、このファイルを作成した人の名前を記述。
MAINTAINER k-suzuki

#RUN：イメージ起動後に実行するコマンド。今回はイメージ起動時にEPELリポジトリとnginxをyumでインストールします。
RUN yum install -y epel-release
RUN yum install -y nginx

#ADD：ファイルを指定したパスに配置するコマンド。今回はローカルにある先ほど作成したindex.htmlを指定したパスに配置します。
ADD index.html /usr/share/nginx/html/

#ENTRYPOINT：コンテナが実行するファイルを設定します。
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]

```

---

####Dockerfileをbuildします

Dockerfileに記述できたのでこれをbuildしてイメージを生成してみましょう。

```$ docker build -t docker/nginx:test .```

するとDockerfileに記述した処理が上から順に走り、イメージを作成してくれます。
```$ docker images```で確認してみましょう。以下のようにnginxとcentosのイメージが作成できていれば成功です！
![hello_world_images.png](https://qiita-image-store.s3.amazonaws.com/0/156243/98af676d-efc0-f808-0602-371480b4b53e.png)

---

####buildしたイメージからコンテナを生成します。

イメージが生成できたのでここからコンテナを生成します。
ここからはnginxのwelcomeページを表示させた時と同じ要領でいきます。

```$ docker run -d -p 80:80 --name hello_world docker/nginx:test```

これでコンテナが生成・起動されたのでブラウザで確認しましょう！
また今回はポートを指定せず(-p 80:80の部分)にコンテナを生成したので以下のURLで確認できます。

http://localhost/

![hello_world.png](https://qiita-image-store.s3.amazonaws.com/0/156243/f4b415e3-c363-c7a9-7946-93239da72195.png)

ブラウザでindex.html内に書いた内容が表示されれば今回の目的は無事成功です。

---

##・あとがき

今回は第１回とういうことであくまで参考になればということで書いてみました、これを流し見て少しでもDockerに興味を持っていただければ嬉しいです。

あとはまだまだ説明不足なところもあったと思うので今後も理解を深めていって修正できるところはしていきたいと思います。

次回はDockerを利用してWordPressの環境を構築するところまでをスライドで紹介できたらと思います。
少し長くなってしましましたが最後まで読んでくださってありがとうございました！

---

#おわり