NVidia-Docker2安裝與常用命令


前提條件:配置apt國內鏡像源
1.備份sources.list
  sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
2.修改sources.list
  sudo gedit /etc/apt/sources.list
3.替換雲鏡像
阿里
  deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

 deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
4.更新
 sudo apt update

一、安裝Docker  
當前版本為:Ubuntu18.04
清除系統原有docker
  sudo apt-get remove docker docker-engine docker.io
更新程序
 sudo apt update 
安裝依賴
 sudo apt install apt-transport-https ca-certificates curl software-properties-common 
添加Docker官方密鑰到系統中
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 在雲桌面執行該命令時報錯:curl:(35) gnutils_handshake() failed:Error in the push function. gpg:找不到有效的OpenPGP數據

 解決方法:sudo apt-get install build-essential fakeroot dpkg-dev libcurl4-openssl-dev
設置fingerprint [可選]
 sudo apt-key fingerprint 0EBFCD88
添加Docker源 [先查看當前操作系統版本,確定是bionic還是xenic lsb_release -cs]
 sudo  add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" 或直接使用下面這條命令
 sudo  add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
更新一下源
  sudo apt update
查看可以安裝的docker版本
  apt-cache policy docker-ce  如果有列表顯示,說明可以正常安裝了
開始安裝docker
 sudo apt install docker-ce
測試
 docker --version 
 sudo docker run hello-world 出現unable to find image 'hello-world:latest' locally說明已安裝成功
 
二、安裝NVIDIA-docker
0.前提
1)安裝docker
2)安裝Nvidia驅動,CUDA,CUDNN,安裝流程可參考鏈接:NVIDIA顯卡驅動,CUDA,CUDNN安裝流程
1.安裝gpgkey
 curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

     碰到問題:gpg: 找不到有效的 OpenPGP 數據。

    解決方法:依次輸入以下兩條命令:

                     wget https://download.docker.com/linux/ubuntu/gpg

                     sudo apt-key add gpg
 curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu18.04/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
 sudo apt-get update
2.安裝NVIDA-DOCKER

方法1:

1)安裝nvidia-container-runtime ,如果安裝nvidia-docker2的話
  添加package repositories
 curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add -
 distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
 curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
 sudo apt-get update
 sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-runtime.list
 sudo apt-get update
 sudo apt-get install nvidia-container-runtime
2)安裝nvidia-docker2軟件包並重新加載docker守護程序配置
  安裝 nvidia-docker2
 sudo apt-get install nvidia-docker2
 sudo pkill -SIGHUP dockerd

方法2:

直接下載好4個包:

libnvidia-container1_1.0.1-1_amd64.deb

libnvidia-container-tools_1.0.1-1_amd64.deb

nvidia-container-runtime_3.1.4-1_amd64.deb

nvidia-container-toolkit_1.0.5-1_amd64.deb

sudo dpkg -i *.deb 依次安裝即可
  測試安裝
 docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
 一般會報錯,使用命令:nvidia-smi查看當前CUDA版本[cuda:11.0]
  輸入以下命令:
 sudo nvidia-docker run --rm nvidia/cuda:11.0-devel nvidia-smi
 如果出現unable to find image 'nvidia/cuda:11.0-devel' locally
  11.0-devel:Pulling from nvidia-cuda
  3ff22d22a855 Downloading ...
  就表示安裝成功了

 

sudo systemctl stop docker(停止docker守護進程,如若被占用,下方的docker會報gpu錯誤)

開啟docker並掛載對應路徑文件,sudo docker run --gpus 1 -it --rm --shm-size="32g" -v /data/local_dir/:/docker_dir:rw --
entrypoint="/bin/bash" dockername:dockertag

三、創建鏡像
創建docker鏡像的三種方法,分別是基於已有的容器創建、基於本地模板創建、以及dockerfile創建
1.基於已有的容器創建主要是使用docker commit命令
 docker commit 選項                     容器ID/名稱   倉庫名稱:標簽
 docker commit -m "說明信息" -a "作者" 6d26ae8a244f  zj199711:nginx
2.通過導入操作系模板文件可以生成鏡像,模板可以從OPENVZ開源項目下載,
 下載地址為:https://wiki.openvz.org/Download/template/precreated
 Cat 鏡像包 | docker import - 生成的鏡像名:標簽
 cat ubuntu-12.04-x86_64-minimal.tar.gz |docker import - zj199711:v1 sha256:f3ffe2cskdkjfi3fasfklafkdl
3.用dockerfile生成鏡像
 Dockerfile結構的四個部分:基本鏡像信息,維護者信息,鏡像操作指令和容器啟動執行指令:
1)建立工作目錄:
  mkdir myapache |cd myapache
2)創建並編寫dockerfile文件
  vim Dockerfile:
  #基本鏡像ubuntu
 FROM ubuntu
  #維護該鏡像的用戶信息
  MAINTAINER jimchen
  RUN apt-get -y update
  RUN apt-get -y install httpd
  #開啟80端口
 EXPOSE 80
  #復制網址首頁文件
 ADD index.html /var/www/html/index.html
 #將執行腳本復制到鏡像
 ADD run.sh /run.sh
  RUN chmod 775 /run.sh
  CMD ["/run.sh"]
  ~
  Dockerfile文件必須以FROM開頭,后面跟基礎容器和版本,指明當前鏡像的父容器,父容器通常是以“用戶名/鏡像名:版本號”的形式存在
  RUN指令用於創建當前的Docker鏡像,每次調用該指令的時候,Docker都會創建新的鏡像層,這樣便於回滾到之前的鏡像版本,它的語法是在RUN后面接shell指令(比如RUN mkdir /user/local/foo),它會自動執行/bin/sh的shell,當然也可以指定比如:RUN /bin/bash -c 'mkdir /user/local/foo'
  COPY指令可以將本地的文件復制到容器中
  CMD指令定義的命令將會在鏡像啟動時執行,和RUN指令不同的是它不會創建新的鏡像層,只是簡單的執行指令,在每個鏡像的Dockerfile文件中可以只有一個CMD指令,也可以有多個待執行的指令,CMD執行指令的時候需要我們指定在哪里運行這些指令,而RUN則無需指定,比如下面的CMD指令:CMD ["python", "./app.py"]
  EXPOSE指令用於指定鏡像程序將會在哪個端口提供服務,這些信息可以通過docker inspect <container-id>指令檢索出來,但是EXPOSE指令實際上並沒有向主機暴露端口,而是在需要在docker run 發布時以-p標志的方式暴露
  PORTS                    NAMES
  0.0.0.:32768->8080/tcp   wildfly
  從上可以看到就是將鏡像的8080端口暴露給主機的32768端口,此時可以通過localhost:32768進行查看
 PUSH指令可以將鏡像發布到Docker Cloud這類平台
 ENV指令用於配置環境變量,如: ENV JAVA_HOME=/opt/jdk-9  ENV PATH=$PATH:$JAVA_HOME/bin
3)編寫執行腳本文件
 vim run.sh:
  #!/bin/bash
  rm -rf /run/httpd/*
  exec /usr/sbin/apachectl -D FOREGROUND
4)創建測試頁面
 echo "then is httpd">index.html
  ls
5)使用dockerfile生成鏡像文件
 docker build 選項 路徑
 docker build -t ubuntu:httpd .
  顯示如下:
  Send build context to Docker daemon 4.096kB
   Step 1/9: FROM ubuntu
    -->  83838383b99
    Step 2/9: MAINTAINER jimchen
    --> Using cache
    --> 8393029302
6)使用新的鏡像運行容器
 將容器中的暴露端口映射到宿主機上端口號為8888
  docker run -it -d -p 8888:80 ubuntu:httpd
  顯示如下:900safu03jf09saf3j0ja0w93j903j3w
 docker ps -a
  CONTAINER ID    IMAGE        COMMAND   CREATED    STATUS  PORTS    NAMES
  c30sf09sf       ubuntu:httpd "/run.sh" about a minute ago  0.0.0.:8888->80/tcp     wizardly_borg

7)用真實主機去訪問宿主機加映射的端口號
 在瀏覽器中輸入172.16.16.200:8888
  正常的話會在頁面上顯示:hello httpd test
4.將鏡像上傳到倉庫
 為dockerfile創建的鏡像添加別名(如果要上傳到公共倉庫需要在前面標簽你的docker hub賬號)
 docker tag ubuntu:httpd jimchen1218/ubuntu:httpd
5.創建私有倉庫
  可以使用registry來搭建本地私有倉庫
1)需要在構建私有倉庫的服務器上下載registry鏡像
  docker pull registry
  顯示:Using default tag: latest
 然后需要在/etc/docker/目錄下創建一個json文件,否則在往自定義的私有倉庫中上傳鏡像是會報錯
 vim /etc/docker/daemon.json
    {
    “registry-mirrors”: [“https://5fpngg16.mirror.aliyuncs.com”]
    }
    {
    “insecure-registres”: [“172.16.16.200:5000”]
    }
2)使用registry鏡像創建一個容器
  默認情況下倉庫放於容器內的/tmp/registry目錄下,使用-v選項可以將本地目錄掛載到容器內的/tmp/registry下使用這樣就不怕容器被刪除后鏡像也會隨之丟失:(默認的監聽端口為registry 5000端口號)
  將創建的容器5000的端口號映射到本機:
  docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
  使用docker tag命令將要上傳的鏡像標記為宿主機的IP/+鏡像名:
  docker tag ubuntu:httpd 172.16.16.200:5000/ubuntu:httpd
  用docker push上傳標記的鏡像:
  docker push 172.16.16.200:5000/ubuntu:httpd
  顯示:The push refers to repository [172.16.16.200:5000/ubuntu]

例:制作一個自己的docker鏡像
 docker build 構建一個docker鏡像
 制作步驟
 1)創建一個 Dockerfile:my-test-image
# 表示依賴其它的鏡像, 必須保證本地有這個鏡像
FROM nginx
# 將所有者(作者)信息寫入到鏡像中
MAINTAINER test-name  test-mail@163.com
# 將本地的文件, 復制到鏡像中
COPY project-directory /usr/share/nginx/html
2)構建docker鏡像
 docker build -t my-test-image
3)運行容器並用瀏覽器訪問測試
 docker run -d -p 8080:80  my-test-image
4)瀏覽器訪問測試
 http://127.0.0.1

四、部署運行鏡像
 創建完鏡像后,可以拉下來測試一下
 docker pull registry.cn-shanghai.aliyuncs.com/hhu/docker1
 docker run -p 8888:5000 --name myfirstapp registry.cn-shanghai.aliyuncs.com/hhu/docker1
 其中 -p (這個指令很重要)表示將虛擬機上的暴露的5000端口映射到本機8888端口,並且將該鏡像命名為myfirstapp,此時通過訪問http://localhost:8888即可查看關於貓的git圖,每次刷新會隨機獲取不同的貓圖

五、鏡像推送
 整個制作Docker鏡像的文件地址:https://github.com/Jacksonary/Docker/tree/master/flask-app


六、簡易Docker操作
1)啟動docker
 sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 sudo docker run -d  -p 8009:80 jimchen:nginx-image-test

 sudo docker run --gpus 1 -it --rm --shm-size="32g" -v /data/local_dir/:/docker_dir:rw --entrypoint="/bin/bash" dockername:dockertag
2)進入docker容器
 sudo docker exec -it 126 /bin/bash 注:126為容器ID前3位
  重啟動容器
  docker start anaconda  運行容器anaconda,anaconda是容器名
 docker exec -it anaconda /bin/bash   /bin/bash指在容器anaconda中運行交互式終端
3)停止一個運行的容器
 docker stop -t=(5)s 126 延時關閉5s   
4)直接關閉運行的容器
  docker kill
5)重啟一個容器
 docker restart 126
6)查看當前運行中的容器
 docker ps
7)為鏡像打個標簽
 docker tag 860c279d2fec runoob/centos:dev   鏡像ID:860c279d2fec
8)構建鏡像
 docker build -t runoob/centos:6.7 .    注意最后的點不能缺少,生成完:runoob/centos為REPOSITORY,6.7為TAG
  使用新的鏡像來創建容器
  docker run -t -i runoob/centos:6.7  /bin/bash

  sudo docker run -t -i pytorch/pytorch:1.3-cuda10.1-cudnn7-devel /bin/bash

  docker run --gpus all --shm-size="8g" -it --rm --entrypoint="/bin/bash" docker.hobot.cc/imagesys/mx-app-alg:v0.5 (鏡像)
9)獲取鏡像
 sudo docker pull NAME[:TAG]
 sudo docker pull centos:latest
9)刪除鏡像
  首先刪除容器,再刪除鏡像
 docker ps -a
  docker rm id
 刪除鏡像
 docker ps -a
  docker images
  docker rmi id
  注:刪除前需保證容器是停止的
10)導出鏡像為.tar
  docker save -o pytorch_latest.tar pytorch/pytorch:latest:導出將需要花費一點時間,導出成功后將.tar拷到離線主機導入即可
11)導入鏡像.tar
  docker load -i pytorch_latest.tar:鏡像導出和導入需要使用相匹配的命令,如save對應load
12)將當前容器保存為一個鏡像:
  docker commit -a “yaohui” containerID imageNAME
13)啟動anaconda容器並安裝jupyter
  docker run -it --name="anaconda" -p 8888:8888 continuumio/anaconda3 /bin/bash
  參數-it是啟用交互式終端,--name="anaconda"是給容器起名字,-p 8888:8888是將容器的8888端口映射到本地的8888端口,便於訪問jupyter
 docker run -it --name="anaconda_2" -p 8888:8888 -v `pwd`:/root continuumio/anaconda3 /bin/bash
  參數-v將當前目錄pwd掛載到容器的/root目錄,容器中對/root所做的改動會同步到主機


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM