Docker 容器化部署指南:从 Dockerfile 到生产编排
【摘要】 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"]
关键点:
- 先拷 package.json 再 npm ci:源码改动不会击穿依赖安装缓存层;
- 多阶段构建:编译工具链不进入最终镜像,体积缩小 70% 以上;
- 固定基础镜像版本,构建才可复现;
- 用非 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),否则构建又慢又泄密。
五、生产环境注意事项
- 日志:输出到 stdout/stderr,由
docker logs或日志采集器接管,不要写容器内文件; - 资源限制:
--memory=512m --cpus=1防止单容器拖垮宿主机; - 优雅退出:处理 SIGTERM 信号,完成存量请求再退出,配合
stop_grace_period; - 数据卷:数据库一定挂 Volume,容器可随时销毁重建,数据不能;
- 健康检查:提供
/healthz接口,编排系统据此自动重启/摘流。
六、下一步:要不要上 Kubernetes?
单机跑 3~5 个服务,Compose 足够;当出现多机部署、自动扩缩容、滚动发布、服务发现等需求时,再考虑 K8s 或轻量替代(Nomad、K3s)。不要为了简历而引入 K8s,运维成本是真实的。
总结
容器化的价值链条:环境一致(Dockerfile)→ 本地编排(Compose)→ 镜像即制品(CI/CD)→ 生产可运维(健康检查 + 资源限制)。把每一步做扎实,部署就从"玄学仪式"变成"一条命令的事"。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)