docker基础知识与具体实践
目录
- 一、一些基本概念
- 二、一些基本操作
- 1、docker的安装、卸载、查看版本基本操作
- 2、Dockerfile
- 3、Image
- 3.1 基于Dockerfile创建镜像
- 3.2 拉取镜像
- 3.3 查看现有镜像
- 4、Container
- 4.1 docker run语法
- 4.2 一个简单的示例
- 五、参考链接
一、一些基本概念
- Dockerfile:
- 一个纯文本文件,里面包含了一系列的指令和参数。这些指令按顺序描述了如何组装一个镜像;
- 定义了镜像构建过程。它指定了基础环境(比如从哪个基础镜像开始)、复制文件、安装依赖、设置环境变量、暴露端口、配置启动命令等;
- docker build命令操作Dockerfile,构建镜像。
- 镜像(image):
- 一个只读的模板,包含了运行一个应用程序所需的一切:代码、运行时环境、库、环境变量和配置文件;
- 镜像是静态的、分层的,每一层都对应Dockerfile中的一条指令;
- docker run命令操作镜像,启动容器。
- 容器(container):
- 镜像的一个运行实例。当使用docker run命令时,Docker会从镜像创建一个可写的容器层,并在其中运行应用程序;
- 真正运行应用程序的隔离环境。
二、一些基本操作
1、docker的安装、卸载、查看版本基本操作
详见:docker学习记录及部署pytorch模型
2、Dockerfile
一个简单的示例:
# Use the Ubuntu 22.04 image with CANN 8.0.rc1
FROM ascendai/cann:8.0.0-910b-ubuntu22.04-py3.10 # name:tag,可以是本地镜像,如果在本地已有镜像中没有找到才会下载# Set the working directory
WORKDIR /app# Install the requirements
COPY requirements.txt /app
RUN python -m pip install --upgrade pip && \python -m pip install -r requirements.txt# Copy the rest of the application into the image
COPY . /app# Expose port 7860 for the LLaMA Board
ENV GRADIO_SERVER_PORT 7860
EXPOSE 7860# Expose port 8000 for the API service
ENV API_PORT 8000
EXPOSE 8000# 指定默认的启动命令(非必须的):python3 app.py;
# 在启动容器的时候也可以指定其他的命令进行替换,比如/bin/bash,会启动一个 bash shell,让你进入容器内部进行操作
CMD ["python3", "app.py"]
常用命令说明:
指令 | 用途 | 示例 |
---|---|---|
FROM | 必须的第一条指令,指定基础镜像 | FROM python:3.9-slim |
LABLE | 为镜像添加元数据(如维护者、版本) | LABEL version=“1.0” |
WORKDIR | 设置后续指令的工作目录(相当于 cd,如果目录不存在会自动创建) | WORKDIR /app |
RUN | 执行命令并创建新的镜像层,常用于安装软件包(建议将多个 RUN 命令用 && 和 \ 连接成一个,以减少镜像的层数) | 示例见完成Dockerfile示例 |
COPY | 从构建上下文中复制本地文件/目录到镜像 | COPY ./app /code/app |
ADD | 类似 COPY,但支持 URL 和自动解压 tar 包(慎用) | ADD https://example.com/file.tar.gz /tmp/ |
VOLUME | 在镜像中创建一个挂载点。当容器从该镜像启动时,Docker 会自动在主机上创建一个匿名目录并将其挂载到容器内。容器内该路径原有的任何数据都会被复制到卷(类似于容器外挂的移动硬盘)中,但此后对该路径的读写操作都直接发生在卷上。(慎用) | VOLUME [ “/root/.cache/huggingface”, “/root/.cache/modelscope”, “/app/data”, “/app/output” ] |
ENV | 设置环境变量 | ENV FLASK_APP=app.py |
ARG | 定义构建镜像时的变量,其值在构建镜像时通过docker build --build-arg varname=value传递,仅在构建期有效,运行期容器中不存在 | ARG varname= [default value] |
EXPOSE | 声明容器运行时监听的端口(只是一个文档说明,并不会自动映射端口);实际的端口映射需要在docker run时使用-p参数来完成 | EXPOSE 8080 |
CMD | 指定容器启动时默认执行的命令 | CMD [“python”, “app.py”] |
ENTRYPOINT | 指定容器启动时运行的主要命令,可与 CMD 搭配 | ENTRYPOINT [“nginx”] |
3、Image
3.1 基于Dockerfile创建镜像
docker build \-f Dockerfile_path \ # 指定使用的 Dockerfile,值为Dockerfile所在的路径-t name:tag \ # 给镜像打标签,不指定tag则默认为latest (可以打多个标签)--build-arg NODE_ENV=production \ # 传递构建参数. # 构建上下文为当前目录
3.2 拉取镜像
docker pull
root@localhost:/home/wzb# docker pull swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/mindie:310p3-ascend_24.1.rc2-cann_8.0.rc2-py_3.10-ubuntu_22.04-aarch64-mindie_1.0.RC2.02
310p3-ascend_24.1.rc2-cann_8.0.rc2-py_3.10-ubuntu_22.04-aarch64-mindie_1.0.RC2.02: Pulling from wh-aicc-fae/mindie
47ebf8c90525: Pull complete
6759517a3288: Pull complete
Digest: sha256:ff768348028e35981f63e689949a6c5692abc891c391c7033d97eaac17f8270f
Status: Downloaded newer image for swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/mindie:310p3-ascend_24.1.rc2-cann_8.0.rc2-py_3.10-ubuntu_22.04-aarch64-mindie_1.0.RC2.02
swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/mindie:310p3-ascend_24.1.rc2-cann_8.0.rc2-py_3.10-ubuntu_22.04-aarch64-mindie_1.0.RC2.02
3.3 查看现有镜像
docker images
root@localhost:/home/wzb# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.nju.edu.cn/ascend/vllm-ascend main-310p f4631451eb96 6 weeks ago 16GB
swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/mindie 310p3-ascend_24.1.rc2-cann_8.0.rc2-py_3.10-ubuntu_22.04-aarch64-mindie_1.0.RC2.02 fc5bc00a9bc3 13 months ago 12.9GB
4、Container
4.1 docker run语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- OPTIONS 用于配置容器运行方式的选项;
- IMAGE 为要启动的容器使用的镜像;
- COMMAND 定义了启动容器时的执行命令,会替代Dockerfile中的CMD执行命令;
- ARG 是传递给COMMAND命令的参数。
常用的一些OPTIONS选项:
选项 | 作用 | 示例 |
---|---|---|
-d | 在后台运行容器并打印容器ID | |
-it | 交互模式运行容器(-i 保持标准输入打开,-t 分配一个伪终端) | |
--rm | 容器退出时自动删除容器 | |
-p | 将容器的端口发布到主机的端口 | |
-v | 全称volume,挂载宿主机目录或数据卷到容器 (-v <宿主机路径>:<容器内路径>[:选项]) | -v /cqf/models/Qwen/Qwen2.5-14B-Instruct:/cqf/models/Qwen/Qwen2.5-14B-Instruct:ro # 挂载模型路径,:ro是为该挂载路径添加只读选项 |
--mount | 更现代的挂载方式,提供更多选项。 | --mount type=<类型>,source=<源>,target=<目标>[,<其他选项>] 类型包括:bind、volume、tmpfs; 源:对于 volume 是卷名,对于 bind 是主机路径; 目标:容器内的挂载目标路径 |
--device | 将宿主机上的设备映射到容器内,使容器可以直接访问该设备 (访问非NVIDIA设备,如昇腾) | (将宿主的昇腾NPU设备davinci0、davinci1映射到容器中)-- device /dev/davinci0 \ --device /dev/davinci1 |
--gpus | 指定容器可以使用GPU设备(NVIDIA GPU专用,能够) | -- gpus all--gpus 2 -- gpus ‘“device=0,2”’ |
4.2 一个简单的示例
root@localhost:/home/wzb# docker run --rm \--name vllm-ascend \--device /dev/davinci0 \--device /dev/davinci1 \--device /dev/davinci2 \--device /dev/davinci3 \ # 需要根据自己设备数量情况指定--device /dev/davinci_manager \--device /dev/devmm_svm \--device /dev/hisi_hdc \-v /usr/local/dcmi:/usr/local/dcmi \-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \-v /etc/ascend_install.info:/etc/ascend_install.info \-v /home/wzb/cqf/models/Qwen/Qwen2___5-14B-Instruct:/home/wzb/cqf/models/Qwen/Qwen2___5-14B-Instruct:ro \ # 需要替换成自己的模型路径,:ro是为该挂载路径添加只读选项-p 8000:8000 \-it quay.nju.edu.cn/ascend/vllm-ascend:main-310p bash # 需要替换成自己的镜像源
root@885d19188d9b:/workspace#
五、参考链接
docker镜像仓库:
- https://hub.docker.com/
- 国内的可用:
- https://docker.xuanyuan.me/
NPU docker镜像:https://hub.docker.com/r/ascendai/cann/tags
昇腾镜像仓库官网:https://www.hiascend.com/developer/ascendhub