---
# System prepended metadata

title: '[安裝紀錄] 安裝 Docker-CE 與使用 Nvidia GPU'
tags: [nvidia-docker, Docker, Ubuntu, CUDA, Docker-CE]

---

# [安裝紀錄] 安裝 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)
