Docker初心者がGCPのComputeEngineにJupyterの実行コンテナを作成するまで

# 概要
社内にkaggle部なるものができ、その一員になった。機械学習の実行・理論は一通り抑えたのだが、これを機にDockerとかLinuxとかクラウドとかその辺の知識も身につけてしまうぞー、おーっ！
ということで、Dockerコンテナに機械学習の実行環境を包むということをインフラ知識なしながらに頑張ってみた。

# 知識
・Dockerの教科書
・GCPの教科書
を流し読みしたのみ

#実行環境
実行環境は以下の通りです
・Ubuntu 16.04.6 LTS
・GCE VM

#手順
[dockerの公式](https://docs.docker.com/install/linux/docker-ce/ubuntu/#prerequisites)を参考に以下のコマンドを実行する。

## Docker CEのインストール前の準備


###旧Dockerの削除
```Command
$ sudo apt-get remove docker docker-engine docker.io containerd runc
```

###aptのUpdate
aptとはUbuntu Linuxへの、ソフトウェアのインストール・アンインストールを管理するためのコマンドです

```Command
$ sudo apt-get update
```

次にaptにHTTPS通信でリポジトリにアクセスすることを可能にします。

```
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
```

###dockerのGPGキーを取得する

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

###GPGキーの情報を確認する

```
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

###aptリポジトリの追加
ここでdockerが公開しているaptリポジトリを追加します

```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

上のコマンドはx86_64 / amd64の場合です。
armhf,arm64は異なるので公式で確認してください。


##Dockerのインストール
aptをupdateします

```
sudo apt-get update
```
###インストール!
```
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

###確認
インストールの確認を行いましょう。

```
$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        9013bf583a
 Built:             Fri Oct 18 15:53:51 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.4
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       9013bf583a
  Built:            Fri Oct 18 15:52:23 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```
うまくいっていればこのように表示されるはずです。


##jupyterイメージのPull

公式dockerHubに公開されているimageを検索します

```
$ sudo docker search --limit 10 jupyter
NAME                           DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
jupyter/datascience-notebook   Jupyter Notebook Data Science Stack from htt…   552                                     
jupyter/all-spark-notebook     Jupyter Notebook Python, Scala, R, Spark, Me…   256                                     
jupyterhub/jupyterhub          JupyterHub: multi-user Jupyter notebook serv…   224                                     [OK]
jupyter/scipy-notebook         Jupyter Notebook Scientific Python Stack fro…   191                                     
jupyter/tensorflow-notebook    Jupyter Notebook Scientific Python Stack w/ …   178                                     
jupyter/pyspark-notebook       Jupyter Notebook Python, Spark, Mesos Stack …   124                                     
jupyter/minimal-notebook       Minimal Jupyter Notebook Stack from https://…   87                                      
jupyter/base-notebook          Small base image for Jupyter Notebook stacks…   83                                      
jupyterhub/singleuser          single-user docker images for use with Jupyt…   24                                      [OK]
jupyter/nbviewer               Jupyter Notebook Viewer                         18                                      [OK]
```

「--limit 10　jupyter」とすることで、DockerHubの検索窓にJupyterと入力した時に、検索エンジンに引っかかる上位10個が表示されます。

重そうだけどとりあえず一番Starsが多い
「jupyter/datascience-notebook」を使うことにします。

```
$ docker image pull jupyter/datascience-notebook
```
で、imageをpullします。
そして暫く待つ。

インストールが完了したら

```
$sudo docker image ls
```
を入力します。すると、

```
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jupyter/datascience-notebook   latest              eaac14a737db        7 weeks ago         4.78GB
```

重い!　しかし、追加されていることがわかります。

##コンテナの起動

イメージをpullできたところでいよいよコンテナからjupyte notebookを起動しましょう

 ```
$ sudo docker run -p 8888:8888 --name jupyter jupyter/datascience-notebook
Executing the command: jupyter notebook
[I 08:23:39.510 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
[I 08:23:39.827 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.7/site-packages/jupyterlab
[I 08:23:39.827 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 08:23:39.830 NotebookApp] Serving notebooks from local directory: /home/jovyan
[I 08:23:39.830 NotebookApp] The Jupyter Notebook is running at:
[I 08:23:39.830 NotebookApp] http://b565b8761105:8888/?token=63a1e4253e97a29d8d34299b56eaf7b91b0b2f3f8fb1ce9e
[I 08:23:39.830 NotebookApp]  or http://127.0.0.1:8888/?token=63a1e4253e97a29d8d34299b56eaf7b91b0b2f3f8fb1ce9e
[I 08:23:39.831 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 08:23:39.835 NotebookApp] 
    
    To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-7-open.html
    Or copy and paste one of these URLs:
        http://b565b8761105:8888/?token=63a1e4253e97a29d8d34299b56eaf7b91b0b2f3f8fb1ce9e
     or http://127.0.0.1:8888/?token=63a1e4253e97a29d8d34299b56eaf7b91b0b2f3f8fb1ce9e
```

一見起動されたようですが…。

##確認

"http://[URL]:8888/?token = [token]"
にアクセスしてみます。

すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323398/bf05eac9-05cf-fba5-1a95-a9be309965ab.png)

アクセスできました！