Dockerを知らない初心者がインストールから環境構築までやってみた!! (更新:2020/4/12)

##はじめに
Docker って雑誌とか技術書でよく聞くけど何かよくわからない....
仮想環境を構築するやつってくらいは知ってるけど...
Vagrantと何が違うの???
Vagrant+Dockerって何なんで仮想環境の上に仮想環境なんだよ!!
そんな私が1日かけてインストールからDockerfileを書けるようになったので
私みたいな初心者がDockerを使えるように記事にしました!!!
(また, 有識者の方々はこの記事に間違っていることがあればご指摘お願いしますm(._.)m

##環境
* macOS Catalina

##目次
* Dockerとは???
* インストール
* Dockerの用語
* Dockerを用いて環境構築!!
* 簡単な操作
* imageの作成
* Dockerfileでimage作成
* よく使うコマンドまとめ
* 参考文献


##Dockerとは???
[Docker 日本語リファレンス](http://docs.docker.jp/engine/index.html)には下記のような理念が述べられています.

>Develop, Ship and Run Any Application, Anywhere ～ あらゆるアプリケーションを、どこでも開発、移動、実行できるように

うーん....よくわからないですね!!
次にDockerの説明を見てみましょう!
>Docker とは、開発者やシステム管理者が、アプリケーションの開発、移動、実行するためのプラットフォームです。Docker は部品（コンポーネント）から迅速にアプリケーションを組み立てるため、コードの移動による摩擦を無くします。Docker はコードのテストやプロダクション（本番環境）に対する迅速な展開をもたらします。

ここでやっとどんなものか少しだけわかりましたね!

補足を加えつつ, 知って欲しいことをまとめるとこんな感じです.

* Docker はコンテナ型の仮想環境を作るシステム
  * virtualboxと違い, OSの一部のみを仮想化
* アプリの実行環境をラップ
  * ホストがライブラリとかで汚れない
* 実行環境をテキストファイルで共有できる
  * 複数人で一瞬に実行環境を揃えることができる
* (重要)既に先人たちが便利なコンテナを作成!!

雰囲気がわかったので用語の勉強をしていきましょう

##用語のイメージ

* Image
  * オブジェクト指向で言うと クラス
  * ubuntu, centos, ...
* Container
  * オブジェクト指向で言うと インスタンス
  * Imageから生成する箱!
* Dockerfile
  * 環境
  * ライブラリやミドルウェアのインストールを記述

Dockerfileはほぼ自分で書くことはなく先人たちが
公開してくれている!!
Docker が何か雰囲気はわかったので次はとりあえずインストールしてみましょう.

##インストール
Macの場合 Dockerのインストールは簡単です.

[DockerHub](https://hub.docker.com/editions/community/docker-ce-desktop-mac)へアクセスして, インストールするだけです．

その際, アカウント登録を求められるので登録お願いします.
docker のインストールだけする場合, 無くてもできる方法があるのですが
あった方が便利なのでここで登録することをお勧めします.
<img width="804" alt=" 2020-04-12 16.52.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353646/8262c27a-e9bd-a69d-ead5-1e4d3456a67f.png">

下記のコマンドでインストールされているか確認!

```bash
$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
```
こんな感じで何か表示されていたら成功です!
次はDockerを用いて環境構築しましょう.

## 環境構築
ここではDockerを用いてubuntuの環境を作成しようと思います
(コマンドは最後にまとめています)
#### 環境の検索

```
// ubuntuの環境の検索
$ sudo docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   10744               [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   414                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   245                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   214                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   107                 [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   98                                      [OK]
neurodebian                                               NeuroDebian provides neuroscience research s…   68                  [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                                      [OK]
ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   44                  [OK]
......
```

コマンド以外にも公式サイトからでも検索できます
いろいろあるみたいですが, 今回は通常の一番上のものを利用します

#### 環境(image)をpull
下記のコマンドでimageをpullできます
一応pullできたか確認もします.

```
//imageをpull
$ sudo docker pull ubuntu
//持っているimageを確認
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4e5021d210f6        3 weeks ago         64.2MB
```
これだけでubuntuの環境の作成が終了です
ものすごく楽
次は実際にこの環境を使っていきましょう

##簡単な操作方法
作成した環境は下記のコマンドで利用できます

```
// sudo docker run [image] [コマンド]
$ sudo docker run ubuntu echo "Hello World"
```
実行するコマンドはなんでも良いのですが
今回は echo コマンドで "Hello World"を表示させています

次は実際に作成した環境の中に入っていきましょう

```
// sudo docker run -i -t [image] /bin/bash
$ sudo docker run -i -t ubuntu /bin/bash
//これで抜けることができます
$ exit
```
ここでは -itのオプションは説明しません, 気になった方は
[Docker 日本語リファレンス](http://docs.docker.jp/engine/index.html) へ行って勉強しましょう!!

このコマンドによりubuntu上のbashを起動しました
適当に ls とか cd とかして仮想環境できた!!
って気分を味わってください

次に自分で新しいimageを作成してみましょう

##imageの作成

下記のコマンドを打って見てください

```
//現在起動中のコンテナの確認
$ sudo docker ps
//起動していたコンテナも確認 (かこの物も見れる)
$ sudo docker ps -a
//上位5個表示
$ sudo docker ps -a -n=5
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
c4edd289ec92        ubuntu              "/bin/bash"         7 minutes ago       Exited (0) 7 minutes ago                        romantic_keller
bcc354262376        ubuntu              "echo aiueo"        8 minutes ago       Exited (0) 8 minutes ago                        loving_meitner
874c9664e320        ubuntu              "ls"                8 minutes ago       Exited (0) 8 minutes ago                        nice_spence
98e0bef0af52        ubuntu              "ls"                15 minutes ago      Exited (0) 15 minutes ago                       cool_chaum
6654170fc31f        ubuntu              "cd"                15 minutes ago      Created                                         quirky_kilby
```

現在立ち上げているコンテナはないため, 1個目のコマンドでは何も表示されないと思います.
2個目のコマンドは過去のものまで表示してくれるためいくつか表示されるとおもいます
見たらわかるやん!!って方もいるかとおもいますが, 表示されているものを説明すると
左からID, IMAGE, 行ったコマンド, どれくらい前に利用したかです

それでは実際にimageを作成してみましょう
下記のコマンドでimageを作成できます

この記事では上から二つ目の echo "aiueo" を実行するimageを作成します.
IDは全て打たなくてもいいです. (一意に決まれば)
今回の場合 bcc354262376の先頭の3文字bccだけを打っています

```
//sudo docker commit [ID] [new_image]
$ sudo docker commit bcc naoki/aiueo
//imageができてるか確認
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
naoki/aiueo         latest              57c64991d8df        2 minutes ago       64.2MB
$sudo docker run naoki/aiueo
aiueo
```

しっかり実行できましたか??


##Dockerfile でimage作成

docker commitは, イメージを簡単に拡張できます.
しかし,チーム開発の際共有とかが大変なので, dockerfileを用いてimageの作成をします.

では, 実際にDockerfileを使ってimageを作成しましょう

```
$ mkdir Docker 
$ cd Dcoker
$ touch Dockerfile
//適当なエディタでDockerfileを開いてください
```
下記のものをコピーしてください

```:Dockerfile
#どのimageを元にしたか
FROM ubuntu
#作成者の情報
MAINTAINER Naoki Osako <email@exsample.com>
#build時に実行
RUN echo "now building..."
#run時に実行
# ["echo", "now running..."]=echo "now runnning" 慣習的にこの書き方をするらしい
CMD ["echo", "now running..."] 
```

これを実行することで, ubuntuのイメージを更新することができます
まだ, よくわからないと思うのでとりあえず実行してみましょう

```
//buildできる (.はカレントディレクトリ 忘れないように)
sudo docker build -t ubuntu .
//runできる
sudo docker run ubuntu
now running...
```
ubuntuのimageが更新されているのがわかりましたか??
runをするだけでDockerfileに書かれているCMDを実行することができます

わかりにくい方はCMDの中身を ["echo", "hogehoge"]などに変えてもう一度build, runをやってみてください
imageが更新され出力される内容が変わっているとおもいます.

##よく使うコマンドまとめ
今回紹介していないコマンドいくつかあります

```
//imageを探す
$ sudo docker search [探したいもの]
//pull
$ sudo docker pull [image]
//image一覧
$ sudo docker images
//設定見る
$ sudo docker inspect [image]
//消す
$ sudo docker rmi [image]
//実行
$ sudo docker run [image] [CMD]
//実行中のコンテナ一覧
$ sudo docker ps
//終了したものを表示
$ sudo docker ps -a
//上位5のコンテナ表示
$ sudo docker ps -a -n=5
//コンテナ消す
$ sudo docker rm [image]
//実行中のコンテナを止める
$ sudo docker kill [image]
//再び実行させる
$ sudo docker start [image]
//bash起動
$ sudo docker run -i -t [image] /bin/bash
//commitでimage作成
$ sudo docker commit [ID] [new_image] (naoki/hello)
$ sudo docker run -i -t [new_image] /bin/bash

//Dockerfileを用いてimage更新
$ sudo docker build -t [image] .
//run
$ sudo docker run [image]
```

##最後に
ここまで記事をみてくださりありがとうございました.
ここに書いてあることは表現に誤りがあるかもしれません.
より詳しく勉強したい方は, 英語, 日本語の公式リファレンスをご覧ください.
どこよりも正確な情報が得られるとおもいます.
この記事でなんとなく雰囲気がわかった方は是非ご覧ください/

##参考文献
[Docker 日本語リファレンス](http://docs.docker.jp/engine/index.html)