0%

docker应用笔记

将服务器上的项目迁移到windows上并打包为docker镜像

Docker应用笔记

前言

暑期比赛的验收阶段要求将训练和推理环境打包为Docker,借此初步了解了Docker打包的全流程.需要注意的是云服务器或实验室服务器集群的实例本身就已经是某种形式的docker了,所以无法直接打包服务器中的代码项目.如果需要打包服务器上的代码,当前比较直接的折中办法是整理好项目的环境依赖,通过conda导出为environment.yml文件(或requirements.txt),将核心代码下载至本地windows环境,并在windows下进行docker的打包.后续的介绍内容均面向windows环境.

Docker是开源的操作系统虚拟化技术,通过对进程进行封装并与宿主和其他进程之间进行隔离来提高程序的分发和部署效率,被封装的对象被称为容器.相较于传统的虚拟机技术,Docker响应速度更快,对系统资源的调度更高效.同时提供除内核外的完整运行时环境也保证了运行环境之间的一致性.

在windows环境下,使用Docker主要通过Docker Desktop软件结合WSL,后者为windows提供linux的内核支持.

准备工作

首先下载Docker DesktopWSL.现在完成后先检查CUP虚拟化是否已开启.通过任务管理器性能中的CPU部分即可查看,一般会默认开启.

20250903205031

然后还需要开启Hyper-v,Hyper-v是微软开发的虚拟化技术,允许在单一物理机上运行多个虚拟机,在Docker Desktop中被用来创建和管理轻量化虚拟机支持,是Docker在windows上运行的关键组件.在控制面版中打开程序,在启动或关闭windows功能部分可以用来管理Hyper-v.

20250903205837

20250903210018

如果没有对应选型,可以在创建Hyper-V.bat文件,直接写入以下脚本内容后运行.该脚本会遍历系统目录中所有包含Hyper-V名称的.mum文件,保存到临时的txt文件后用dism命令将找到的相关包加入到系统中,即实现Hyper-V的自动安装和启用.

1
2
3
4
5
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

完成上述准备工作,安装好Docker Desktop还需要修改存储路径(默认为C盘),避免由于存储空间不足导致的镜像保存失败.至此,windows环境下的docker准备工作均已完成.

20250904184335

将项目代码打包为镜像

Dockerfile与.dockerignore

由于服务器上的conda环境无法直接下载到windows当中,所以需要先导出项目的依赖环境,然后在创建镜像时在Dockerfile中加入环境创建的步骤.conda的环境导出命令如下.

1
2
conda activate your_env_name
conda env export --no-builds > environment.yml

该命令会生成一个environment.yml文件,记录当前环境依赖,同时不包含平台相关的build bash.接着需要构建一个Dockerfile文件,基于miniconda的基础镜像进行环境配置,以本次比赛项目为例,Dockerfile文件内容如下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 使用 miniconda 基础镜像(内置 conda,比自己安装方便)
FROM continuumio/miniconda3:latest
# 2. 设置国内源(换 apt 源)
RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free" > /etc/apt/sources.list \
&& echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list \
&& echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
git \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 3. 设置工作目录
WORKDIR /app
# 4. 复制 conda 环境文件
COPY environment.yml .
# 5. 创建 conda 环境
RUN conda env create -f environment.yml
# 6. 激活环境 (添加到 PATH)
# 注意:这里要和 environment.yml 里的 name 对应,比如 your_env_name
ENV PATH /opt/conda/envs/your_env_name/bin:$PATH
# 7. 复制项目代码
COPY . .
# 8. 默认运行脚本
CMD ["python", "select2.py"]

如果选择基于requirements.txt构建环境,则需要依赖python-slim的轻量化镜像,对应版本的Dockerfile内容如下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 使用官方 Python slim 镜像
FROM python:3.10-slim
# 2. 设置国内源并安装系统依赖
RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free" > /etc/apt/sources.list \
&& echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian-security trixie-security main contrib non-free" >> /etc/apt/sources.list \
&& echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
git \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 3. 设置工作目录
WORKDIR /app
# 4. 复制依赖文件
COPY requirements.txt .
# 5. 升级 pip 并安装 Python 依赖
RUN pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt
# 6. 复制项目代码(不包括大数据)
COPY . .
# 7. 默认运行脚本
CMD ["python", "select2.py"]

如果在windows上拉取的项目文件中仍然存在不希望打包到镜像中的冗余部分,可以类比git使用.dockerignore进行管理,写入希望掠过的文件或文件夹的相对路径即可.

打包docker镜像

在windows的命令行中(Docker Desktop自带)定位到项目文件夹,运行docker build命令即可构建镜像.

1
docker build -t img-name:latest .

-t用以给镜像命名,latest是镜像的标签,用来标记不同的版本..会令docker在当前目录下查找Dockerfile和其他需要复制的文件.镜像创建成功后并不会有显式的存储路径,需要通过docker命令查看所有的本地镜像,命令如下.
1
docker images

测试镜像

测试镜像使用docker run命令.

1
docker run -it --name container-name img-name:latest

其中的-it参数用于创建一个交互模型的运行容器并分配伪终端,--name参数用于指定运行容器的名称.在Docker中镜像(image)只是一个静态的只读模板,包含运行程序需要的所有内容;而容器(container)则是镜像的运行实例,支持启动,停止删除等操作.在通过run运行docker后,可以通过exit退出,容器状态变为停止,但不会立刻结束.当需要彻底清除容器时,需要单独删除,可以通过命令行后Docker Desktop的可视化交互.
1
2
3
4
5
6
# 查看存在的所有容器
docker ps -a
# 删除指定容器
docker rm container-name
# 删除所有已停止的容器
docker container prune

导出可分发文件

docker镜像需要压缩为.tar文件才能被后续分发,对应的导出命令为:

1
docker save -o file-name.tar img-name:latest

恢复镜像的命令为:
1
docker load -i file-name.tar

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#查看docker安装
docker ps 或者 ps -ef | grep docker

#查看docker服务:
systemctl status docke

#设置开启docker服务:
systemctl enable docker

#启动docker服务:
systemctl start docker

#查看mysql镜像
docker search mysql

#进入容器:
docker exec -it xxx bash

总结

第一次跑通docker的全流程,在无法直接打包云服务器项目的背景下很难说有多么的简单好用.