Docker 容器化部署指南:从 Dockerfile 到生产编排

举报
yd_212140359 发表于 2026/10/31 22:30:34 2026/10/31
【摘要】 Docker 容器化部署指南:从 Dockerfile 到生产编排 前言"在我机器上是好的"这句话,Docker 用一个镜像就能终结。本文覆盖从写第一个 Dockerfile 到生产环境编排的完整链路。 一、核心概念一分钟镜像(Image):只读的打包产物,类似"类";容器(Container):镜像的运行实例,类似"对象";Dockerfile:描述如何构建镜像的脚本;Volume / ...

Docker 容器化部署指南:从 Dockerfile 到生产编排

前言

"在我机器上是好的"这句话,Docker 用一个镜像就能终结。本文覆盖从写第一个 Dockerfile 到生产环境编排的完整链路。

一、核心概念一分钟

  • 镜像(Image):只读的打包产物,类似"类";
  • 容器(Container):镜像的运行实例,类似"对象";
  • Dockerfile:描述如何构建镜像的脚本;
  • Volume / 网络:解决数据持久化和服务互访。

二、写一个合格的 Dockerfile

以 Node 后端服务为例,反例先行:

# ❌ 常见反面教材
FROM node:latest
COPY . /app
WORKDIR /app
RUN npm install
CMD ["node", "server.js"]

问题:用 latest(构建不可复现)、整个目录拷入(带上了 node_modules 和 .env)、没有分层缓存、单阶段镜像巨大。

正确写法(多阶段构建):

# ---- 构建阶段 ----
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# ---- 运行阶段 ----
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=builder /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

关键点:

  1. 先拷 package.json 再 npm ci:源码改动不会击穿依赖安装缓存层;
  2. 多阶段构建:编译工具链不进入最终镜像,体积缩小 70% 以上;
  3. 固定基础镜像版本,构建才可复现;
  4. 用非 root 用户运行,容器逃逸时伤害可控。

三、Docker Compose:本地一键起全套

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://app:secret@db:5432/app
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    environment:
      - POSTGRES_PASSWORD=secret
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 5

volumes:
  pgdata:

docker compose up -d 一条命令拉起应用 + 数据库。注意:容器间通过服务名互访(db:5432),不是 localhost。

四、镜像仓库与部署流程

代码提交 → CI 构建&测试 → docker build & push 镜像仓库 → 服务器拉取新镜像 → 滚动重启
  • 镜像 tag 用 Git commit 短哈希,不要只用 latest,回滚才有抓手;
  • 配置与代码分离:环境变量 / 挂载文件注入,绝不 bake 进镜像;
  • .dockerignore 别忘了(node_modules、.git、.env),否则构建又慢又泄密。

五、生产环境注意事项

  1. 日志:输出到 stdout/stderr,由 docker logs 或日志采集器接管,不要写容器内文件;
  2. 资源限制:--memory=512m --cpus=1 防止单容器拖垮宿主机;
  3. 优雅退出:处理 SIGTERM 信号,完成存量请求再退出,配合 stop_grace_period;
  4. 数据卷:数据库一定挂 Volume,容器可随时销毁重建,数据不能;
  5. 健康检查:提供 /healthz 接口,编排系统据此自动重启/摘流。

六、下一步:要不要上 Kubernetes?

单机跑 3~5 个服务,Compose 足够;当出现多机部署、自动扩缩容、滚动发布、服务发现等需求时,再考虑 K8s 或轻量替代(Nomad、K3s)。不要为了简历而引入 K8s,运维成本是真实的。

总结

容器化的价值链条:环境一致(Dockerfile)→ 本地编排(Compose)→ 镜像即制品(CI/CD)→ 生产可运维(健康检查 + 资源限制)。把每一步做扎实,部署就从"玄学仪式"变成"一条命令的事"。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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