docker笔记

15 阅读2分钟

创建docker镜像。首先要有一个linux环境,然后在这个环境下部署项目,然后做docker镜像。

然后查阅发现,windows装linux环境,可以通过 hyper-v, 或者 wsl 等方式。

但是我的电脑版本低,不支持上述方式。

我又尝试 vmware 方式。

下载了一个 vmware Player 版本软件。 刚开始装 ubuntu,发现任务需要国产化,改装 kylin-v10。

按照这个教程走:

vmware安装银河麒麟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:

银河麒麟V10服务器版离线安装docker

最后配docker vpn镜像的时候,参考这篇文章:

在银河麒麟ARM环境下离线安装docker

但是,我最终败在笔记本性能上,我的笔记本跑虚拟机太卡,执行docker构建镜像卡住不动。

最后我换了一种方案: 用公司给我的云主机资源,安装对应的docker,然后构建镜像和容器。

先查看 linux 系统版本

uname -a

cat /etc/kylin-release

下载docker

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