手机网站页面模板,WordPress用rds云数据库,德阳市网站建设,工作细胞第一季全集免费如果你有跨平台开发的需求#xff0c;或者对每次在新机器上部署项目感到头疼#xff0c;那么 Docker 是你的理想选择#xff01;Docker 通过容器化技术将应用程序与其运行环境隔离#xff0c;实现快速部署和跨平台支持#xff0c;极大地简化了开发和部署流程。本文详细介绍…如果你有跨平台开发的需求或者对每次在新机器上部署项目感到头疼那么 Docker 是你的理想选择Docker 通过容器化技术将应用程序与其运行环境隔离实现快速部署和跨平台支持极大地简化了开发和部署流程。本文详细介绍了 Docker 的核心组件、工作原理和基本操作流程并结合算法模型部署的实际应用以 CUDA 环境部署为例深入讲解了如何利用 Docker 进行模型部署和调试帮助你轻松应对复杂的开发与部署挑战。
1. Docker 简介
Docker 是一个用于开发、运输和运行应用程序的开源平台。它将应用程序与环境进行隔离实现项目的快速部署上线减少项目在环境部署上所花费的成本。
2. Docker 架构与工作流程
2.1 Docker 架构
Docker 的架构基于客户端-服务器模式主要由 Docker 客户端和 Docker 守护进程两大核心组件构成。Docker 客户端是用户与系统交互的命令行界面CLI用户通过 CLI 发送命令如构建镜像、启动容器等这些命令会被传递到 Docker 守护进程通常为 dockerd。守护进程作为 Docker 的核心组件负责管理容器的生命周期、构建镜像、分发镜像等任务并以后台进程的形式持续运行监听并处理来自客户端的请求。这种架构使得 Docker 能够高效地构建、管理和运行容器化应用为用户提供了灵活且强大的开发与部署体验。
2.2 Docker 架构的工作流程
构建镜像使用 Dockerfile 创建镜像。推送镜像到注册表将镜像上传到 Docker Hub 或私有注册表中。拉取镜像通过 docker pull 从注册表中拉取镜像。运行容器使用镜像创建并启动容器。管理容器使用 Docker 客户端命令管理正在运行的容器例如查看日志、停止容器、查看资源使用情况等。网络与存储容器之间通过 Docker 网络连接数据通过 Docker 卷或绑定挂载进行持久化。
3. Docker 的主要特点 容器化技术 隔离性Docker 使用容器技术将应用程序及其依赖打包到一个独立的环境中运行与其他容器和宿主机隔离。轻量级与虚拟机相比Docker 容器不需要完整的操作系统共享宿主机的内核因此启动速度快资源占用少。 镜像管理 镜像构建通过 Dockerfile 定义应用程序的运行环境和依赖然后构建为镜像。镜像分发镜像可以存储在本地或远程仓库如 Docker Hub方便分发和共享。 容器管理 容器生命周期管理可以创建、启动、停止、删除容器。容器编排支持使用 Docker Compose 等工具管理多个容器的部署和运行。 跨平台支持 Docker 支持多种操作系统包括 Linux、Windows 和 macOS能够确保应用程序在不同环境中的一致性。
4. Docker 的工作原理
Docker 守护进程Docker Daemon 守护进程是 Docker 的核心组件负责管理镜像、容器、网络和存储卷等资源。Docker 客户端Docker CLI 用户通过命令行工具与守护进程交互执行各种操作如拉取镜像、运行容器等。Docker 镜像镜像是只读模板包含运行容器所需的文件系统和依赖。镜像由多层组成每一层代表一次构建操作。Docker 容器容器是镜像的运行实例具有独立的文件系统、网络接口和资源限制。容器通过联合文件系统Union File System在镜像的基础上添加可读写层。Docker 仓库用于存储和分发镜像。Docker Hub 是官方的公共仓库用户也可以搭建私有仓库。
5. Docker 容器与镜像之间的关系
5.1 定义
镜像Image Docker 镜像是一个只读模板它包含了运行一个容器所需的文件系统、操作系统、应用程序及其依赖项。镜像是静态的不可修改是容器运行的基础。容器Container 容器是从镜像创建的运行实例。它是镜像的动态运行状态可以启动、停止、删除等。容器在镜像的基础上添加了可读写层用于存储运行时产生的临时数据。
5.2 关系
镜像是容器的模板容器是基于镜像创建的。镜像定义了容器的初始状态包括文件系统、操作系统环境、预安装的软件和配置等。容器是镜像的运行实例容器是镜像的动态运行版本。当启动一个容器时Docker 会在镜像的基础上添加一个可读写层用于存储容器运行时产生的临时数据。镜像的不可变性与容器的可变性镜像是不可变的一旦创建其内容不会改变。而容器是可变的用户可以在容器中安装软件、修改配置等。容器的创建依赖于镜像没有镜像容器无法被创建。用户可以通过拉取公共镜像仓库中的镜像或者使用 Dockerfile 构建自定义镜像来创建容器。容器的销毁不影响镜像删除容器后镜像仍然存在。用户可以基于同一个镜像创建多个容器每个容器都是独立的运行实例。
5.3 总结
镜像是容器的静态模板定义了容器的初始状态容器是镜像的动态运行实例具有独立的生命周期。镜像为容器提供了运行环境和基础结构而容器则在镜像的基础上实现了应用程序的运行和管理。
6. Docker 基本操作流程
6.1 创建容器
通过上面我们知道容器时基于镜像创建的因此根据本地有没有镜像创建容器的方式可以有这样三种若本地有可用镜像则可通过镜像直接创建容器若本地没有可用镜像则需先拉取镜像在通过相应操作创建容器若需要基于某个镜像自定义镜像并创建容器则需先拉取基础镜像然后定义Dockerfile文件基于基础镜像创建自定义镜像并通过相应操作创建容器。具体操作过程如下
6.1.1 直接创建容器
通过 docker run 直接创建一个容器。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONS可选参数用于配置容器的各种属性比如指定容器名称、端口映射、卷挂载等。IMAGE指定用于创建容器的镜像名称或镜像 ID。COMMAND 和 ARG可选用于在容器启动时运行的命令及其参数。
示例 从官方镜像创建一个简单的容器 docker run -d nginx指定容器名称 docker run --name my-container -d nginx端口映射 docker run -p 8080:80 -d nginx挂载卷 docker run -v /host/path:/container/path -d nginx设置环境变量 docker run -e VAR_NAMEvalue -d my-image6.1.2 通过镜像创建容器
6.1.2.1 拉取镜像
docker pull [镜像名称]:[标签]示例
docker pull nginx:latest6.1.2.2 使用镜像创建容器
docker run [选项] [镜像名称]:[标签]以下是一些常用的命令选项 -d后台运行容器。如果不加 -d容器会在前台运行直到退出。 --name为容器指定一个名称方便后续管理。 -p端口映射将容器内部的端口映射到宿主机的端口。 格式宿主机端口:容器内部端口。 -v挂载卷将宿主机的目录或文件挂载到容器内部。 格式宿主机路径:容器内部路径。 --rm容器退出时自动删除容器避免占用空间。 -e设置环境变量。 --network指定容器使用的网络。
示例
docker run -d --name my-nginx -p 8080:80 nginx:latest-d后台运行。--name my-nginx容器名称为 my-nginx。-p 8080:80将容器内部的 80 端口映射到宿主机的 8080 端口。nginx:latest使用 nginx 镜像的 latest 版本。
6.1.3 通过 Dockerfile 构建自定义镜像并创建容器 拉取基础镜像 docker pull python:3.9-slim编写 Dockerfile FROM python:3.9-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD [python, app.py]构建自定义镜像 docker build -t my-custom-python-app:v1 .基于自定义镜像创建容器 docker run -d --name my-python-container my-custom-python-app:v16.2 容器基本操作
6.2.1 启动容器
docker start [容器名称或ID]示例
docker start my-container6.2.2 进入容器
docker exec -it [容器名称或ID] /bin/bash常见命令选型说明 -it这两个参数组合起来表示以交互模式进入容器。 -i表示交互式保持 STDIN 打开。-t分配一个伪终端。 [容器名称或ID] 指定要进入的容器的名称或 ID。 /bin/bash指定在容器内部启动的命令通常是 /bin/bash 或 /bin/sh用于进入 shell。
示例
docker exec -it my-container /bin/bash6.2.3 退出容器
docker stop [容器名称或ID]示例
docker stop my-container7. 模型部署与 Docker
7.1 基于 Dockerfile 构建环境
基于Dockerfile创建虚拟开发环境的基本流程如下
# 拉取依赖镜像
docker pull nvidia/cuda:12.3.2-cudnn9-devel-ubuntu22.04
# 基于 Dockerfile 文件构建新镜像
docker build -t cuda-cudnn:12.3.2 .
# 基于镜像生成对应容器
docker run --name cuda-12.3.2 -it --gpus all cuda-cudnn:12.3.2
# 检查容器是否生成
docker ps -a
# 启动容器
docker start cuda-12.3.2
# 进入容器
docker exec -it cuda-12.3.2 /bin/bash
# 停止容器
docker stop cuda-12.3.27.2 基于 Dockerfile 构建环境并通过挂载方式实现本地开发容器环境项目
我们创建容器的目的是在容器中进行项目的开发和测试因此在上述容器创建过程的基础上还需通过挂载的方式将本地项目映射到容器中去这样就可以实现在宿主机(主机中开发)在容器中编译和测试了。具体流程如下
先在本地创建项目项目中除了项目代码外还需包括Dockerfile文件
cuda_test/
├── Dockerfile
├── print_index.cu
└── CMakeLists.txt进入到项目目录下通过docker创建项目环境。 拉取镜像 docker pull nvidia/cuda:12.3.2-cudnn9-devel-ubuntu22.04构建新镜像 docker build -t cuda-cudnn:12.3.2 .生成容器并挂载本地路径 docker run --name cuda_test -it --gpus all -v /mnt/e/Code/Cuda_test:/workspace cuda-cudnn:12.3.2 /bin/bash
通过上述操作完成了项目环境的创建然后进入宿主机进行项目开发完成编码后启动镜像进行编译。
#启动容器(若容器停止执行)
docker start cuda_test
#进入容器
docker exec -it cuda_test /bin/bash
#进行编译
ls
mkdir build cd build
cmake ..
make
./you_project
7.3 挂载到容器的项目在容器中进行 Debug
我们在开发的过程中还需要deubg代码下面是通过vscode配置deocker容器debug的过程。 创建可进行 Debug 的容器 docker run --name cuda_test -it --gpus all --cap-addSYS_PTRACE --security-opt seccompunconfined -v /mnt/e/Code/Cuda_test:/workspace cuda-cudnn:12.3.2 /bin/bash在本地项目中创建 VSCode 的 launch.json 文件 {version: 0.2.0,configurations: [{name: Docker_debug,type: cppdbg,request: launch,program: /workspace/you_path, //可执行文件路径args: [],stopAtEntry: false,cwd: /workspace/you_path, //命令行路径environment: [],externalConsole: false,sourceFileMap: {/workspace/you_path: ${workspaceFolder}/you_path //源码在容器中和工作空间的路径对应关系},pipeTransport: {pipeProgram: docker,pipeArgs: [exec,-i,container_name, //容器名称/usr/bin/gdb,--interpretermi],debuggerPath: /usr/bin/gdb,pipeCwd: ${workspaceFolder}},MIMode: gdb,setupCommands: [{description: Enable pretty-printing for gdb,text: -enable-pretty-printing,ignoreFailures: true}]}]
}配置好launch.json文件后即可在vscode中进行debug。
8. 参考资料
Docker部署深度学习模型 - ZeroZeroSeven - 博客园轻松构建Qt应用与Docker容器完美结合的界面攻略 - 云原生实践从零开始使用vs code连接Linux系统下的docker容器_vscode连接容器的方法-CSDN博客手把手教你在windows上用docker和vscode配置环境 - MiniOB多种方法VSCode调试docker容器里的程序_vscode docker-CSDN博客