Dockerについて自分なりにまとめてみた。

# 🤔そもそもDockerとは
サーバ仮想化技術の一つ。
仮想化技術については、以前まとめたので、以下を参照。
https://qiita.com/tanakanata7190/items/325dddaed29e38b59988

サーバ仮想化技術は、大きく以下３つに分類されるが、このうち「コンテナ型」に相当する。
- ホスト型
- ハイパーバイザ型
- コンテナ型



# 😶Dockerの何がいいのか

## 環境構築が容易
- スクラップ＆ビルドが簡単
- Dockerイメージの共有が楽
- OSのバージョン差異を吸収してくれる

## 軽量
- Ubuntu16.04の場合、普通は約1.6GB消費するが、Dockerなら119MB



# 👪Docker関連の登場人物

|登場人物|説明|
|:--|:--|
|Docker Engine|全ての根幹であり、以下の作成・起動・停止・配布などを管理する|
|Dockerfile|設計書（ただの紙ぺら）。RUNとかEXPOSEとかでサーバ構成が明記されている。|
|Docker Image|成果物（電源入ってない状態）。`docker build`でDockerfileから生成される。|
|Docker Container|納品物（電源入ってる状態）。`docker run`でDockerImageから生成される。|



# 💭Docker関連の用語集

|用語|説明|
|:--|:--|
|Docker Hub|アプリケーション群を共有・管理するSaaS|
|Docker Registry|Repositoryを預かるホスティングサービス|
|Docker Repository|Docker Imageの集まり。Registoryに送信する事で共有可能に。|
|Tag|Docker Imageのバージョン情報|
|Volume|データを永続化できる場所。 ホストOS、docker volume createで作成した箇所、NFS指定など|
|オーケストレーション|複雑なコンピュータシステム/ミドルウェア/サービスの配備/設定/管理の自動化を指す用語|
|Docker Comporse|複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツール|


# 🖥Dockerの構築手順

## Step1. Docker Engineのインストール

インストール方法はOSによって異なる。

### Linuxの場合
- ディストリビューションによる
    - DebianやUbuntuだと、`apt-get install docker-engine`だったり、
    - CentOSだと、`yum install docker-ce`だったり、

### WindowsないしmacOSの場合
- Toolboxを利用するのがよさそう。
- 公式からダウンロードし、インストールすればよい。

### 何にせよ
- LinuxであれWindowsであれmacOSであれ、公式サイトにインストール手順が記載されているので、こちらを参照。
    - https://docs.docker.jp/engine/installation/
    - https://docs.docker.com/engine/install/


## Step2. Docker Imageを作成

作成方法は３つある。

### 作成方法１：自分で作成
- Dockerfileを書いて、コマンド実行(`docker build`)するだけ
- Dockerfileの書き方については、以下を参照
    - https://docs.docker.jp/engine/articles/dockerfile_best-practice.html
- Dockerfileを書く際には、レイヤーを意識する
    - ×：CentOS　→　Rails　→　Ruby（Railsの上にRubyが乗るのはおかしい）
    - ○：CentOS　→　Ruby　→　Rails
- `docker build`については、以下を参照
    - https://docs.docker.jp/engine/reference/commandline/build.html

### 作成方法２：Docker Hubから取得
- この世の中は便利なので、必要であろうDocker Imageは誰かが作って公開しれくれている
- なので、便利な世の中にあやかるstyle
- Docker Hubから取得するコマンドは`docker pull`であり、使用方法については以下を参照
    - https://docs.docker.jp/engine/reference/commandline/pull.html

### 作成方法３：Docker Repositoryから取得
- この世の中は便利なので、必要であろうDocker Imageは誰かが作って公開しれくれている
- なので、便利な世の中にあやかるstyle
- Docker Hubから取得するコマンドは`docker pull`であり、使用方法については以下を参照
    - https://docs.docker.jp/engine/reference/commandline/pull.html


## Step3. Docker Containerを起動
『Docker関連の登場人物』にも記載した通り、
「Docker Image」は電源の入っていないような状態であるため、電源を入れてあげる必要がある。
「Docker Image」を基に「Docker Container」を起動するには、`docker run`を使用する。使用方法については以下を参照。
https://docs.docker.jp/engine/reference/run.html

これでホスト上でプロセスが動き始める。ｳｨｰﾝｶﾞｼｬﾝ



# 💻実務的な開発･運用イメージ

（実際のところDockerを業務で使った事がないので、これで合っているという確証は全くない...）

## Step0. 事前準備
- GitHubにPrivateリポジトリを作成しておく
- DockerRepositoryをオンプレ構築しておく
- 本番VMにDockerEngineをインストールしておく

## Step1. Aさんによる初期開発
1-1. Webアプリを作成（何でもいい）
1-2. Dockerfileを作成（1-1をcloneするコマンドも記載）
1-3. 1-1＆1-2をGithubにpush
1-4. 1-2からDocker Imageを作成
1-5. 1-4をDocker Registoryにpush

## Step2. Bさんによる追加開発
2-1. Docker RepositoryからDocker Imageをpull
2-2. `docker run`でコンテナ起動（この時点でgit cloneされてるのでローカルで開発＆必要に応じてpush）

## Step3. Cさんによる本番適用
3-1. 本番VMにログイン
3-2. Docker Repositoryからpull
3-3. `docker run`でコンテナ作成＆起動

## 全体概要図
こんな感じかな･･･？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142821/7d8cd1b6-8b85-b95d-2b62-72fda0423684.png)


----

#### （補足）VMwareとの違い

##### インストールについて
- VMwareの場合
    - 「VMware ESXi」をインストール
    - （WindowsPCの場合は「VMware Workstation Player」
- Dockerの場合
    - 「Docker Engine」をインストール
    - （WindowsPCの場合は「Docker for Windows(Toolbox)」

##### 仮想マシンの立ち方について
- VMwareの場合
    - 「VMware ESXi」の上に「仮想マシン」が立つ
- Dockerの場合
    - 「Docker Engine」の上に「Docker Container」が立つ

##### 統合管理について
- VMwareの場合
    - 「vCenter Server」で管理
- Dockerの場合
    - 「オーケストレーションツール」で管理
        - Docker Comporse
        - Kubernetes
        - Amazon ECS    など

----

#### （参考文献）

- 公式サイト
    - https://docs.docker.jp/
- 【図解】Dockerの全体像を理解する（全3編）
    - https://qiita.com/etaroid/items/b1024c7d200a75b992fc
- Docker入門
    - https://knowledge.sakura.ad.jp/16862/
-  【連載】世界一わかりみが深いコンテナ & Docker入門
    -  https://tech-lab.sios.jp/archives/20179
-  Docker ライフサイクル 概要図 ＆ 環境複製手順
    -  https://qiita.com/TakahiRoyte/items/39dcf18da0ef2d1fe8b0
-  コンテナ技術の基礎知識
    -  https://thinkit.co.jp/story/2015/08/11/6285
-  Dockerのイメージとコンテナの違い
    -  https://blog.codecamp.jp/programming-docker-image-container
-  Docker、ボリューム(Volume)について真面目に調べた
    -  https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32