容器化落地避坑:从镜像源、构建缓存到清理策略的实战记录

举报
yd_272090659 发表于 2026/10/17 13:16:42 2026/10/17
【摘要】 在国产化操作系统上部署 Docker,最容易卡住的往往不是 Docker 本身,而是镜像拉取、构建缓存和资源清理这三件事。本文记录一次完整的落地过程,包含可复用的命令与配置。

背景

最近在一台 Huawei Cloud EulerOS 2.0 的云服务器上从零部署 Docker,并把一个内部服务容器化。整个过程踩了几个很典型的坑,记录一下,给同样在国产化环境里落地的同学省点时间。

坑一:默认镜像源拉不动

装完 docker-engine 后执行 docker pull hello-world,直接超时:

Error response from daemon: Get "https://registry-1.docker.io/v2/":
net/http: request canceled while waiting for connection
(Client.Timeout exceeded while awaiting headers)

国内环境访问 Docker Hub 基本不可用,需要配镜像加速。编辑 /etc/docker/daemon.json:

{
  "registry-mirrors": [
    "https://swr.cn-north-4.myhuaweicloud.com",
    "https://docker.m.daocloud.io"
  ]
}

然后重载配置:

systemctl daemon-reload
systemctl restart docker
docker info | grep -A3 'Registry Mirrors'

配完之后 hello-world 和 busybox 都能正常拉取。需要注意 SWR 镜像站对部分公共镜像返回 404,实际生效的是第二个源,所以建议至少配两个镜像源做兜底。

坑二:构建上下文过大导致构建变慢

第一次 docker build 时把整个项目目录当上下文发给了 daemon,包含 node_modules 和日志目录,上下文接近 800MB,构建卡了几分钟。

解决方式是加 .dockerignore:

node_modules
.git
*.log
dist
coverage
.DS_Store
*.tar.gz

加上之后上下文降到 2MB 左右,构建时间从几分钟降到十几秒。这个文件建议在项目初始化时就建好,而不是等构建慢了才回头补。

坑三:镜像和容器堆积无人清理

反复构建和调试几天后,docker images 列出了几十个 dangling 镜像,磁盘占用涨到几十 GB。常用清理命令:

# 删除所有悬空镜像
docker image prune -f

# 删除已停止的容器
docker container prune -f

# 清理未被使用的网络
docker network prune -f

# 一次性清理镜像、容器、网络、构建缓存(慎用)
docker system prune -a -f

# 查看当前占用
docker system df -v

建议把 docker system df 加进日常巡检,或者在 CI 里每周跑一次 docker image prune -f。

一个可复用的 Dockerfile 骨架

FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

# 先拷依赖描述文件,利用层缓存
COPY pom.xml .
RUN mvn dependency:go-offline -B || true

# 再拷源码构建
COPY src ./src
RUN mvn package -DskipTests -B

ENV TZ=Asia/Shanghai
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/target/app.jar"]

关键点是"先拷依赖描述、再拷源码",这样只要 pom.xml 没变,依赖下载这一层就能命中缓存,改业务代码不会重复下载依赖。

容器运维常用命令速查

# 后台运行并挂载配置
docker run -d --name svc   -p 8080:8080   -v /opt/svc/conf:/app/conf:ro   --restart unless-stopped   my-service:v1

# 查看日志(跟随,最近 200 行)
docker logs -f --tail 200 svc

# 进入容器排查
docker exec -it svc /bin/sh

# 查看资源占用
docker stats --no-stream

# 导出/导入镜像(离线环境迁移)
docker save my-service:v1 | gzip > svc-v1.tar.gz
docker load < svc-v1.tar.gz

小结

在国产化环境里用 Docker,技术本身不是难点,难的是网络环境和运维习惯。镜像源要配兜底、构建上下文要瘦身、镜像要定期清理,这三件事做好,容器化落地基本就顺了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。