创建docker镜像。首先要有一个linux环境,然后在这个环境下部署项目,然后做docker镜像。
然后查阅发现,windows装linux环境,可以通过 hyper-v, 或者 wsl 等方式。
但是我的电脑版本低,不支持上述方式。
我又尝试 vmware 方式。
下载了一个 vmware Player 版本软件。 刚开始装 ubuntu,发现任务需要国产化,改装 kylin-v10。
按照这个教程走:
其中虚拟机配IP时,按照这个做:
IPADDR=172.20.48.40 #静态IP地址 这个先ping一下,看是否有占用 NETMASK=255.255.255.0 #掩码 GATEWAY=172.20.48.254 #网关 DNS1=8.8.8.8 #备选DNS
注意: kylin系统处理器架构版本 是 x86_64,还是 aarch64,后面下载docker要按照系统下载对应版本
最后我装完了虚拟机之后,按照这篇教程安装docker:
最后配docker vpn镜像的时候,参考这篇文章:
但是,我最终败在笔记本性能上,我的笔记本跑虚拟机太卡,执行docker构建镜像卡住不动。
最后我换了一种方案: 用公司给我的云主机资源,安装对应的docker,然后构建镜像和容器。
先查看 linux 系统版本
uname -a
cat /etc/kylin-release
下载docker
docker下载地址:
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/aarch64/docker-28.1.1.tgz
解压与权限配置
tar -zxvf docker-19.03.15.tgz
\cp -rf docker/* /usr/bin/ # 强制覆盖避免权限残留
chmod +x /usr/bin/dockerd /usr/bin/docker
后续步骤按照上面的教程走。
docker 安装完了,可以测试:
docker version
或
docker info
然后开始部署 python 项目
我的项目,想做成离线安装包,用requirements.txt 将库资源都下载下来,按照 linux版本,使用如下命令:
pip download -r requirements.txt --platform manylinux2014_x86_64 --python-version 3.12 --only-binary=:all: -d packages/
或者
pip download -r requirements.txt --platform manylinux2014_aarch64 --python-version 3.12 --only-binary=:all: -d packages/
构建镜像
执行 镜像 构建 命令
docker build -t non-jurisdiction-classifier .
但是在执行 Dockerfile 中 RUN pip install ... 命令时,报错:
failed to create task for container: failed to create shim task: OCI runtime create failed: container_linux.go:318: starting container process caused "permission denied": unknown
网上查找,有说时 Podman 冲突的,我又把 Podman 卸载了
后来,我安装了 docke buildx
升级了 runc 下载最新 runc (ARM64 版本)
#!/bin/bash
# 升级 runc 到 1.2.6 脚本
# 创建临时目录
WORKDIR=~/runc-upgrade-$(date +%s)
mkdir -p $WORKDIR
cd $WORKDIR
echo "下载 runc 1.2.6 for ARM64..."
wget -q https://github.com/opencontainers/runc/releases/download/v1.2.6/runc.arm64
mv runc.arm64 runc
chmod +x runc
echo "备份当前 runc..."
RUNC_PATH=$(which runc)
sudo cp $RUNC_PATH ${RUNC_PATH}.bak-$(date +%Y%m%d)
echo "安装新版 runc..."
sudo cp runc $RUNC_PATH
echo "配置 Docker..."
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"runtimes": {
"runc": {
"path": "/usr/bin/runc"
}
},
"default-runtime": "runc"
}
EOF
echo "重启 Docker 服务..."
sudo systemctl restart docker
echo "验证安装:"
runc --version
docker info | grep -i runtime
echo "清理临时文件..."
cd ..
rm -rf $WORKDIR
echo "升级完成!"
创建并编辑脚本文件
sudo nano upgrade_runc.sh
按 Ctrl+O 保存文件,然后按 Ctrl+X 退出编辑器。
赋予脚本执行权限
sudo chmod +x upgrade_runc.sh
执行升级脚本
sudo ./upgrade_runc.sh
验证升级是否成功
检查 runc 版本:
runc --version
输出应为:runc version 1.2.6
配置完 查看 docker info 报错如下:
配置完 /etc/docker/daemon.json文件后,执行docker info,输出信息如下:
[root@lxl-tbj non_jurisdiction]# docker info
Client:
Version: 28.1.1
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.11.2
Path: /root/.docker/cli-plugins/docker-buildx
Server:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
发现是 daemon.json 文件出错,
临时移除配置文件
sudo mv /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo systemctl restart docker
执行 镜像构建命令还报错:
ERROR: failed to solve: process "/bin/sh -c pip install --no-index --find-links=./packages/ -r requirements.txt" did not complete successfully: exit code: 1
最后,我放弃了下载离线库资源 改为在线安装:
RUN pip install -r requirements.txt
问题解决了!
接下来 走正常流程,构建镜像,容器。
查看当前所有容器
docker ps -a
删除所有已停止的容器(包括 Created 状态)
docker container prune
清理所有未使用的容器、镜像和网络 慎用,会清理镜像
docker system prune -a
sudo systemctl restart docker
查看所有悬空镜像
docker images -f "dangling=true"
删除悬空镜像:
docker image prune # 删除所有悬空镜像
或
docker rmi a1b2c3d4e5f6 # 删除特定旧镜像
导出镜像
docker save -o non-jurisdiction-classifier.tar non-jurisdiction-classifier:latest
或者使用镜像 ID:
docker save -o non-jurisdiction-classifier.tar ca9f2389b58b
验证导出的文件
ls -lh non-jurisdiction-classifier.tar
输出示例:
-rw-r--r-- 1 root root 2.4G Jul 3 10:30 non-jurisdiction-classifier.tar
压缩镜像文件
gzip non-jurisdiction-classifier.tar
这会生成 non-jurisdiction-classifier.tar.gz 文件
在其他机器导入镜像
对于未压缩的文件:
docker load -i non-jurisdiction-classifier.tar
对于压缩的文件:
gunzip -c non-jurisdiction-classifier.tar.gz | docker load
验证导入的镜像
docker images
执行容器
docker run -it --rm \
-v $(pwd)/data:/app/data \
-v $(pwd)/models:/app/models \
-e OMP_NUM_THREADS=1 \
-e KMP_DISABLE=1 \
non-jurisdiction-classifier --version