Docker入門 ~Tensorflowも超簡単に！！~

この記事は、Dockerを使って一瞬で開発環境ができる快感を広めるために書きました。一度覚えてしまえば簡単なので、最初の敷居だけとにかく跨いでみましょう。新人さんにDockerを使ってもらう目的にも良いと思います。
特に「Dockerって便利そうだけどなんかオプションとか複雑でこわい〜」って人向けです。とりあえず実践してみましょう！

※Tensorflowで導入していますが、ネット上では先人たちが色々なフレームワークをdocker上に構築しており、それを利用するのは非常に簡単です。一度慣れれば色々な環境を同じPC上で共存させることもできます。

# Docker導入のメリット
**環境づくりが簡単になる**

たった一行でpythonさえ入っていない環境からでも、Jupyter付きtensorflowが動かせるようになる！


```bash
$ sudo docker run --rm -it -p 8888:8888 tensorflow/tensorflow:latest-py3
```

# Dockerのインストール
- **Windows**  
[Docker Community Edition for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)をインストール。
- **Mac**  
[Docker Community Edition for Mac](https://store.docker.com/editions/community/docker-ce-desktop-mac)をインストール。
- **Ubuntu**  
[Docker CE for Ubuntu](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#uninstall-old-versions)をインストール。公式サイトが最新で良いですが、面倒な場合は以下のシェルスクリプト通りにインストールしてください（Ubuntu 16.04で動作, 2017/09/28）。

```bash:init_docker.sh
sudo apt-get update
sudo apt-get install \
  apt-transport-https \
  ca-certificates \
  curl \
  software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce
sudo docker run --rm hello-world
```


# Tensorflowを動かす
## チュートリアルを一瞬で
早速、冒頭の一行を実際に使ってみましょう。

```bash
$ sudo docker run --rm -it -p 8888:8888 tensorflow/tensorflow:latest-py3
```
表示されたURLにアクセスすると、tensorflowのチュートリアルが見えて、実行もできる！（終了は`Ctrl-c`）

## 自分のプログラムを書く
チュートリアルばかりできても困るので、自分のプログラムを書いてみましょう。下の手順でdockerを実行した後はJupyterからまっさらな画面が出るので、右のnewから好きにプログラムを書いてOKです。dockerを終了させると新しく作った`test`ディレクトリに新しいファイルができているはず。

```bash

$ mkdir testdir
$ cd testdir
$ sudo docker run --rm -it -p 8888:8888 -v $(pwd):/workdir -w /workdir tensorflow/tensorflow:latest-py3
# -v $(pwd):/workdir: 現在のディレクトリ(testdir)とdocker内のworkdirを繋ぐ
# -w /workdir: docker内で初期コマンド(jupyter notebook)を動かすディレクトリを指定(/workdir)
```

# My開発環境 on Dockerを作る
まず大前提として、既存のものを見つけ出す方が得策です（i.e. [tensorflow](https://hub.docker.com/r/tensorflow/tensorflow/), [python3&opencv](https://hub.docker.com/r/jjanzic/docker-python3-opencv/)）。

ただし、用意されたdockerの構成でほぼ足りているけれども、ライブラリ等を追加して使いたいという場合があると思います。そう言った場合にはそのdocker構成を**継承**して新たなdockerを作りましょう。

ここで少しお勉強ですが、dockerによる開発環境構築は以下の順に要素が構築されることで行われます。
1. Dockerfile: 設計図
2. docker image: 材料
3. docker container: 実際に動く単位

docker imageは[docker hub](https://hub.docker.com/)というサービス上に公式や色々な人が置いていて、そこに置いてあるimageは`docker run`で名前を指定すれば勝手にダウンロードされてcontainerとなり動作します。この仕組みによって先ほどのtensorflowは動いていました。

以下はtensorflowのdocker構成を使って、追加でkerasが使いたい場合に用意するDockerfileです。ファイル名をDockerfileとして保存してください。

```Dockerfile:Dockerfile
FROM tensorflow/tensorflow:latest-py3
LABEL maintainer="yakigac"

RUN pip install -q keras
```

Dockerfileが置いてあるディレクトリ上で以下のように`docker build`するとdocker imageが出来上がります。後は先ほどまでと全く同じです。

```bash
# Dockerfile → docker image
$ sudo docker build -t tensor-keras .

# 確認する場合は以下のコマンド
$ sudo docker images

# docker image → docker container
$ sudo docker run --rm -it -p 8888:8888 -v $(pwd):/workdir -w /workdir tensor-keras
```

# 毎回長いコマンドだるいわ！
シェルスクリプトどうぞ。

```bash:run_docker.sh
#!/bin/bash
sudo docker run \
--rm -it \
-p 8888:8888 \
-v $(pwd):/workdir \
-w /workdir \
tensor-keras \
"$@"
```
実行は以下のように行います。

```bash
$ ./run_docker.sh
```

ちなみに次のようにすると、tensorflowもkerasも使える状態でpythonのインタラクティブシェルが起動します。テストなどに使ってください。

```bash
$ ./run_docker.sh python
```
以上！

# 追記
[英語記事](https://qiita.com/yakigac/items/f05de062fb96650e8d1e)書きました。外国人にとりあえずDocker入門してほしい時、紹介してあげてください。