【Docker修行①】基礎を把握して、これからの遥か遠い道のりのサーバー技術学習の体力作り

- 1年にも満たないエンジニア生活のため、雲の上の存在だと思っていて距離を取っていた「Docker」の習得を目指す記事第一弾。
- 「身分をわきまえる感情」が大きく欠落した私は、「自分にはまだ早いかな」という概念を持たず、すかさず飛びつき、気分に深く酔いしれる生活。
- 今回は、仮想環境化技術の「Docker」の概要から各サーバーの起動までをしっかり抑えて、長い道のりの基盤作りをすることにしよう。

## 今回の目的やゴール
- 概要や特徴を把握する。
- 導入手順を把握する。
- Hello World環境の作成と起動
- ubuntu環境とNginx環境とMySQL環境の作成と起動
- コンテナ内容確認や削除の基礎的なやり方
- Doker fileやDocker Composeの概要把握
    - 今回はDocker fileやDocker composeを利用した環境作成は行わない。

## 概要
- シンプルで軽量なコンテナ環境のことであり、Linux上で動作している。
    - コンテナとは、仮想OS環境のこと。
    - コンテナを使うことで、一台のコンピュータに、複数の環境を作成することができる。
    - コンテナ以外の仮想環境として、下記のような仮想マシンがある。
        - VMware
        - Virtual Box
        - Xen
        - KVM
    - コンテナと仮想マシンの違いは、下記。
        - 独立性重視の`仮想マシン`
        - 軽量性重視の`コンテナ`
- 各環境毎の構成は下記。
    - 左が物理マシン型環境
    - 真ん中が仮想マシン型環境
    - 右がコンテナ型環境

![test](https://user-images.githubusercontent.com/44114228/55439602-1bdcc800-55e0-11e9-9101-ac0d2a15c81f.png)

- 具体的な構成は下記。
    - **物理マシン** : １つのOSが動作して、その上で複数のプロセスが動作している。CPUやメモリなどのリソースを共有。
    - **仮想マシン** : ハードウェアを分割後、複数の仮想コンピュータを作成する。CPU・メモリなどは、各仮想マシン独自のものとして認識。
    - **コンテナ** : 論理的に分割後、仮想Linuxを作成する。CPU・メモリなどは、コンテナから見ると各コンテナ独自のものとして認識。
- コンテナと仮想マシンの違いは下記。

||コンテナ|仮想マシン|
|:---:|:---:|:---:|
|**起動速度**|高速|低速|
|**構築**|シンプル|複雑|
|**リソース消費**|少ない|多い|
|**OS**|Linux|自由|

## 特徴
### 各マシン間のコンテナ稼働
- アプリケーションや依存ファイルを1つのイメージにまとめることができるため、実行環境が同じであることが保証される。

### 最適な自動化
- イメージの構築をコードとして記述することができるため、自動的にデプロイやビルドが可能。

### バージョン管理
- バージョン管理機能を提供していて、履歴や差分の更新等が可能。

### 再利用
- イメージは、手動または設定ファイルからの自動作成で気軽に再利用できる
- ベース環境を1個用意できたら、それを元にした別のアプリケーション環境の複数構築が可能。

### 共有
- [Docker Hub](https://hub.docker.com/)というクラウド上のサービスで、様々なイメージを提供しているため、コンテナ環境の共有が容易。
- また、自分で作成したイメージをアップロードすることもできる。

## インストール
### Mac
#### [Docker for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
- [こちらのサイト](https://hub.docker.com/editions/community/docker-ce-desktop-mac)にいき、「Download」をクリックして、インストール。
- ※インストール時は、Docker Hubアカウントでのログインが求められるため、登録をする。

#### Windows
- [こちらのサイト]https://hub.docker.com/editions/community/docker-ce-desktop-windows)にいき、「Download」をクリックして、インストール。
- ※インストール時は、Docker Hubアカウントでのログインが求められるため、登録をする。

#### Linux
- ubuntuやcentOS等の各ディストリビューションごとに異なる。
- 各インストール方法は[こちらのサイト](https://docs.docker.com/install/linux/docker-ce/ubuntu/)を参考。

## チュートリアル
### バージョン確認
- ターミナル(コマンドプロンプト)を起動。
- 下記のコマンドをうち、Dockerのバージョンを確認。

```bash
$ docker version
Client:
 Version:      XXXX
 API version:  XXXX

# 簡易的なバージョン確認の場合はこちら
$ docker -v
Docker version XXXX,build XXXX
```

### Hello World環境作成
- ターミナル(コマンドプロンプト)を起動
- 下記のコマンドをうち、Hello World環境を作成。

```bash
$ docker run hello-world
-------------------
Hello from Docker.
```

- 実行後のメッセージで、「Hello from Docker」が表示されれば、完了。
- 「`docker run`」の動作の仕組みは下記。
    - 1. `docker pull` : 該当イメージが、ローカルにあるか確認して、なければリモート(Docker Hub)からダウンロード。
    - 2. `docker create` : 該当のコンテナ環境を作成
    - 3. `docker start` : 該当のコンテナ環境を実行

### ubuntu起動
- 下記のコマンドをうち、ubuntu環境を作成して、そのコンテナ環境にはいる。

```console
$ docker run -i -t ubuntu /bin/bash
----------------------
root@XXXXX :/#
```

- 下記のコマンドをうち、ubuntu起動を確認。

```console
root@XXX :/# cat /etc/lsb-release
--------------------
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=XX.XX
```

- テストフォルダとファイルの作成

```
root@XXX :/# mkdir test
root@XXX :/# ll
---------
test
---------
root@XXX :/# echo hello > test/hello.txt
root@XXX :/# cat test/hello.txt
---------
hello
```

- 「Ctrl + D」でコンテナ終了

- 下記のコマンドで、再度コンテナ起動。

```console
$ docker run -i -t ubuntu /bin/bash
root@XXX :/# ll
------------
```

- testフォルダがなくなっていればOK。

- 再度「Ctrl + D」でコンテナ終了。

### Nginxの起動
- 下記のコマンドをうち、Nginxイメージでの起動。

```console
$ docker run -p 8080:80 nginx
```

- ブラウザを起動して、`localhost:8080`にアクセス。

- ページ内に「Welcome to nginx」と表示されていれば、完了。

- 「Ctrl + C」でWebサーバーの終了をする。

![test](https://camo.qiitausercontent.com/1a703cf130a8faca5938558f23ea4af63d92309e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3333363439392f38373437346662622d386437392d363739312d326334352d6433656333393835656333632e706e67)

### MySQLの起動
- 下記のコマンドをうち、データベースサーバーを動かす。

```bash
# eオプションは、環境変数の指定。MUSQL_ROOT_PASSWORDを指定
# name オプションは、コンテナ名の指定。例では「db」と指定。
# dオプションは、コンテナのバックグラウンド動作指定。
$ docker run -d -e MYSQL_ROOT_PASSWORD=password --name db mysql
```

- 下記のコマンドをうち、動作確認。

```bash
$ docker ps
```

- コンテナIDや名前が設定されていれば、完了。

## コンテナ内容確認や削除等の基礎
### コンテナ状態確認
- 下記のコマンドをうち、コンテナの状態を確認する。

```bash
# 起動コンテナの確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS    
XXXXXXXXX

# 終了コンテナも含めた全コンテナの確認
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS    
XXXXXXXXX
```

### コンテナの終了
- 下記のコマンドをうち、コンテナを終了する。

```bash
# 該当のコンテナの終了
$ docker kill コンテナID
# 全てのコンテナの終了
docker kill $(docker ps -a)
```

### コンテナの削除
- 下記のコマンドをうち、コンテナを削除する。

```bash
# 該当のコンテナを削除する
$ docker rm コンテナID
# 該当の複数コンテナを削除する
$ docker rm コンテナID コンテナID
# 全ての終了コンテナを削除する
$ docker rm $(docker ps -a -q)
```

## Docker file
### 概要
- コンテナーの構成や手順を記述することができるテキスト形式のファイル
- このファイルをビルド(変換)して、自動的に環境を作成することができる。
- コンテナ内で環境構築の作業をする必要がなくなる。
- このファイルを作成しておけば、誰でも簡単に共有して、同じ環境を作成することができる。

## docker-compose
### 概要
- 複数のDockerコンテナを連携させて動作させるためのツール。
- 設定ファイルをコードで記述することで、ウェブサーバーやデータベースサーバなど複数のコンテナを動作、連携して、ウェブアプリケーション環境などを簡単に構築・実行できる。

## まとめ
- 今回はDockerの概要や基礎の学習ということで、「サーバー技術に触れた優越感」にこの上なく浸りながら、記事を書く。
- 「たくさん作っても大丈夫」という文言が、様々なサイトや文献に載っていたため、盲信して100個作成するという従順行為。
- それでも軽量に動作する環境に、驚愕の感情よりも先に、作成数倍増をたくらむ、お構いなし行為。
- 次回は、「Dockerfileを利用した環境作成」「docker-composeを利用した環境作成」を学習することにしよう。

## 参考サイト
- http://docs.docker.jp/index.html  
→こちらの日本語ドキュメントを参考にしました。大変お世話になりました。

- https://paiza.hatenablog.com/entry/docker_intro  
→こちらの記事を参考にしました。大変お世話になりました。

## 参考テキスト
- [Docker実戦活用ガイド](https://www.amazon.co.jp/exec/obidos/ASIN/4839959234/paiza07-22/)  
→こちらのテキストで学習しました。大変お世話になりました。