docker应用实例及dockerfile

实际应用

神经网络项目由x86cpu的linux环境移到arm cpu架构上运行,使用docker进行测试以及环境配置。

  • docker load -i 镜像压缩文件.tar
    • docker load -i命令用于从一个压缩的镜像存档文件(通常是以.tar扩展名结尾)中加载镜像到本地Docker引擎中。
    • docker load:加载一个本地的镜像。
    • -i:指定输入文件,后面跟着要加载的镜像存档文件。
  • docker images 查看镜像
  • docker run --name 容器名 -it -e ASCEND_VISIBLE_DEVICES=0 -p 1234:5678 镜像id /bin/bash
    • docker run:运行一个新的容器。
    • -it:使用交互式终端运行容器,其中-i表示交互式,-t表示分配一个伪终端。
    • -e ASCEND_VISIBLE_DEVICES=0。环境变量选择使用哪个NPU卡
    • -p 1234:5678:端口映射,容器内部端口与宿主机端口进行映射
    • /bin/bash:进入到容器的bash终端
  • docker rename 原名称 现名称
  • docker cp :
  • docker ps
    • 查看正在运行的容器
  • docker ps -a
    • 查看所有容器
  • docker start 容器名
  • dockers stop 容器名
  • docker rm 容器名
  • docker exec -it
    • 是要进入的容器的名称或ID。
    • 是要在容器内执行的命令。通常,我们使用/bin/bash或/bin/sh作为命令,以启动一个交互式Shell会话。

在Docker容器中安装NPU驱动固件(宿主机装了,docker可以不装)

  • 在宿主机上已经安装了相应的NPU驱动和固件。
  • 容器在创建时,需要与宿主机共享NPU设备。
    • docker run --privileged -it -v /dev:/dev bash
    • --privileged参数来赋予容器特权,使其能够访问宿主机的设备。同时,使用-v /dev:/dev参数来共享宿主机的/dev目录,包括其中的设备文件。

ChatGLM部署华为arm服务器

  • 安装toolkit工具包
  • 容器内没安装NPU驱动固件,所以需要到.bashrc中配置环境变量
    • 环境变量要加export xxx=xxxx
  • 安装torch依赖
  • 解压代码包
  • 创建模型权重软链接
  • 替换transformers的utils.py文件(可以先不做)
  • 权重切分与执行

Docker架构

镜像(三类)

  • 基础镜像

Ubuntu、Debian、CentOs、Windows、MacOs

  • docker commit构建镜像

Docker commit 是将正在运行的容器保存为新的镜像的一种方法。将当前容器的状态快照成一个新的镜像。优点快速和方便,缺点占用空间大、冗余、效率低、可重复性弱、容易出错。

  • 从镜像运行容器,实际上是在镜像顶部上加了一层可写层,所有对容器文件系统的修改,都在这一层中进行,不影响已经存在的层。从容器构建镜像,实际上是把容器的顶层固化到镜像中。镜像的体积只会增大,不会减小。
# 将容器转换为镜像
docker commit 容器id 镜像名称:版本号
# 将镜像打包为压缩包,用于传输
docker save -o image_name.tar image_name
# 将镜像压缩包解压为镜像
docker load -i image_name.tar
  • dockerfile构建镜像

Dockerfile 是一种文本文件,它包含了一系列指令和配置,用于自动化构建 Docker 镜像。优点灵活性和可重复性。比docker commit更具优势。

  • 可重复性:使用 Dockerfile 可以完全复制镜像构建过程,确保每次构建的结果一致。
  • 可扩展性:Dockerfile 允许您定义容器的多个层次,并在每个层次上进行构建和修改。轻松地添加、删除或更新组件。
  • 可维护性:Dockerfile 是一个文本文件,可以与代码存储在同一版本控制系统中,并且可以通过版本控制工具进行追踪和管理。这使得团队成员可以共同协作和维护镜像构建过程。

容器

仓库

仓库可看成一个代码控制中心,用来保存镜像 Docker Hub(https://hub.docker.com)

dockerfile

FROM acltransformer:base  # ubuntu:18.04 指定父镜像,指定dockerfile基于哪个镜像进行创建以华为昇腾172.16.15服务器为例

RUN apt-get update && apt-get install -y \  # 执行命令
    wget \
    language-pack-zh-hans && \
    mkdir /data
    
WORKDIR /data  # 工作目录
COPY Dockerfile_dir ./Dockerfile_dir  # 复制文件 这是个文件夹

WORKDIR /data/Dockerfile_dir/npu_tools
RUN /bin/bash Miniconda3-latest-Linux-aarch64.sh -b -p /opt/conda && \
    echo 'export PATH="/opt/conda/bin:$PATH"' >> ~/.bashrc && \
    
RUN conda create -n py37 python=3.7
ENV PATH /opt/conda/envs/chatglm_py37/bin:$PATH  # 环境变量

RUN /bin/bash npu_env.sh && \
    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

ENTRYPOINT ["/bin/bash",  "-c", "/opt/conda/envs/py37/bin/python3.7 main.py"] # 设置容器的入口点

在编写 Dockerfile 时,通常会遵循一个原则:尽可能使步骤少而有效。

  • 减小镜像大小:每个步骤都会在镜像中创建一个新的层次,并增加镜像的大小。较少的步骤意味着较少的层次,从而减小了镜像的总体大小。
  • 提高构建速度:每个步骤都需要执行一些操作,较少的步骤意味着较少的操作,从而减少了构建过程的时间。
  • 简化维护和调试:较少的步骤意味着较少的代码和配置,使得维护和调试变得更加简单。

使用下面命令来用dockerfile创建docker镜像。

docker build -t chatglm_npu:v2 -f Dockerfile .
docker build --platform linux/arm64/v8 -t chatglm_npu:v1 -f Dockerfile .
docker build --platform linux/amd64 -t dispatch:v1 -f Dockerfile .

你可能感兴趣的:(docker,容器)