Linux Docker一站式——从下载到使用,包含Dockerfile编写、阿里云镜像仓库、DockerHub、GPU传入

Docker使用介绍

参考官方文档:Docker

写在前面:

本介绍仅适用于linux系统(以Ubuntu为例),

如果您的操作系统是windows:请参见博客docker for windows或链接linux服务器/安装linux虚拟机(如Ubuntu)再进行使用;

如果您的操作系统是macs:不好意思不大了解呢(>人<;)

本文所有小三角都是可以展开的项目哦~

该介绍包括以下内容:

Docker的作用与基本信息

Docker的作用

Docker 是一个用于开发、交付和运行应用程序的开放平台。 Docker 使开发者能够将应用程序与基础架构分开,以便快速交付软件。

Docker可以创建一个包含程序运行所需要的一切的容器,在其他人希望使用该程序时,可以即取即用,不需要考虑其本机的环境。

同时Docker提供很便捷的交付工作与修改版本的方法,即将修改的容器上传至云端,对方仅需要拉去新的映像即可。

在服务器负载方面:如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

Docker的原理

在这里插入图片描述

展开
  • 镜像(Images)

    定义:Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

    作用 : Docker镜像是用来启动容器的,也用来创建新的容器,类似于虚拟机的快照。

    特点 : 镜像不包含任何动态数据,其内容在构建之后也不会被改变,在Docker里可以创建镜像,也可以从第三方的网站上下载别人已经做好的镜像来使用

  • 容器(Containers)

    定义 : 一个Docker镜像可以实例化出来多个容器,而每一个容器之间是独立运行的,没有任何依赖

    作用 : 运行程序员开发的应用程序的

    特点 : Docker镜像是不能运行的,是静态的,而Docker容器是运行的,是动态的,可以将Docker容器想像成一个简化版的操作系统和一些核心基础的应用。每个容器运行一个独立的应用程序

  • 仓库(Registry)

    定义 : Docker仓库提供一个注册服务器,用于存储多个仓库,而仓库是用来存储镜像位置的

    作用: 我们自已创建了一个镜像之后,可以使用push命令将镜像文件上传到仓库中,后期如果在其它服务器上需要使用镜像,就可以从仓库上下载过来并使用

Docker的安装

快速安装(unofficial)

展开
sudo apt install docker.io

如果本地有GPU,执行以下命令以支持GPU调用:

# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 
curl -s -L https://nvidia.github.io/nvidia-docker/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 && sudo apt-get install -y nvidia-container-toolkit 
# restart docker
sudo systemctl restart docker

Docker库apt安装(推荐)

展开
  1. 卸载原有非正式docker版本

    包括以下版本:docker.io、docker-compose、docker-doc、podman-docker

        for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
    
  2. 设置docker存储库以便于安装与更新docker
        # 更新 apt 软件包
        sudo apt-get update
        sudo apt-get install ca-certificates curl gnupg
    
        # 添加 Docker 的官方 GPG 密钥
        sudo install -m 0755 -d /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        sudo chmod a+r /etc/apt/keyrings/docker.gpg
    
        # 使用以下命令设置存储库
        echo \
        "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
        "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    
  3. 安装Docker
        # 更新 apt 软件包
        sudo apt-get update
    
    安装最新版本
        # 安装最新版本 Docker Engine、containerd 和 Docker Compose
        sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
    安装特定版本(或更新)
        # 打印历史版本信息
        apt-cache madison docker-ce | awk '{ print $3 }'
        # 输出:
        /* 5:24.0.0-1~ubuntu.22.04~jammy
        5:23.0.6-1~ubuntu.22.04~jammy
        <...> */
        # 选择某个版本安装
        export VERSION_STRING=5:24.0.0-1~ubuntu.22.04~jammy
        sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
    
  4. 验证docker是否正常安装
        sudo docker run hello-world
    

Docker桌面版安装(推荐)

展开
  1. 进入网站DockerDesktopDownload

  2. 选择合适的版本下载

  3. 完成Docker库apt安装的步骤1~2

  4. shiyongapt指令安装deb软件包

        sudo apt-get update
        sudo apt-get install ./docker-desktop-<version>-<arch>.deb
    
  5. 启动docker桌面版(点击图标即可)

    也可以在终端启动:

        systemctl --user start docker-desktop
    

    设置登陆时自启动:

        systemctl --user enable docker-desktop
    

    终端停止运行

        systemctl --user stop docker-desktop
    

Docker手动包安装

展开
  1. 进入网站DockerDebDownload

  2. 选择Ubuntu版本

    可以在终端输入以下指令查看

        sudo uname -a
    
  3. 进入文件夹 pool/stable/ 并选择操作系统 amd64 armhf arm64 s390x

  4. 下载以下包:

    • containerd.io__.deb
    • docker-ce__.deb
    • docker-ce-cli__.deb
    • docker-buildx-plugin__.deb
    • docker-compose-plugin__.deb
  5. 安装软件包(在下载位置目录下或替换路径为下载位置)

        sudo dpkg -i ./containerd.io_<version>_<arch>.deb \
            ./docker-ce_<version>_<arch>.deb \
            ./docker-ce-cli_<version>_<arch>.deb \
            ./docker-buildx-plugin_<version>_<arch>.deb \
            ./docker-compose-plugin_<version>_<arch>.deb
    
  6. 验证docker是否正常安装

        sudo service docker start
        sudo docker run hello-world
    

Docker的卸载与完全清空

展开
# 删除包
sudo zypper remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
# 删除参与的镜像、容器等文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

如何在本地创建并使用Docker

非root用户使用docker

  • 如果您使用的是服务器,可能无法获取sudo权限,此时可以配置以非root身份管理Docker

        # 创建 group
        sudo groupadd docker
        # 将用户添加至group
        sudo usermod -aG docker $USER
        # 重新登陆或重启虚拟机
        # 验证是否可以运行
        docker run hello-world
    
    • 更改group
        newgrp docker
    

利用Dockerfile创建镜像

  1. 整理文件结构

    建议您在构建Docker时将文件结构整理如下:
    在这里插入图片描述

    其中 app 文件夹(也可以自行命名)中存放全部的项目文件,
    Dockerfile是您自行创建的文件,
    requirements.txt可以用如下命令生成:(建议进入您运行程序的conda虚拟环境)

    pip freeze > requirements.txt
    
  2. 编写Dockerfile

    基本指令:

    指令描述
    FROM 定义(导入)基础镜像(除ARG外必须位于Dockerfile的第一行)
    RUN 执行可执行命令(如pip install)
    WORKDIR <directory>为以后的指令以及生成的镜像设置工作目录
    COPY <src> <dest>将<src>的文件或目录复制到<dest>中去
    CMD 定义启动镜像后的默认执行程序,每个镜像只能有一个,若有多个则默认运行最后一项
    ARG定义变量,效果类似export

    示例:
    在这里插入图片描述

详细说明(请务必点击查看)

参考文档

FROM指令
  • 以navida提供的镜像作为基础镜像

    访问 nvidia提供的PyTorch Container,找到匹配自己版本的容器。

        FROM nvcr.io/nvidia/pytorch:版本号
    
  • 以pytorch提供的镜像作为基础镜像

    访问 pytorch提供的PyTorch Container,找到匹配自己版本的容器。

        FROM pytorch/pytorch:版本号     // 版本号格式为:[Torch version]-[CUDA version]-[cudnn version]-[Image flavor]
    

    如:FROM pytorch/pytorch:1.13.0-cuda11.6-cudnn8-runtime ,其中:

      - 1.13.0 – Torch version.
      - cuda11.6 - CUDA version.
      - cudnn8 – cudnn version.
      - runtime – Image flavor.
      
      提供三种不同的 Image flavor :
      - runtime 是一个功能更全面的选项,包括用于跨GPU通信的 CUDA 数学库和 NCCL 。
      - devel 提供了用于创建自定义 CUDA 图像的所有内容以及头文件和开发工具。
    
  • 以原有的Image作为基础镜像(可以是本地Image或者是云端Image)

        ARG CODE_VERSION=latest        // 定义一个变量 version
        FROM base:${CODE_VERSION}      // 以 bash:version作为基础镜像(会在[利用镜像启动容器](#基于镜像启动容器)处展示该语法)
    

    例如本地镜像:
    在这里插入图片描述
    即可使用镜像 sddd_test:latest 作为新镜像的基础镜像

      ```
          # Dockerfile中FROM指令
          FROM sddd_test:latest
      ```
    
RUN指令
  • 存在两种格式:
    • RUN :运行一条shell指令
    • RUN [“executable”, “param1”, “param2”]:将指令以列表形式展现,作用依旧为运行一条shell指令
CMD指令
  • 存在三种形式:
    • CMD [“executable”,“param1”,“param2”] (exec form, this is the preferred form)
    • CMD [“param1”,“param2”] (as default parameters to ENTRYPOINT)
    • CMD command param1 param2 (shell form)
  1. build命令创建镜像

    在 Dockerfile 所在文件夹下运行命令

        docker build [OPTIONS] PATH | URL | -
    
    其他OPTIONS详细说明:
     --build-arg=[] :设置镜像创建时的变量;
    
     --cpu-shares :设置 cpu 使用权重;
    
     --cpu-period :限制 CPU CFS周期;
    
     --cpu-quota :限制 CPU CFS配额;
    
     --cpuset-cpus :指定使用的CPU id;
    
     --cpuset-mems :指定使用的内存 id;
    
     --disable-content-trust :忽略校验,默认开启;
    
     -f :指定要使用的Dockerfile路径;
    
     --force-rm :设置镜像过程中删除中间容器;
    
     --isolation :使用容器隔离技术;
    
     --label=[] :设置镜像使用的元数据;
    
     -m :设置内存最大值;
    
     --memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
    
     --no-cache :创建镜像的过程不使用缓存;
    
     --pull :尝试去更新镜像的新版本;
    
     --quiet, -q :安静模式,成功后只输出镜像 ID;
    
     --rm :设置镜像成功后删除中间容器;
    
     --shm-size :设置/dev/shm的大小,默认值是64M;
    
     --ulimit :Ulimit配置。
    
     --squash :将 Dockerfile 中所有的操作压缩为一层。
    
     --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
    
     --network: 默认 default。在构建期间设置RUN指令的网络模式
    

    常见命令为

        sudo docker build -t [REPOSITORY] .    // 其中ImageId即为生成的镜像名称,命令的最后有一个(.)
    

    需要注意的是,运行 build 指令所在的文件夹与 Dockerfile 中的路径有关,即需要注意如 COPY 等涉及路径的指令
    如果有不希望被生成到镜像中的文件。可以构建 .dockerignore 文件来排除这些文件或者目录

基于镜像启动容器

  1. 查看本机存在的镜像

    在终端运行任意指令:

    docker images
    docker image ls
    

    即可看到本机存在的镜像列表:
    在这里插入图片描述

    其中 REPOSITORY 即为我们在 build 指令中规定的镜像名称, Tag 为镜像的版本号, Image ID 为镜像的唯一ID

  2. run命令启动容器

    当我们真正使用镜像时,需要基于镜像启动一个容器,在终端运行指令:

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    其他OPTIONS详细说明:
     -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    
     -d: 后台运行容器,并返回容器ID;
    
     -i: 以交互模式运行容器,通常与 -t 同时使用;
    
     -P: 随机端口映射,容器内部端口随机映射到主机的端口
    
     -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    
     -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    
     --name="nginx-lb": 为容器指定一个名称;
    
     --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    
     --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    
     -h "mars": 指定容器的hostname;
    
     -e username="ritchie": 设置环境变量;
    
     --env-file=[]: 从指定文件读入环境变量;
    
     --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    
     --gpus all or --gpus 2 or --gpus "device=0":绑定容器到一定数目/指定的GPU运行
    
     -m :设置容器使用内存最大值;
    
     --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    
     --link=[]: 添加链接到另一个容器;
    
     --expose=[]: 开放一个端口或一组端口;
    
     --volume , -v: 绑定一个卷
    

    例如:
    在终端运行
    docker run -t -i --rm sddd_test // 其中sddd_test可以更换为 sddd_test:latest(REPOSITORY:Tag) 或者 Image ID

    可以看到如下结果:
    在这里插入图片描述

    表明已经基于sddd_test镜像启动了一个容器(容器ID为f9ec15aa5ecd),并且为容器分配了一个伪终端(-t)、以交互式方式运行容器(-i)、在容器运行结束后将容器删除(-rm)

    当前所在容器目录即为Dockerfile中设置的工作目录

    在容器中,你可以正常运行你的程序。

    • 退出容器

      在容器内的终端输入指令 exit或者键盘敲击 Ctrl+D 都可以退出终端
      需要注意的是,如果在创建容器时没有选择 --rm ,那么退出容器后容器仅被关停而非被删除。

      可以使用如下指令查看正在运行中的容器(不包括已经关停的容器):

          docker ps
      

      可以使用如下指令查看所有容器(包括已被关停的容器):

          docker ps -a
      

      可以看到如下结果:
      在这里插入图片描述

      其中 ContainerID 为容器的唯一ID, IMAGE 为该容器基于的镜像, COMMAND 记录了你在该容器中上一次的指令

删除镜像与容器

  • 删除镜像
        # 查看现有的镜像
        docker run images                    // 或者docker run image ls
    
        # 根据打印出的镜像信息删除
        docker rmi [ImageID]                 // 根据镜像ID删除(适用于镜像ID唯一的情况,当镜像被重命名时不可用)
        docker rmi [REPOSITORY]              // 根据镜像名称删除(适用于该镜像名唯一的情况,当镜像名有多个tag时不可用)
        docker rmi [REPOSITORY:Tag]          // 根据镜像名与版本号(tag)删除
    
    有时会遇到悬停镜像(<none>:<none>),可用以下指令删除:
        docker image prune
    
    若清理全部无容器使用的镜像,可用以下指令删除:
        docker image prune -a
    
        # 只删除24小时前创建的镜像
        $ docker image prune -a --filter "until=24h"
    
    若希望删除的镜像被容器使用,需要删除该容器后才能删除镜像(包括被关停但未被删除的容器)
  • 删除容器
        # 查看现有的容器
        docker ps -a
    
        # 根据打印出的容器信息删除
        docker rm [ContainerID]
    
        # 删除全部关停的容器
        docker container prune
    
        # 删除全部容器
        docker rm $(docker ps -aq)
    

其他指令

容器生命周期管理
    # docker start :启动一个或多个已经被停止的容器
    docker start [OPTIONS] CONTAINER [CONTAINER...]

    # docker stop :停止一个运行中的容器
    docker stop [OPTIONS] CONTAINER [CONTAINER...]

    # docker restart :重启容器
    docker restart [OPTIONS] CONTAINER [CONTAINER...]

    # docker kill :杀掉一个运行中的容器
    docker kill [OPTIONS] CONTAINER [CONTAINER...]

    # docker pause :暂停容器中所有的进程
    docker pause CONTAINER [CONTAINER...]

    # docker unpause :恢复容器中所有的进程
    docker unpause CONTAINER [CONTAINER...]

    # docker create :创建一个新的容器但不启动它
    docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

    #docker exec :在运行的容器中执行命令
    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]          // -d :分离模式: 在后台运行  -i :即使没有附加也保持STDIN 打开  -t :分配一个伪终端

容器操作
    # docker ps : 列出容器
    docker ps [OPTIONS]             
    // -a :显示所有的容器  -f :根据条件过滤显示的内容  --format :指定返回值的模板文件  -l :最近创建的容器  -n :列出最近创建的n个容器   --no-trunc :不截断输出  -q :只显示容器编号  -s :文件大小

    # docker inspect : 获取容器/镜像的元数据
    docker inspect [OPTIONS] NAME|ID [NAME|ID...]    // -f :指定返回值的模板文件  -s :显示总的文件大小  --type :为指定类型返回JSON

    # docker top :查看容器中运行的进程信息,支持 ps 命令参数
    docker top [OPTIONS] CONTAINER [ps OPTIONS]

    # docker attach :连接到正在运行中的容器
    docker attach [OPTIONS] CONTAINER
RootFS操作
    # docker diff : 检查容器里文件结构的更改
    docker diff [OPTIONS] CONTAINER

    # docker commit :从容器创建一个新的镜像
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]      // -a :提交的镜像作者  -c :使用Dockerfile指令来创建镜像  -m :提交时的说明文字  -p :在commit时,将容器暂停

    # docker cp :用于容器与主机之间的数据拷贝
    docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
本地镜像管理
    # docker images : 列出本地镜像
    docker images [OPTIONS] [REPOSITORY[:TAG]]
    // -a :列出本地所有的镜像  --digests :显示镜像的摘要信息   -f :显示满足条件的镜像   --format :指定返回值的模板文件  --no-trunc :显示完整的镜像信息  -q :只显示镜像ID

    # docker rmi : 删除本地一个或多个镜像
    docker rmi [OPTIONS] IMAGE [IMAGE...]     // -f :强制删除  -no-prune :不移除该镜像的过程镜像,默认移除

    # docker tag : 标记本地镜像,将其归入某一仓库
    docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

    # docker history : 查看指定镜像的创建历史
    docker history [OPTIONS] IMAGE            // -H :以可读的格式打印镜像大小和日期,默认为true  --no-trunc :显示完整的提交记录  -q :仅列出提交记录ID

    # docker save : 将指定镜像保存成 tar 归档文件
    docker save [OPTIONS] IMAGE [IMAGE...]    // -o :输出到的文件

    # docker load : 导入使用 docker save 命令导出的镜像
    docker load [OPTIONS]                     // --input , -i : 指定导入的文件,代替 STDIN  --quiet , -q : 精简输出信息

    # docker import : 从归档文件中创建镜像
    docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]      // -c :应用docker 指令创建镜像  -m :提交时的说明文字
镜像仓库
    # docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
    docker login -u 用户名 -p 密码

    # docker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
    docker logout

    # docker pull : 从镜像仓库中拉取或者更新指定镜像
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    # docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
    docker push [OPTIONS] NAME[:TAG]

    # docker search : 从Docker Hub查找镜像
    docker search [OPTIONS] TERM                   // --automated :只列出 automated build类型的镜像  --no-trunc :显示完整的镜像描述  -f <过滤条件>:列出收藏数不小于指定值的镜像
系统信息
    # docker info : 显示 Docker 系统信息,包括镜像和容器数
    docker info [OPTIONS]

    # docker version :显示 Docker 版本信息
    docker version [OPTIONS]                        //  -f :指定返回值的模板文件

如何使用容器镜像服务

使用阿里云容器镜像服务

创建并配置镜像仓库
  1. 进入阿里云镜像服务中心并注册

  2. 进入命名空间并创建一个命名空间
    在这里插入图片描述

  3. 进入镜像仓库并创建一个镜像仓库(可以在不同的服务区创建)

    仓库类型建议选择本地仓库
    在这里插入图片描述

  4. 可以在访问凭证中设置静态密码(不用账号密码作为仓库密码)
    在这里插入图片描述

  5. 查看管理仓库获得镜像链接
    在这里插入图片描述

上传镜像至镜像仓库
  1. 在终端输入以下指令登录阿里云

        docker login --username=[你的账户名] registry.cn-***.aliyuncs.com        // 仓库公网地址 your_registry_url<docker registry url>
        # 根据提示输入密码
    

    或者

        export DOCKER_REGISTRY= your_registry_url<docker registry url>
        docker login $DOCKER_REGISTRY \
            --username your_username \
            --password your_password
    
  2. 对本机镜像重命名

        docker tag [ImageId] registry.cn-***.aliyuncs.com/[命名空间名]/[镜像仓库名]:[镜像版本号]
    
        # 可以通过 docker images 指令观察重命名效果,会发现镜像名称改变而镜像ID相同
    

在这里插入图片描述

  1. 将镜像推送到Registry

        docker push registry.cn-***.aliyuncs.com/[命名空间名]/[镜像仓库名]:[镜像版本号]
    
  2. 检查镜像是否被推送成功
    在这里插入图片描述

从镜像仓库拉取镜像至本机
    docker pull registry.cn-***.aliyuncs.com/[命名空间名]/[镜像仓库名]:[镜像版本号]

    # 可以通过 docker images 指令观察拉取到的镜像,拉取的镜像 tag 为镜像版本号
    # 随后就可以对该镜像执行本地镜像的指令了

此处提供一个可以用来拉取镜像、运行容器并实现文件挂载的脚本 ‘/docs/run.sh’

    set -e
    docker login --username $1 --password $2 $3
    docker pull $3
    docker run --ipc=host --gpus all  --rm -v `pwd`/datas:/mounted_path $3 bash run.sh /mounted_path/in.lst > datas/out.lst
run.sh使用
```bash
    export user=<your username>
    export passwd=<your password>
    export image=<your image url>                // 此处 image url 应为 registry.cn-***.aliyuncs.com/[命名空间名]/[镜像仓库名]:[镜像版本号]
    bash run.sh $user $passwd $image
```
run.sh解读
1. 登录对应的docker hub,使得第2步的pull镜像部分时相关的权限
2. 拉取(pull)阿里云docker hub的镜像到本地
3. 运行拉取到本地的docker镜像
    * `--gpus all`: 传入所有的GPU
    * `--rm`: 在docker镜像运行后删除对应的container
    * `-v `pwd`/datas:/mounted_path`: 将当前目录的datas文件映射到docker内部的 `/mounted_path`目录
    * `$3 bash run.sh /mounted_path/in.lst`:  `$3`为docker image name,运行image工作目录下的run.sh(**注意:**该run.sh为另一个脚本,用来运行你的程序)
    * `> datas/out.lst`: 将输出重定向到 datas/out.lst文件中

使用 Docker Hub 镜像仓库

  1. 注册并登录 DockerHub下载桌面版Docker(可选)

  2. 创建一个仓库

    • 在仓库界面选择“创建一个仓库”
      在这里插入图片描述

    • 填写仓库名称,选择是否公开(即仓库地址为 <your-username>/my-private-repo)

  3. 从 DockerHub 拉取测试镜像进行测试

    • 在终端输入如下指令,应获得输出如下:
     $ docker pull hello-world
    
     /* Using default tag: latest
     latest: Pulling from library/hello-world
     2db29710123e: Pull complete
     Digest:   sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625
     Status: Downloaded newer image for hello-world:latest
     docker.io/library/hello-world:latest */
    
    • 在终端输入以下指令以在本地运行镜像:
     $ docker run hello-world
    
     /* Hello from Docker!
     This message shows that your installation appears to be working correctly.
    
     To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
     (amd64)
     3. The Docker daemon created a new container from that image which runs the
     executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent
     it to your terminal. 
    
     To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
     Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
     For more examples and ideas, visit:
     https://docs.docker.com/get-started/ */
    
  4. 在本机创建镜像

        $ docker build -t <your_username>/my-private-repo .
        $ docker build -t <your_username>/my-private-repo:tag .          // 或者运行该命令以规定Tag
    
        # 或者创建其他镜像名并重命名
        $ docker build -t [REPOSITORY] .
        $ docker tag [ImageId] <your_username>/my-private-repo
        $ docker tag [ImageId] <your_username>/my-private-repo:tag       // 或者运行该命令以规定Tag
    
  5. 将本地镜像上传至 DockerHub

        $ docker push <your_username>/my-private-repo
        $ docker push <your_username>/my-private-repo:tag                 // 或者运行该命令以规定上传版本
    
  6. 在 DockerHub 查看已上传的镜像

    若上传的镜像未规定 Tag, Tag 会被默认设置为 latest

  7. 从 DockerHub 拉取镜像

    • 在终端运行 pull 命令
    • 在 Dockerfile 中使用 FROM 指令
    • 在终端直接运行 docker run 命令

关于Docker使用GPU的使用

首先应确保基础镜像是支持 gpu 的:

  • 选择合适的 navida 提供的基础镜像

        FROM nvcr.io/nvidia/pytorch:版本号
    
  • 利用nvidia/cuda标签在 docker hub 中选择适合系统的镜像

        FROM nvidia/cuda:[CUDA version]-[Image flavor]-[Operating system version]
    

    如:nvidia/cuda:11.4.0-base-ubuntu20.04 ,其中:

      - 11.4.0 – CUDA version.
      - base – Image flavor.
      - ubuntu20.04 – Operating system version.
    
      提供三种不同的 Image flavor :
      - base 是基本 CUDA 运行时二进制文件的最小选项。
      - runtime 是一个功能更全面的选项,包括用于跨GPU通信的 CUDA 数学库和 NCCL 。
      - devel 提供了用于创建自定义 CUDA 图像的所有内容以及头文件和开发工具。
    
  1. 确保宿主机中安装有NVIDIA驱动(NVIDIA Container Toolkit),可运行如下命令测试:

        nvidia-smi
    

    如果未安装,请参阅添加 NVIDIA 驱动程序

  2. 运行容器时传入参数

        # 应具有--gpu 参数,"all"表示传入全部gpu," 数字 "表示传入几个gpu," '"device=数字"' "表示传入某个gpu
        docker run -t -i --rm --gpus all [ImageID]
        docker run -t -i --rm --gpus 2 [ImageID]
        docker run -t -i --rm --gpus '"device=2"' [ImageID]
    
  3. 进入容器查看是否 GPU 可用

    • 查看是否装有nvcc
        nvcc -v
    
        python
    
        >>> import torch
        >>> #返回当前设备索引
        >>> torch.cuda.current_device()
        >>> # 返回GPU的数量
        >>> torch.cuda.device_count()
        >>> #返回gpu名字,设备索引默认从0开始
        >>> torch.cuda.get_device_name(0)
        >>> # cuda是否可用
        >>> torch.cuda.is_available()
    
展开
添加 NVIDIA 驱动程序
  1. 将 NVIDIA Container Toolkit 添加到主机

        distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
        && curl -s -L https://nvidia.github.io/nvidia-docker/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
    
  2. 利用 nvidia-docker2 在主机上安装软件包

        apt-get update
        apt-get install -y nvidia-docker2
    
  3. 重启 Docker 守护进程

        sudo systemctl restart docker
    
  4. 测试是否可以使用 gpu

        docker run -it --gpus all nvidia/cuda:11.4.0-base-ubuntu20.04 nvidia-smi
    

到这里就结束啦~仍在学习与摸索中,错漏之处还请指正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值