Dockerの基礎知識


# はじめに
[Introduction Docker](https://training.docker.com/self-paced-training)のメモ。
なんとなくしかDockerを使えてなかったが、ちゃんと使おうと思ったのでチュートリアルからやり始めた。
動画がめちゃくちゃわかりやすいが、毎回動画をみるのも大変なのでメモに残す。

# Dockerとは
コンテナ仮想化技術をつかった、サービス開発/デプロイ基盤。
以下の製品/ツールなどを含んだサービスのことを指す。

- Docker Engine
- Docker Hub
- Docker Machine
- Docker Swarm
- Docker Compose
- Kitematic (Docker DaemonをGUIで操作する際に利用)

# 何を解決できるか
- 長いデプロイ時間
- コスト/リソースの無駄遣い
- スケールがむずかしい
- 移行がむずかしい
- ベンダーロックインへの対応


# コンテナとは
## 概要
分離されたアプリケーションごとの環境。
以下の要素を含む。

- ファイルシステム
- プロセス
- メモリ
- ポート

![DockerContainer.png](https://qiita-image-store.s3.amazonaws.com/0/14275/b8ac0066-bbc3-5054-b1c6-b564288fe6b3.png "DockerContainer.png")
出典 : https://training.docker.com/self-paced-training


## VirtualMachineとの違い
- VMは各アプリケーションごとにゲストOSが必要

## そのため
- コンテナの方が軽い
- コンテナのほうがCPU, RAM, ストレージが少なくて済む

## つまり
コンテナの方が一つのマシンに多く置ける。

# Docker Engine

コンテナをbuilt, ship, runするプログラム
LinuxKernel namespacesとcontrol groupsを利用している
隔離した環境を作ってくれる

# Docker Client / Daemon

## 概要
- Client/Server構造
- Clientは入力をデーモンに伝える
- デーモンはコンテナをつくる
- Clientとデーモンは同じホストでも違うホストでも動作する

![DockerClient.png](https://qiita-image-store.s3.amazonaws.com/0/14275/2661f967-329d-977c-98fe-51a7300548d3.png "DockerClient.png")
出典 : https://training.docker.com/self-paced-training

## 各バージョンの確認方法
```
docker@default:~$ docker version
Client: # DockerClientの情報
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      linux/amd64

Server: # Daemon情報
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      linux/amd64
```


# Docker Images
- ReadOnlyなコンテナ用のテンプレート
- Dockerユーザならだれでも作れる
- DockerHubやローカルに保存できる
- Imageは「レポジトリ名:タグ」で特定する
	- デフォルトのタグは、「latest」
- コンテナは1つ以上のイメージを元にして作られる

# Dockerの編成を管理するツール
- Docker Machine
	- DockerEngineをインストールするためのツール
- Docker Swarm
	- 複数のエンジンとコンテナを持つツール
- Docker Compose
	- 複数コンテナを管理するツール

詳しくは別記事にした。
[[Docker]複数ホスト管理ツールのまとめ](http://qiita.com/tomoyamachi/items/5bb3fff14dc02c51f097)

# Dockerの利点
- 担当者のやるべきことをはっきりさせる
	- 開発者はアプリケーションをつくること
	- システム管理者はデプロイ
- 開発速度を上げる
- どんな環境でも動作する
- スケールしやすい
- 1つのホストで複数アプリを作れる



# その他 (すでに導入済みだったので軽いメモ)
DockerHubの使い方 : 22分ころ
Dockerでの作業方法 : 33分ころ
## コンテナ内のプロセスの構造について
コンテナ内でのコマンドのPIDは1になる。

## Container ID
- コンテナはnameかIdで区別する
- LongIdと ShortId (docker psで確認)がある

## コンテナをデーモンとして使う-dオプション
- docker psでLongIdを確認
- docker logs <コンテナId> で標準出力を確認

## コンテナのポートを紐付ける-Pオプション

```
$ docker run -d -P tomcat:7
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
d286e3524ef2        tomcat:7            "catalina.sh run"   4 seconds ago       Up 4 seconds        0.0.0.0:32768->8080/tcp   distracted_panini
```

↑で`<マシンのIP>:8080`に行くと、tomcatが動いている。

## コンテナのポートとマシンのポートを指定して紐付ける-pオプション
```
$ docker run -d -p 8080:80 nginx:1.7
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
48a1ef8df772        nginx:1.7           "nginx -g 'daemon off"   6 seconds ago       Up 6 seconds        443/tcp, 0.0.0.0:8080->80/tcp   big_lalande
```
↑で`<マシンのIP>(:80)`に行くと、nginxが動いている。