Ubuntu18.04にDoker19.03環境構築（+NVIDIA Container Toolkit）

### 参考文献
本ページは以下を参考にしています。

- [NVIDIA Docker って今どうなってるの？ (19.11版)](https://qiita.com/ksasaki/items/b20a785e1a0f610efa08)


### 概要
Dockerを使えば

- 環境を汚すことなくCUDA ToolkitやcuDNNのバージョンが変えられる
- 環境構築に要する時間が短くなる

と聞いたので上記ページを参考に自身の環境にDocker環境を構築しました。
自身の備忘録ですので、参考程度にご覧ください。

###手順1 Dockerのインストール
[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)に従って進めます。

1. 古いDockerの削除

    ```shell
    $ sudo apt-get remove docker docker-engine docker.io containerd runc
    ```

2. リポジトリの設定

    ```shell
$ sudo apt-get update
$ sudo apt-get install \
           apt-transport-https \
           ca-certificates \
           curl \
           gnupg-agent \
           software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
# x86_64 / amd64 の場合
$ sudo add-apt-repository \
           "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
           $(lsb_release -cs) \
           stable"
    ```

3. Docker Engineのインストール

    ```shell
$ sudo apt-get update
# 最新版をインストール（特定のバージョンをインストールする方法は公式ページを参照）
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 再起動
$ sudo reboot
    ```

4. 確認

    ```shell
$ sudo docker run hello-world
# --- 以下のような情報が出力される ---
# Unable to find image 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# 0e03bdcc26d7: Pull complete 
# Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
# Status: Downloaded newer image for hello-world:latest
# 
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# 
# To generate this message, Docker took the following steps:
#  1. The Docker client contacted the Docker daemon.
#  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
#     (amd64)
#  3. The Docker daemon created a new container from that image which runs the
#     executable that produces the output you are currently reading.
#  4. The Docker daemon streamed that output to the Docker client, which sent it
#     to your terminal.
# 
# To try something more ambitious, you can run an Ubuntu container with:
#  $ docker run -it ubuntu bash
#
# Share images, automate workflows, and more with a free Docker ID:
#  https://hub.docker.com/
# 
# For more examples and ideas, visit:
#  https://docs.docker.com/get-started/
    ```

###手順2 NVIDIA Container Toolkitのインストール
[NVIDIA/nvidia-dockerのQuickstart](https://github.com/NVIDIA/nvidia-docker/tree/master#quickstart)に従って進めます。

1. リポジトリ追加

    ```shell
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
```

2. インストール

    ```shell
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
# Dockerリスタート
$ sudo systemctl restart docker
```
3. 確認

    ```shell
# CUDA10.0，すべてのGPUを使用
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi
```

###おまけ 非toot権限でDockerコマンド使用
[Post-installation steps for Linux](https://docs.docker.com/engine/install/linux-postinstall/)に従って進めます。

1. `docker`グループの作成

    ```shell
$ sudo groupadd docker
```

2. ユーザーの追加

    ```shell
 $ sudo usermod -aG docker $USER
```

3. 設定の反映（ログアウト&ログイン or 以下コマンド実行）

    ```shell
$ newgrp docker
```

4. 確認

    ```shell
$ docker run hello-world
```

### 感想
インストールは手順がしっかり記載されていたため、特に問題なくできました。
ただ、Dockerの使い方が全然わかりません（笑）