# nvidia-docker安裝部署以及操作手冊
前言
docker和nvidia-docker的區別
由於我們深度學習需要用到GPU,使用docker時,需要映射設備等等,docker容器對宿主機的依賴就會很多也就失去了便捷,並不能讓我們很舒服的遷移環境,nvidia-docker則很好的封裝了這些,只需要容器內的cuda版本和宿主機相同就行(這個要求很低了,而且這個要求現在也基本可以通過docker hub上別人做好的帶有各種cuda版本的鏡像來滿足,所以幾乎無要求)
其實nvidia-docker只是run 和 exec命令和docker執行不同,其余的和docker執行的一模一樣
## 1.卸載 nvidia-docker 1.0 及其他GPU容器
```
$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
$ sudo apt-get purge -y nvidia-docker
```
## 2. 添加package repositories
```
$curl -s -L https://nvidia.github.io/libnvidia-container/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
$ sudo apt-get update
```
## 3. 安裝 nvidia-docker2
```
$ sudo apt-get install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd
```
## 4. 測試安裝,查看顯卡使用情況
```
$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
```
## 5.啟動nvidia-docker服務
```
$ systemctl start nvidia-docker
$ systemctl status nvidia-docker
```
## 6.指定gpu啟動
```
$ NV_GPU=1 nvidia-docker run -v /matt/docker:/mnt $container --rm -ti matt/docker bash
```
## 7.容器改名
```
$ sudo nvidia-docker tag A B (將A改名為B)
```
## 8.進入容器
```
$ docker exec -it 容器名 /bin/bash
```
## 9.將容器保存為一個鏡像
```
$ docker commit containerId demo:v1.0 (新的鏡像名稱為demo,版本為v0.2)
```
## 10.使用鏡像(進入鏡像)
```
$ docker run -it demo:v1.0 bash
```
## 11.docker中做端口映射
```
$ docker run -it -d -p 0.0.0.0:5000 demo:v1.0 bash
```
例:將容器的80端口映射到宿主機的8000端口上:
```
docker run -itd -p 8000:80 demo:v1.0 /bin/bash
```
## 12.將宿主機的文件拷貝到容器中
```
$ docker cp [-a] libcudart.so.9.0 clever_hawking:/usr/lib(clever_hawking是容器名,-a 是以打包的方式傳)
```
## 13.將容器中的文件拷貝到宿主機中
```
$ docker cp mycontainer:/opt/testnew/file.txt /opt/test/
```
## 14.docker容器查看ip地址
```
$ apt-get install net-tools -y 安裝net-tools
$ ifconfig 然后利用ifconfig
```
## 15.容器管理
```
docker ps : 列出正在運行的容器
docker ps -a: 列出正在運行的和已經停止的容器
docker rm 容器id:刪除指定容器
docker rm $(docker ps -a -q):刪除所有已經停止的容器
docker stop 容器id:停止運行指定容器
docker start 容器id:啟動指定容器
sudo docker exec -it 容器名稱 /bin/bash 進入到正在運行的容器中
```
## 16.鏡像管理
```
docker images :列出宿主機存在的所有鏡像
docker rmi 鏡像id:刪除指定鏡像
docker rmi -f 鏡像id:強制刪除指定鏡像
docker build -t 鏡像名:版本 路徑:根據路徑下的Dockerfile文件創建一個鏡像
注:創建時會將指定路徑下的所有文件都先上傳,所以最好將Dockerfile文件放在單獨的目錄下。
```
## 17.導入鏡像
```
docker load : 導入使用 docker save 命令導出的鏡像。
例:docker load < line.tar
```