searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

如何制作一个Docker镜像(基于centos基础镜像,并添加cuda samplers测试样例)

2024-09-02 09:51:06
66
0

Docker基础

基础概念

Docker 是一个开源的容器化平台,它允许开发者和系统管理员打包、分发和运行应用程序,而无需担心底层基础设施。Docker 使用 Linux 容器(LXC)技术,但提供了一个更易用的接口和更丰富的功能集。以下是 Docker 的一些关键特性和概念:

  1. 容器(Container):容器是 Docker 的核心概念,它是一个轻量级的、可移植的、自给自足的软件运行环境。容器内包含了运行应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件。
  2. 镜像(Image):Docker 镜像是一个只读模板,包含了运行容器所需的所有内容。镜像可以被看作是容器的蓝图,它们是不可变的,这意味着一旦创建,就不能更改
  3. 仓库(Repository):Docker 仓库是一个集中存储和分发 Docker 镜像的地方。
  4. Dockerfile:Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于自动化构建 Docker 镜像的过程。通过编写 Dockerfile,你可以定义如何构建你的应用程序的镜像。

容器共享宿主机的内核,不需要像虚拟机那样模拟整个操作系统,因此启动速度快,资源占用少。总结来讲,可以把docker当作一个小型的虚拟机

运行模式

Docker 的运行模式可以分为几种主要的方式,每种模式适用于不同的使用场景。在笔者的工作之中,应用最为广泛的是交互模式和后台模式。

交互模式

交互模式允许你启动一个容器并与其进行交互,通常是为了调试或手动操作容器内的应用程序。

runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#

各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

交互模式会进入容器里面

后台模式

后台模式使容器在后台运行,不会占用你的终端。可以通过 docker ps 命令查看运行中的容器。

docker run -itd --name ubuntu-test ubuntu /bin/bash

注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec

如果需要进入容器:

docker exec -it 243c32535da7 /bin/bash

其中243c32535da7为容器ID。

Docker镜像的制作

Docker镜像的制作主要包括以下几个步骤:

拉取镜像
以某一个镜像作为基础镜像,这里选用的是以centos7操作系统作为基础镜像,该镜像包括cuda工具和cudnn包。

docker pull nvidia/cuda:11.7.1-devel-centos7

测试样例下载
下载需要的测试样例,此处以cuda samplers为例,测试样例位于github里的
/NVIDIA/cuda-samples位置。

启动容器

docker run -itd --rm --gpus all nvidia/cuda:11.7.1-devel-centos7 /bin/bash

其中的参数解释如下:

  • -it-i保持容器的标准输入流,允许你与容器进行交互; -t分配一个伪终端,使容器的终端更易于交互。
  • -d--detach:让容器在后台运行,不会占用你的终端。与 -it 配合使用时,容器会在后台运行,并且你可以通过终端访问容器。
  • --rm:自动删除容器:当容器停止时,Docker 会自动删除该容器。这个选项有助于避免容器积累,节省磁盘空间。
  • --gpus all:允许容器访问所有可用的 NVIDIA GPU。这个选项需要在 Docker 运行时和 GPU 驱动程序配置正确,以便容器能够利用 GPU 进行计算加速。
  • ​nvidia/cuda:11.7.1-devel-centos7:Docker 镜像的名称和标签:指定要使用的 Docker 镜像。在这个例子中,使用了 NVIDIA 提供的 CUDA 11.7.1 开发环境镜像,基于 CentOS 7。
  • /bin/bash:容器启动时执行的命令:启动一个 bash shell,使你可以在容器内进行交互式操作。

将测试样例cp到容器中

docker cp /home/cuda-samples-11.6 faa9d887f1ee:/home/

封装镜像

docker commit -a "jsd" -m "cuda:12.5.1 with cuda-samples-12.5" 2316bf9e3674  nvidia/cuda/12.5.1-cudnn-devel-ubuntu20.04/cudasamples:v1.0

参数说明如下:

  • -a "jsd"-a--author):指定镜像的作者信息。这里的 "jsd" 是作者名。
  • -m "cuda:12.5.1 with cuda-samples-12.5":​-m​(--message):为镜像提交添加注释。这条信息描述了你对容器所做的修改或镜像的用途。在这个例子中,注释为 "cuda:12.5.1 with cuda-samples-12.5",表明这个镜像包含了 CUDA 12.5.1 以及 CUDA 样本代码。
  • 2316bf9e3674:容器的 ID。你想从这个容器创建新的镜像。你可以通过 docker ps -a 命令获取容器 ID。

登陆仓库

docker login --username=<yourID> <提供镜像服务的网址>
​
<password>

修改镜像tag

docker tag <本地镜像ID> <你的镜像仓库地址>
例如:
docker tag 391718087e05 ***.com/jsd/cuda-with-samples:v1.0

推送镜像

docker push 镜像仓库的地址/仓库用户名/仓库名称:镜像标签
例如:
docker push ***.com/jsd/cuda-with-samples:v1.0

Docker镜像的修改

上节讨论了Docker镜像的制作方法以及如何将其推送至镜像仓库。这节主要介绍如何在当前现有镜像中添加新的文件,并且将其保存为新的镜像。

这是当前镜像:

***.com/jsd/cuda-with-samples:v1.0

这是要添加的内容:

fileA.sh  fileB.sh

具体步骤如下:

  1. 创建 Dockerfile

    # 使用现有的镜像作为基础镜像
    FROM ***.com/jsd/cuda-with-samples:v1.0
    ​
    # 将本地文件复制到镜像中的指定目录
    # 确保路径和文件名正确
    COPY check_executables.sh  cuda_samples_manager.sh  run_make_in_samples.sh /home/cuda-samples-12.5/
    
  2. 构建镜像:在包含 Dockerfile 的目录下打开终端或命令提示符,使用 docker build 命令构建新的镜像。记得将 [new-tag] 替换为你想要的新标签名称。

    docker build -t ***.com/jsd/cuda-with-samples:v3.0 .
    

    注意:在命令的最后,.表示 Dockerfile 在当前目录。

  3. 推送镜像到阿里云仓库:构建完成后,使用 docker push 命令将新镜像推送到阿里云 Docker 仓库。

    docker push ***.com/jsd/cuda-with-samples:v3.0
    
  4. 验证新镜像:使用 docker images 查看本地镜像列表,确认新镜像已经创建。你也可以使用 docker pull 命令拉取新镜像到本地进行测试。

  5. 运行新镜像:使用新镜像启动容器,以验证文件是否正确添加。

    docker run -it --name [container-name] ***.com/your-repo/your-image:[新标签] /bin/bash
    

Docker常用操作

上述讲述了Docker镜像的制作和修改,下面说明docker常用的操作命令。
在使用Docker镜像的过程中,除了构建和修改镜像,还有许多其他相关操作。这些操作涵盖了镜像的管理、运行和分发等方面。以下是一些常见的与Docker镜像操作相关的命令和使用方法:

镜像管理

  1. 列出本地镜像
    列出本地的所有Docker镜像:

    docker images
    
  2. 删除镜像
    删除一个或多个镜像:

    docker rmi <image_id_or_name>
    

    如果镜像正在被使用,可以使用 -f 选项强制删除:

    docker rmi -f <image_id_or_name>
    
  3. 查看镜像详细信息

    docker inspect <image_id_or_name>
    

运行容器

  1. 运行容器
    从镜像运行一个新容器:

    docker run -it --name <container_name> <image_name> /bin/bash
    
    • -it:让容器运行在交互模式,并连接终端。
    • --name:指定容器名称。
  2. 后台运行容器
    以后台模式运行容器(守护模式):

    docker run -d --name <container_name> <image_name>
    
  3. 运行并暴露端口
    运行容器并暴露端口,使其可以被外部访问:

    docker run -d -p 8080:80 --name <container_name> <image_name>
    
    • -p 8080:80:将主机的8080端口映射到容器的80端口。

镜像分发

  1. 登录Docker Hub
    在推送和拉取镜像之前,需要先登录Docker Hub:

    docker login
    
  2. 推送镜像到Docker Hub
    将本地镜像推送到Docker Hub上:

    docker tag <local_image_name> <your_dockerhub_username>/<repository_name>:<tag>
    docker push <your_dockerhub_username>/<repository_name>:<tag>
    
  3. 从Docker Hub拉取镜像
    从Docker Hub拉取一个镜像:

    docker pull <image_name>:<tag>
    

容器管理相关操作

  1. 查看运行中的容器
    查看所有正在运行的容器:

    docker ps
    
  2. 查看所有容器(包括已停止的)

    docker ps -a
    
  3. 停止和启动容器
    停止一个正在运行的容器:

    docker stop <container_id_or_name>
    

    启动一个已停止的容器:

    docker start <container_id_or_name>
    
  4. 重启容器
    重新启动一个容器:

    docker restart <container_id_or_name>
    
  5. 删除容器
    删除一个已停止的容器:

    docker rm <container_id_or_name>
    
0条评论
0 / 1000
c****d
4文章数
0粉丝数
c****d
4 文章 | 0 粉丝
原创

如何制作一个Docker镜像(基于centos基础镜像,并添加cuda samplers测试样例)

2024-09-02 09:51:06
66
0

Docker基础

基础概念

Docker 是一个开源的容器化平台,它允许开发者和系统管理员打包、分发和运行应用程序,而无需担心底层基础设施。Docker 使用 Linux 容器(LXC)技术,但提供了一个更易用的接口和更丰富的功能集。以下是 Docker 的一些关键特性和概念:

  1. 容器(Container):容器是 Docker 的核心概念,它是一个轻量级的、可移植的、自给自足的软件运行环境。容器内包含了运行应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件。
  2. 镜像(Image):Docker 镜像是一个只读模板,包含了运行容器所需的所有内容。镜像可以被看作是容器的蓝图,它们是不可变的,这意味着一旦创建,就不能更改
  3. 仓库(Repository):Docker 仓库是一个集中存储和分发 Docker 镜像的地方。
  4. Dockerfile:Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于自动化构建 Docker 镜像的过程。通过编写 Dockerfile,你可以定义如何构建你的应用程序的镜像。

容器共享宿主机的内核,不需要像虚拟机那样模拟整个操作系统,因此启动速度快,资源占用少。总结来讲,可以把docker当作一个小型的虚拟机

运行模式

Docker 的运行模式可以分为几种主要的方式,每种模式适用于不同的使用场景。在笔者的工作之中,应用最为广泛的是交互模式和后台模式。

交互模式

交互模式允许你启动一个容器并与其进行交互,通常是为了调试或手动操作容器内的应用程序。

runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#

各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

交互模式会进入容器里面

后台模式

后台模式使容器在后台运行,不会占用你的终端。可以通过 docker ps 命令查看运行中的容器。

docker run -itd --name ubuntu-test ubuntu /bin/bash

注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec

如果需要进入容器:

docker exec -it 243c32535da7 /bin/bash

其中243c32535da7为容器ID。

Docker镜像的制作

Docker镜像的制作主要包括以下几个步骤:

拉取镜像
以某一个镜像作为基础镜像,这里选用的是以centos7操作系统作为基础镜像,该镜像包括cuda工具和cudnn包。

docker pull nvidia/cuda:11.7.1-devel-centos7

测试样例下载
下载需要的测试样例,此处以cuda samplers为例,测试样例位于github里的
/NVIDIA/cuda-samples位置。

启动容器

docker run -itd --rm --gpus all nvidia/cuda:11.7.1-devel-centos7 /bin/bash

其中的参数解释如下:

  • -it-i保持容器的标准输入流,允许你与容器进行交互; -t分配一个伪终端,使容器的终端更易于交互。
  • -d--detach:让容器在后台运行,不会占用你的终端。与 -it 配合使用时,容器会在后台运行,并且你可以通过终端访问容器。
  • --rm:自动删除容器:当容器停止时,Docker 会自动删除该容器。这个选项有助于避免容器积累,节省磁盘空间。
  • --gpus all:允许容器访问所有可用的 NVIDIA GPU。这个选项需要在 Docker 运行时和 GPU 驱动程序配置正确,以便容器能够利用 GPU 进行计算加速。
  • ​nvidia/cuda:11.7.1-devel-centos7:Docker 镜像的名称和标签:指定要使用的 Docker 镜像。在这个例子中,使用了 NVIDIA 提供的 CUDA 11.7.1 开发环境镜像,基于 CentOS 7。
  • /bin/bash:容器启动时执行的命令:启动一个 bash shell,使你可以在容器内进行交互式操作。

将测试样例cp到容器中

docker cp /home/cuda-samples-11.6 faa9d887f1ee:/home/

封装镜像

docker commit -a "jsd" -m "cuda:12.5.1 with cuda-samples-12.5" 2316bf9e3674  nvidia/cuda/12.5.1-cudnn-devel-ubuntu20.04/cudasamples:v1.0

参数说明如下:

  • -a "jsd"-a--author):指定镜像的作者信息。这里的 "jsd" 是作者名。
  • -m "cuda:12.5.1 with cuda-samples-12.5":​-m​(--message):为镜像提交添加注释。这条信息描述了你对容器所做的修改或镜像的用途。在这个例子中,注释为 "cuda:12.5.1 with cuda-samples-12.5",表明这个镜像包含了 CUDA 12.5.1 以及 CUDA 样本代码。
  • 2316bf9e3674:容器的 ID。你想从这个容器创建新的镜像。你可以通过 docker ps -a 命令获取容器 ID。

登陆仓库

docker login --username=<yourID> <提供镜像服务的网址>
​
<password>

修改镜像tag

docker tag <本地镜像ID> <你的镜像仓库地址>
例如:
docker tag 391718087e05 ***.com/jsd/cuda-with-samples:v1.0

推送镜像

docker push 镜像仓库的地址/仓库用户名/仓库名称:镜像标签
例如:
docker push ***.com/jsd/cuda-with-samples:v1.0

Docker镜像的修改

上节讨论了Docker镜像的制作方法以及如何将其推送至镜像仓库。这节主要介绍如何在当前现有镜像中添加新的文件,并且将其保存为新的镜像。

这是当前镜像:

***.com/jsd/cuda-with-samples:v1.0

这是要添加的内容:

fileA.sh  fileB.sh

具体步骤如下:

  1. 创建 Dockerfile

    # 使用现有的镜像作为基础镜像
    FROM ***.com/jsd/cuda-with-samples:v1.0
    ​
    # 将本地文件复制到镜像中的指定目录
    # 确保路径和文件名正确
    COPY check_executables.sh  cuda_samples_manager.sh  run_make_in_samples.sh /home/cuda-samples-12.5/
    
  2. 构建镜像:在包含 Dockerfile 的目录下打开终端或命令提示符,使用 docker build 命令构建新的镜像。记得将 [new-tag] 替换为你想要的新标签名称。

    docker build -t ***.com/jsd/cuda-with-samples:v3.0 .
    

    注意:在命令的最后,.表示 Dockerfile 在当前目录。

  3. 推送镜像到阿里云仓库:构建完成后,使用 docker push 命令将新镜像推送到阿里云 Docker 仓库。

    docker push ***.com/jsd/cuda-with-samples:v3.0
    
  4. 验证新镜像:使用 docker images 查看本地镜像列表,确认新镜像已经创建。你也可以使用 docker pull 命令拉取新镜像到本地进行测试。

  5. 运行新镜像:使用新镜像启动容器,以验证文件是否正确添加。

    docker run -it --name [container-name] ***.com/your-repo/your-image:[新标签] /bin/bash
    

Docker常用操作

上述讲述了Docker镜像的制作和修改,下面说明docker常用的操作命令。
在使用Docker镜像的过程中,除了构建和修改镜像,还有许多其他相关操作。这些操作涵盖了镜像的管理、运行和分发等方面。以下是一些常见的与Docker镜像操作相关的命令和使用方法:

镜像管理

  1. 列出本地镜像
    列出本地的所有Docker镜像:

    docker images
    
  2. 删除镜像
    删除一个或多个镜像:

    docker rmi <image_id_or_name>
    

    如果镜像正在被使用,可以使用 -f 选项强制删除:

    docker rmi -f <image_id_or_name>
    
  3. 查看镜像详细信息

    docker inspect <image_id_or_name>
    

运行容器

  1. 运行容器
    从镜像运行一个新容器:

    docker run -it --name <container_name> <image_name> /bin/bash
    
    • -it:让容器运行在交互模式,并连接终端。
    • --name:指定容器名称。
  2. 后台运行容器
    以后台模式运行容器(守护模式):

    docker run -d --name <container_name> <image_name>
    
  3. 运行并暴露端口
    运行容器并暴露端口,使其可以被外部访问:

    docker run -d -p 8080:80 --name <container_name> <image_name>
    
    • -p 8080:80:将主机的8080端口映射到容器的80端口。

镜像分发

  1. 登录Docker Hub
    在推送和拉取镜像之前,需要先登录Docker Hub:

    docker login
    
  2. 推送镜像到Docker Hub
    将本地镜像推送到Docker Hub上:

    docker tag <local_image_name> <your_dockerhub_username>/<repository_name>:<tag>
    docker push <your_dockerhub_username>/<repository_name>:<tag>
    
  3. 从Docker Hub拉取镜像
    从Docker Hub拉取一个镜像:

    docker pull <image_name>:<tag>
    

容器管理相关操作

  1. 查看运行中的容器
    查看所有正在运行的容器:

    docker ps
    
  2. 查看所有容器(包括已停止的)

    docker ps -a
    
  3. 停止和启动容器
    停止一个正在运行的容器:

    docker stop <container_id_or_name>
    

    启动一个已停止的容器:

    docker start <container_id_or_name>
    
  4. 重启容器
    重新启动一个容器:

    docker restart <container_id_or_name>
    
  5. 删除容器
    删除一个已停止的容器:

    docker rm <container_id_or_name>
    
文章来自个人专栏
操作系统jdd
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0