本当に簡単にDockerを理解する


ザックリとDockerの使用方法（コンテナの実行関係、イメージの作成）についてまとめました。これを読めば一通りはわかるよ！

## 1.Dockerって何？

### 1.1.コンテナ
仮想マシンと考えてください。Dockerではコンテナの上でイメージを実行します。

### 1.2.イメージ
OSで実行するHDDのイメージと考えてみましょう。

### 1.3.コンテナとイメージを使うことで何が良いの?
結局、なんでDockerを使うのか？ですが、次のようなメリットがあります。以下では、それをDockerを触って理解していくことにしてみます。

* いろいろなタイプのイメージを作成・管理できる。
* イメージを共有ができ、同じ処理を様々なコンテナ上で実行できる。

つまり、複数の同じ構成を持ったサーバーマシンをすぐに用意できることができることがDockerのメリットです。

## 2.Dockerのコマンドを覚えよう。

まずはDockerの実行してみましょう！

### 2.1.準備インストール

皆さんの手持ちの環境で一番簡単に動かせると思うので、Docker for Windowsを使っていくことにしてみます。

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/e5276abc-f965-7a04-72af-95d4e9d97554.png" width="400" height="240">

Dockerにサインインしておきます。

### 2.2.Run(コンテナの実行)

何はともあれ、コンテナを実行したいと思います。
nginxというWebサーバーのイメージを起動してみましょう。

以下のコマンドで実行することができます。

```
> docker run nginx
```

ただ、nginxはWebサーバーですので80番ポートを使用します。ですが、80番ポートはすでに使用されている場合が多いと思います。コンテナの80番ポートは、実機の5000番ポート上にポートを転送して実行してみましょう。(-p オプションを使用します。）

```
>docker run -p 5000:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
68ced04f60ab: Pull complete                                                                                             28252775b295: Pull complete                                                                                             a616aa3b0bf2: Pull complete                                                                                             Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
```

これで [http://localhost:5000/](http://localhost:5000/)にアクセスしてみましょう。
nginxが起動していることがわかりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/29db8759-63bd-91cc-0172-2f043049554b.png" width="400" height="150">

__Tips__

> 今回は起動後、nginxサーバーをフォアグランドで実行し続けるイメージですので、コンテナは実行したままになります。イメージによっては起動後して処理を終えると、コンテナが終了してしまう場合もあります。コンテナの実行を維持したい場合は、
> docker run -itd イメージ名 /bin/bash
> を試してみましょう。

### 2.3.実行中のコンテナの確認(PS)

次にどんなコンテナが実行されているか確認してみましょう。

```
> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
aa8e7e1c8d67        nginx               "nginx -g 'daemon of…"   39 minutes ago      Up 39 minutes       0.0.0.0:5000->80/tcp   funny_dijkstra
```

コンテナIDにaa8e7e1c8d67(以降 aa)でnginxのコンテナが動作しているのがわかります。

### 2.4.実行中のコンテナで、コマンドの実行

実行中のコンテナでコマンドを実行してみます。
そのためにはexecを使います。また、実行先のコンテナを指定する必要があります。

```
>docker exec -it (コンテナ) コマンド
```

コンテナ名は途中で省略してもよいです。

```
>docker exec -it aa ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
```

また、以下のようにすれば、exitまでの期間、ターミナルを操作できますね。

```
>docker exec -it aa /bin/bash
```

コンテナのシェルの中でnginxの設定ファイル(__/etc/nginx/conf.d/default.conf__)の中を見てみましょう。dockerは最小限しかインストールしないものなので、viが入っていません。catを使う必要がありますね。

```
root@aa8e7e1c8d67:cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
...
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
...
}
```

なるほど、__/usr/share/nginx/html__がコンテンツ置き場のようですね。

最後はexitしてシェルを抜けます。

```
>....（いろいろなコマンド操作)
>exit
```

これで大体の操作の感じをつかめたのではないでしょうか。



## 3.コンテナイメージを作ろう

それでは自分用のコンテナイメージを作っていきましょう。
Dockerの利点は、様々なバリエーションのイメージを簡単に管理できることにあります。
DockerのイメージはDockerfileで作成しますので、まずはDockerfileを編集します。


### 3.1.Dockerfileの作り方

今回は次の操作をしてみましょう。Webサーバーに提供されるコンテンツです。
このイメージは、nginxが動作しているよ！と言いたいイメージとします。



以下のhello.htmlを表示でいるようにしたいと思います。

```hello.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
```

```Dockerfile
# nginxイメージを起点にする
FROM nginx
# vimのインストール
RUN apt-get update
RUN apt-get -y install vim
# hello.htmlファイルをコンテナに追加
ADD hello.html /usr/share/nginx/html
# コンテナ実行時にnginxを実行
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
```

よく使用するコマンドをまとめておきます。

|コマンド|意味|
|:--|:--|
|FROM|派生元のイメージを指定する|
|RUN|イメージをビルドする際の処理|
|ADD|イメージに指定のファイルを追加する。アーカイブファイルの場合は展開する|
|COPY|イメージに指定のファイルを追加する。|
|CMD|イメージを実行する際に実行するコマンド|
|ENTORYPOINT|イメージ実行時に実行するコマンド、docker run時に上書き不可|


Dockerfileができたら、ビルドをします。
空のディレクトリを作り、Dockerfileとhello.htmlにしてください。

```
>mkdir my_nginx_dockerfiles               # 空ディレクトリを作り
>copy Dockerfile my_nginx_dockerfiles　　 # Dockerfileと
>copy hello.html my_nginx_dockerfiles     # 今回イメージに追加するファイルだけを入れます。
>cd my_nginx_dockerfiles                  # ディレクトリに移動します

>docker build -t my_nginx:0.1 .　　　　　　# ビルドです　
Sending build context to Docker daemon  3.072kB
...
Successfully built 1e53c2c84fba
Successfully tagged my_nginx:0.1
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.  
```

最後にパーミッション関係で指摘がありますが、成功ですね。image listコマンドでイメージができたか確認します。

```
>docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_nginx            0.1                 1e53c2c84fba        7 minutes ago       178MB
nginx               latest              6678c7c2e56c        10 days ago         127MB
```

さぁ、さっそく実行してみましょう。

```
>docker run -p 5000:80 my_nginx:0.1
```
追加したファイル([http://localhost:5000/hello.html](http://localhost:5000/hello.html))にアクセスしてみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/c8cd958c-c8fd-225c-b2bf-e058ff3b01a2.png" width="400" height="120">

カスタムイメージの完成です！

## 4.コンテナやイメージを管理しよう。


### 4.1. Push / Pull

Dockerではイメージを共有することができます。非常に素晴らしい機能です。

Pull イメージを取得します。

```
> docker pull tensorflow/tensorflow 
```




### 4.1. 不要コンテナ、イメージの削除

コンテナやイメージを管理しましょう。
コンテナはdocker psコマンドで、イメージはdocker image listコマンドで一覧できます。

Exitされたコンテナは不要ですので、rmで削除することができます。


また、同様にカスタムイメージを作り終わったので、nginxも不要です。