Dockerについて基本的なことなぞってみたのよ。

#Docker
dockerについてちゃんと知らなければと思ったので[Dockerの基礎を体系的に勉強する記事まとめ](https://kitsune.blog/engineer/docker)にて学習したことメモ。

##Dockerの使い方

**1. NginxのDockerイメージをDocker Hubから取得**
**2. Dockerイメージからコンテナ作成し、起動**
**3. Nginxにブラウザからアクセス**
**4. Dockerを停止**

###とりあえずDockerを使ってみる「コンテナ起動」
docker runを実行したときにイメージがなければ自動でダウンロードしてくれる。
コンテナ作成

```
# docker 起動 -0d[バックグラウンド実行] -p[ポート指定] --name[コンテナ名指定] 使用するイメージ
$ docker run -d -p 8080:80 --name nginx-test nginx
```

起動確認

```
# 起動しているコンテナの確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
126f50f13c8f        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp               nginx-test
```

全てのコンテナを確認

```
$ docker ps -a
```

コンテナを停止

```
$ docker stop nginx-test
```


コンテナを起動

```
$ docker start nginx-test
```

###イメージ作成からコマンド起動まで
centOSイメージをダウンロードしてコンテナを起動させます。

docker imagesの確認

```
$ docker images
```

ベースイメージ検索

```
$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5743                [OK]                
```

Docker HubからDockerイメージをダウンロード
centosをダウンロードします。「:」の後ろでバージョン指定ができます。

```
$ docker pull centos:7
```

centosがダウンロードできたか確認します。

```
$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
centos               7                   5e35e350aded        7 weeks ago         203MB
```
centosイメージを用いて、コンテナを作成します。

```
$ docker run -it -d -p 8080:80 --name centos-test centos:7
```

コンテナの確認

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
c7450e70b170        centos:7            "/bin/bash"              5 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp               centos-test
```
無事作成できてます。
次はコンテナにログインしてみます。
ログインするコマンドは以下の二つです。
**exec**・・・コンテナの中で新しく「/bin/bash」プロセスを作成してログインします。
**attach**・・コンテナの標準入出力に接続しているだけ。ログアウトするとコンテナが停止します。


```
$ docker exec -it centos-test bash
```

ログインできたらnginxをインストールしてみます。

```
$ yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install -y nginx
$ nginx
```
http://localhost:8080
にアクセスしてnginxの画面が表示されたら成功です。
docker便利ですね。

ログアウト

```
$ exec
```

コンテナからイメージを作成
先ほど作成した「centos-test」のコンテナを作ってイメージを作成し起動します。

```
$ docker commit centos-test original-nginx
$ docker run -it -d -p 8080:80 --name original-nginx original-nginx

# ログイン
$ docker exec -it centos-test bash
$ nginx
```
http://localhost:8080
にアクセスしてnginxの画面が表示されたら成功です。

一旦今まで作ったコンテナやイメージは消しておきます。

コンテナ削除
※削除する際はコンテナを停止させてください。

```
$ docker rm [CONTAINER ID]or[CONTAINER NAME]
```

イメージ削除

```
$ docker rmi [REPOSITORY]or[IMAGE ID]
```

###Dockerfileを使ってイメージを作成する

コンテナを作成するには`docker run`コマンドを使用。ただ作成と起動を同時に行うので注意。
起動のみの時とは`docker start`
停止時は`docker stop centos`



コンテナに接続するには`docker exec`

コンテナにログインするには`docker exec -it [image-name] bash`

`exit`でログアウト

`docker attach [image-name]`ログインしてexitするとプロセスが停止する。

`docker commit [use-image-name] [new-image-name]`で新しくimageを作成できる。
もちろんコンテナ起動もできる。

##Dockerfile
Dockerfileとは簡単に言うと今まで流れをコードとして記述したファイルです

>
- 構築手順をコードとしてファイルに残せる
- 構築手順の修正が簡単
- 簡単に共有できる
- バージョン管理できる

手順はこんな感じです。

1. CentOS7のベースイメージを取得
2. CentOS7にNginxをインストール
3. Nginxを起動（フォアグラウンド）

Dockerfileを作成していきます。

```Dockerfile
# CentOS7のベースイメージを取得
FROM centos:7

# Nginxのインストール
RUN yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y nginx

# Nginxを起動（フォアグラウンドで動かす）
CMD ["nginx", "-g", "daemon off;"]
```
[Dockerfile各種説明](https://www.wakuwakubank.com/posts/270-docker-build-image/)

###Dockerfileからイメージ作成（ビルド）

`docker build`コマンドでビルドが行えます。

```
# docker build -t [IMAGE NAME] dockerfileのパス
$ docker build -t dockerfile_test ./

# イメージが作成されてるか確認
$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
dockerfile_test      latest              dd02f0714963        About a minute ago   331MB

# コンテナ起動
$ docker run -it -d -p 8080:80 --name build-nginx dockerfile_test
```
http://localhost:8080
にアクセスしてnginxの画面が表示されたら成功です。

もう一度作成したDockerfileで別のコンテナを作成してみます。

```
$ docker build -t dockerfile_test02 ./
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7
 ---> 5e35e350aded
Step 2/4 : RUN yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
 ---> Using cache
 ---> 866959355b7d
Step 3/4 : RUN yum install -y nginx
 ---> Using cache
 ---> 3b3ce6786dc2
Step 4/4 : CMD ["nginx", "-g", "daemon off;"]
 ---> Using cache
 ---> dd02f0714963
Successfully built dd02f0714963
Successfully tagged dockerfile_test02:latest
```

`Using cache`と出ています。
Dockerビルド時はレイヤがキャッシュされます。
このキャッシュのおかげで初回以降は実行時間や実行ログが短縮されます。


##まとめ
コンテナの作成順番としては
1. `docker pull`でdockder hubからイメージをダウンロード
2. `docker run -d -p 8080:80 --name [コンテナname] イメージname`でコンテナ作成

ですが、run時にイメージがなければ勝手にダウンロードしてくれるのでどちらでもいいのかなと思います。

Dockerfileの使い方
1. Dockerfileに記述
2. `docker build -t [IMAGE NAME] dockerfileのパス`でDockerfileをビルドしてイメージを作成
3. `docker run -d -p 8080:80 --name [コンテナname] イメージname`でコンテナ作成

次回はdocker-composeを使ってnode.jsの環境構築をしてみます。