Dockerについて色々調べた結果をまとめてみた


**自分用にまとめてた記事（ほぼコピペ）を共有する**
ちなみに中途半端な文章多いと思う（順次直す~~気力があれば~~）

# Docker

## Dockerとは

Dockerは、インフラ関係やDevOps界隈で注目されている技術の一つで、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームのこと。

## DockerとVagrantの違い

### `Vagrant + VirtualBox`

仮想マシンを動かす仮想化ソフトのラッパーツール

VirtualBoxの構成をVagrantfileというテキストに記述してVagrantに任せることで、ネットワークドライバの設定などを意識すること無く、ホスト環境に依存しない形で整備される

#### Vagrantの特徴

- Linux以外のOSの環境が構築できるため、コンテナ型と比べて自由度が高い
- OSのバージョンの違い、仮想環境ツールの違い、仮想環境ツールの設定の違いなどで構築に手間がかかる
- VagrantとVirtualBoxのバージョンの相性によってバグがある
- 仮想環境はホストOS型と呼ばれ、ゲストOSがハードウェアにアクセスするにはホストOSを経由しなければならないため、オーバーヘッドが大きい

### `Docker`

OS・ミドルウェア・ファイルシステム全体をイメージという単位で取り扱い、まるごとやりとり出来るツールのこと。

VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かすのに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため軽量で高速に起動、停止などが可能。

#### Dockerの特徴

- 仮想環境はコンテナ型と呼ばれるもので、ホストOSを直接アクセスするためオーバーヘッドが少ない
- 環境構築が容易でVirtual Boxも不要
- コンテナは移植性(ポータビリティ)が高く、Dockerさえインストールされていれば、全く同じ環境でアプリを動かせる
- ホストOSからはコンテナは１プロセスとして認識される

## 参考

> [dockerとvagrantの違い言える？新人エンジニアでも分かった気になれる俺流まとめ](http://acchi-muite-hoi.hatenablog.com/entry/2016/05/30/041618)

---

# 仮想化技術

## 前提として

仮想化の種類には大きくホストOS型とハイパーバイザ型とコンテナ型の3つある

### ホスト型
- ホストOS上に仮想化ソフトを動かす
- 仮想化環境上でOSを動かす
- 仮想OS上でアプリケーションを動かす

### ハイパーバイザ型
- マシン全体を仮想環境とする
- 仮想環境上でOSを動かす
- 仮想OS上でアプリケーションを動かす

### コンテナ型
- ホストOS上でコンテナを動かす
- ホストOSと仮想OSでカーネルを共有している
- 基本的にLinuxでのサポート
- 他のOSでも要件次第で利用可能

## 用語

### `PC/端末/ホストマシン`

CPU,メモリ、ストレージといった様に限られているリソースがある。
仮想化を実現してるサーバー等が過剰にスペックが高かいのはリソース供給量を上げるためという理由がある。

### `VirtualBox,VMWare`

仮想化を実現するにはまず骨組みや土台が必要。
windowsユーザーであればtask-managerのCPUタブから「仮想化：有効/無効」（Hyper-V）があり、LinuxだとKVMがそれにあたります。

### `Karnel`

カーネルとはOSの基本機能の役割を担うソフトウエア
カーネルだけではOSを利用するのが困難なため別途ソフトウェアと組み合わせて利用するのが一般的
カーネルとソフトウェアを組み合わせたものをディストリビューションという
一般的に言われているCentOSやUbuntuは、Linuxカーネル＋ソフトウェアのディストリビューションのことを指す

---

# DockerHub

## DockerHubとは

コンテンナを共有するためのサービス。
ユーザが作成したコンテナをアップロードして公開・共有ができるサービスのこと。
ここでアップロードされたコンテナは自由にダウンロードして自分のサーバーに簡単にデプロイできる。

> 参考
[Docker Hubの使い方とGitHubからのDockerイメージ自動ビルド (1/2)](https://www.atmarkit.co.jp/ait/articles/1408/26/news038.html)

---

## 参考

> [dockerとvagrantの違い言える？新人エンジニアでも分かった気になれる俺流まとめ](http://acchi-muite-hoi.hatenablog.com/entry/2016/05/30/041618)


# Dockerfile

## Dockerfileとは

Docker上で動作させるコンテナの構成情報を記述するためのファイルでのこと。
Dockerfileに記述された情報をもとにして、`docker build`コマンドにてDockerイメージを作成する事が出来る。

## 記述方法

1行につき1つの操作を｛命令｝と｛引数｝でスペース区切りで記述する。
「docker build」コマンドで「Dockerfile」ファイルの上から順番に処理が実行される

`例`

```Dokcerfile
# コメント
FROM iphp:7.1-fpm
```

### 命令と用途

| 命令 |用途  |
| --- | --- |
|FROM|元となるDockerイメージの指定|
|MAINTAINER|作成者の情報|
|RUN|コマンドの実行|
|ADD|ファイル／ディレクトリの追加|
|CMD|コンテナーの実行コマンド 1|
|ENTRYPOINT |コンテナーの実行コマンド 2|
|WORKDIR|作業ディレクトリの指定|
|ENV|環境変数の指定|
|USER|実行ユーザーの指定|
|EXPOSE|ポートのエクスポート|
|VOLUME|ボリュームのマウント|

## 参考

> [Dockerfileとdocker buildコマンドでDockerイメージの作成 (1/2)](https://www.atmarkit.co.jp/ait/articles/1407/08/news031.html)
> [Dockerfileを極めて、Dockerマスターになろう！](https://qiita.com/soushiy/items/0945bcbc7ecce4822985)

---

# Docker Compose

## Docker Composeとは

Dockerは、1コンテナ1プロセスという思想が基本。1つのコンテナにすべての機能を詰め込まず、複数のコンテナを起動して、協調してシステムを構成しようという概念。

例えば、リバースプロキシのnginx、バックエンドのアプリケーション、データベースをそれぞれ別のコンテナで起動して、システムを構築する。それをYAMLの設定ファイルひとつで簡単に実現するのがDocker Compose。

docker-compose.ymlという設定ファイルに、どのコンテナを立ち上げるかを記述し、docker-compose upというコマンド1つ実行するだけで、必要なサービスがすべて立ち上がる。

これを活用することで、ミドルウェアの構成まで含めた開発環境の統一が可能になる。
（つまりコードベースで必要なアプリケーションやDBのコンテナ設定が出来る）

## 使い方

Docker Composeで構築したアプリケーションは、`docker-compose build`コマンドでイメージを作成する。

### build

自作のDockerfileを元にコンテナを起動する場合は、buildディレクティブを使用し、相対パスでDockerfileの位置を指定する。

### image

配布されているイメージを元にコンテナを起動する場合は、imageディレクティブでイメージ名を指定する。

### volumes

コンテナにマウントするボリューム（≒ ディレクトリ）を指定する。主な用途として以下が上げられる

1. コンテナを停止してもデータを永続化したい
2. ホスト上にあるファイルをコンテナ内で使用したい
3. あるコンテナから出力されるファイルを他のコンテナから使用したい


---