zoukankan      html  css  js  c++  java
  • 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 -
    设置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,安装流程可参考链接:
    1.安装gpgkey
     curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
     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.安装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
      测试安装
     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 ...
      ...
      就表示安装成功了

     注:nvidia-docker1 和nvidia-docker2 的区别:
     (1)都依赖于docker, 版本1是一个整体的可行性文件,内部实现连接docker容器与硬件GPU,版本2将整体分拆成一个基于docker的薄封装(cat /usr/bin/nvidia-docker 可查看)和一个插件(nvidia-container-runtime , 该插件直接实现一个 hook的功能,连接GPU硬件),在版本2的nvidia-docker可发现,实际上还是运行docker,只是指定了 --runtime 参数,同时指定GPU设备,默认全部GPU设备。
      (2)当需要运行一个使用GPU的容器时,版本1必须用nvidia-docker run/create 启动, 版本二可通过设置守护进行default-runtime参数可直接通过 docker run/create 直接启动GPU容器
    docker的守护进程参数配置一般在文件 /etc/docker/daemon.json
    cat /etc/docker/daemon.json
    {
        "runtimes": {
            "nvidia": {
                "path": "nvidia-container-runtime",
                "runtimeArgs": []
            }
        }
    }
    配置默认的插件环境后
    {
        "default-runtime" : "nvidia",

        "runtimes": {
            "nvidia": {
                "path": "nvidia-container-runtime",
                "runtimeArgs": []
            }
        }
    }
    配置完成后,重启docker  
    systemctl restart docker
    然后调用docker run/create启动容器即可.
    能够同时使用nvidia-docker1和nvidia-docker2,其实是可以的,在安装nvidi-docker1后,只要下载插件(nvidia-container-runtime和 nvidia-container-runtime-hook),新建docker守护进程配置参数,重启docker, 然后nvidia-docker启动容器时,指定--runtime nvidia参数即可


    1.Install Docker from Ubuntu Repository:
      sudo apt install docker.io
      The following linux commands will start Docker and ensure that starts after the reboot:
      sudo systemctl start docker
      sudo systemctl enable docker
      docker --version


    三、创建镜像
    创建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
    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
    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所做的改动会同步到主机
    14)从容器中拷贝数据
     docker cp anaconda:你容器中数据的路径 你的本地路径

  • 相关阅读:
    Kubernetes之network: failed to set bridge addr: "cni0" already has an IP address different from xxx问题
    k8s的存储Volume
    系统漏洞扫描与分析软件
    linux图形化安装oracle
    JMX监控tomcat jdbc pool
    Hyper-V
    苹果手机
    读书
    clickhouse count
    clickhouse分布式表
  • 原文地址:https://www.cnblogs.com/jimchen1218/p/14186262.html
Copyright © 2011-2022 走看看