# [安裝紀錄] 安裝 Docker-CE 與使用 Nvidia GPU
###### tags: `Docker` `Docker-CE` `nvidia-docker` `CUDA` `Ubuntu`
此篇記錄了在 Ubuntu 20.04 安裝Docker-CE與在Container中使用到底層GPU的過程。
Docker-CE 從 19 版開始支援使用 Host 的 GPU 資源,19 版之前的版本需要使用 `nvidia-docker` 來啟動 container 才可以使用GPU資源。
## 操作環境
* Ubuntu 20.04
## 已安裝程式
要透過 Docker 使用到底層GPU的資源時,要先確認顯示卡驅動、CUDA、CuDNN是否已經安裝成功,這台電腦已經安裝了下列的版本。
* Nvidia 驅動程式 418.152.00
* CUDA 10.0
* CuDNN 7.6.5
## 安裝
### 前置設定
* 更新apt-get
```shell
$ sudo apt-get update
```
* 安裝相關packages
```shell
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
```
* 新增 Docker 官方 GPG key
```shell
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
* 透過以下指令去新增 stable 版本 repository
```shell
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
```
### 安裝 Docker Engine - Docker CE
* 更新apt
```shell
$ sudo apt-get update
```
* 安裝最新版本的 docker engine, docker command 以及 docker container
```shell
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```
* 也可以透過下面指令安裝特定版本docker packages
```shell
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=
<VERSION_STRING> containe
```
### 確認安裝狀況
利用以下指令測試安裝是否完成。
* 檢查版本
```shell
$ sudo docker -v
```
* 啟動一個container來測試是否偵測的到GPU
```shell
$ sudo docker run --gpus 1 -i -t nvidia/cuda:10.0-base nvidia-smi
```
如果有正常抓到GPU會顯示顯卡資訊
```shell
$ sudo docker run --gpus 1 -i -t nvidia/cuda:10.0-base nvidia-smi
Wed Dec 9 07:01:31 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.152.00 Driver Version: 418.152.00 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K80 Off | 00000000:0D:00.0 Off | 0 |
| N/A 77C P0 59W / 149W | 668MiB / 11441MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
```
接著啟動 CUDA 的 Ubuntu Docker 進行環境部署或開發。
```shell
$ sudo docker run --gpus 1 -i -t nvidia/cuda:10.0-base-ubuntu18.04 bash
```
如果需要其他版本的 CUDA 或 Ubuntu 可以到 [Cuda Opensource Image](https://developer.download.nvidia.com/compute/cuda/opensource/image/) 去找所需的板本。
* 使用指定的GPU數量來啟動 Container
```shell
# 使用所有GPU
$ docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
# 使用2個GPU
$ docker run --gpus 2 nvidia/cuda:9.0-base nvidia-smi
# 指定GPU執行
$ docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi
$ docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi
```
## 遭遇問題
如果進入 Docker 環境後使用 OpenCV 顯示以下錯誤
```
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
```
則可以透過下列指令安裝遺失的套件來解決。
```shell
$ sudo apt update
$ sudo apt install libgl1-mesa-glx
```
## 參考
* Docker與GPU支援
1. [docker使用GPU总结](https://blog.csdn.net/weixin_43975924/article/details/104046790)
* Docker CE安裝
1. [Day-3 安裝 Docker](https://ithelp.ithome.com.tw/articles/10239123)
2. [Day27:Docker in VM on PVE](https://ithelp.ithome.com.tw/articles/10252098)
3. [Day28:在 Docker Container 裡使用 GPU Resource](https://ithelp.ithome.com.tw/articles/10195029)
* Docker指令
1. [【Day 3】 - Docker 基本指令操作](https://ithelp.ithome.com.tw/articles/10186431)
* 其他
1. [ImportError: libGL.so.1: cannot open shared object file: No such file or directory](https://github.com/conda-forge/pygridgen-feedstock/issues/10)