Docker 容器化实战:从 Dockerfile 到多服务编排

1133 字
6 分钟
Docker 容器化实战:从 Dockerfile 到多服务编排
为什么用 Docker
“在我机器上能跑” 是开发者的经典痛点。Docker 把应用及其依赖打包进容器,确保在任何环境运行一致。
容器 vs 虚拟机
| 对比维度 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级 |
| 隔离级别 | 进程级 | 硬件级 |
| 镜像大小 | 通常 < 100MB | 通常 > 1GB |
| 内核 | 共享宿主机内核 | 独立内核 |
一、编写第一个 Dockerfile
假设我们有一个简单的 Node.js 应用:
const express = require('express');const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ status: 'ok', uptime: process.uptime() });});
app.listen(PORT, () => console.log(`Server running on :${PORT}`));{ "name": "my-app", "dependencies": { "express": "^4.21.0" }, "scripts": { "start": "node app.js" }}对应的 Dockerfile:
# ---- 构建阶段 ----FROM node:20-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --omit=dev
# ---- 运行阶段 ----FROM node:20-alpineWORKDIR /app
# 创建非 root 用户RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 从构建阶段复制依赖COPY --from=builder /app/node_modules ./node_modulesCOPY app.js ./
USER appuserEXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \ CMD wget -qO- http://localhost:3000/ || exit 1
CMD ["node", "app.js"]关键技巧:多阶段构建(multi-stage build)让最终镜像只包含运行时依赖,减小体积。
构建与运行
# 构建镜像docker build -t my-app:latest .
# 查看镜像大小docker images my-app
# 运行容器docker run -d -p 3000:3000 --name my-app my-app:latest
# 查看日志docker logs -f my-app
# 进入容器调试docker exec -it my-app sh二、Docker Compose 多服务编排
真实项目通常由多个服务组成(Web + 数据库 + 缓存)。Compose 用一个 YAML 文件描述整个技术栈。
架构图
docker-compose.yml
version: '3.9'services: web: build: . ports: - '3000:3000' environment: DATABASE_URL: postgres://user:pass@db:5432/mydb REDIS_URL: redis://redis:6379 depends_on: db: condition: service_healthy redis: condition: service_started volumes: - ./uploads:/app/uploads restart: unless-stopped
db: image: postgres:16-alpine environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U user -d mydb'] interval: 10s timeout: 5s retries: 5 restart: unless-stopped
redis: image: redis:7-alpine volumes: - redisdata:/data restart: unless-stopped
volumes: pgdata: redisdata:# 一键启动所有服务docker compose up -d
# 查看服务状态docker compose ps
# 查看日志docker compose logs -f web
# 执行一次性命令docker compose run --rm web npm run migrate
# 停止并清理docker compose down -v三、镜像优化:让镜像瘦身 90%
优化技巧清单
# ❌ 反面教材:一条命令一层,镜像臃肿FROM node:20RUN apt-get updateRUN apt-get install -y curlRUN npm install -g pm2
# ✅ 优化版:合并 RUN、清理缓存FROM node:20-alpineRUN apk add --no-cache curl \ && npm install -g pm2 \ && rm -rf /root/.npm
# ✅ 使用 .dockerignore 排除不必要的文件# node_modules# .git# *.md# .env.local四、常用命令速查
| 场景 | 命令 |
|---|---|
| 列出运行中的容器 | docker ps |
| 列出所有容器(含停止的) | docker ps -a |
| 停止容器 | docker stop <name> |
| 删除容器 | docker rm <name> |
| 删除镜像 | docker rmi <image> |
| 清理无用资源 | docker system prune -a |
| 查看容器资源占用 | docker stats |
| 查看镜像层历史 | docker history <image> |
| 复制文件到容器 | docker cp file.txt container:/path/ |
| 导出镜像 | docker save -o myapp.tar myapp:latest |
五、生产环境部署流程
对应的 CI 配置片段(GitHub Actions):
# .github/workflows/deploy.yml 中的关键步骤- name: Build and Push Docker image run: | docker build -t ghcr.io/${{ github.repository }}:${{ github.sha }} . echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin docker push ghcr.io/${{ github.repository }}:${{ github.sha }}
- name: Deploy to server uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SERVER_HOST }} username: deploy key: ${{ secrets.SSH_KEY }} script: | docker pull ghcr.io/${{ github.repository }}:${{ github.sha }} cd /opt/app && docker compose up -d --no-deps web总结
Docker 不是银弹,但它是现代开发的基础设施。掌握 Dockerfile + Compose 基本上覆盖了 80% 的使用场景:
- 多阶段构建减小镜像
- Docker Compose 编排多服务
- 健康检查确保服务可用
- CI/CD 集成实现自动部署
参考链接
- Docker 官方文档
- Dockerfile 最佳实践
- Compose 文件参考
- Play with Docker — 在线 Docker 实验环境,无需本地安装
- GoogleContainerTools/distroless — 最小化容器镜像
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Docker 容器化实战:从 Dockerfile 到多服务编排
https://mingblog.de5.net/posts/docker-container-practice/相关文章智能推荐
1
Git 工作流最佳实践:从独狼到团队协作
后端运维深入讲解 Git Flow、GitHub Flow 和 Trunk-Based Development 三种主流分支策略,附完整命令示例与流程图,帮你选择最适合团队的工作流。
2
用 Typora 写博客:零基础发布全流程
写作指南一份完全面向新手的使用说明:从克隆项目到本地预览,从 Typora 写作到 git 推送自动部署,手把手带你在这个博客上发布第一篇文章。
3
使用 Astro 快速搭建一个静态博客
前端开发从零开始,用 Astro + Content Collections 构建一个支持 Markdown 的静态个人博客,体验零运行时 JS 的极速体验。
4
Python 数据处理实战:从 CSV 清洗到可视化报告
Python使用 Python + Pandas + Matplotlib 完成数据清洗、分析与可视化的全流程,内含完整代码和流程图,可直接运行。
5
Tailwind CSS 暗色模式的三种实现策略
前端开发深入对比 Tailwind 中基于 class、media 与系统偏好的暗色模式方案,并给出防闪烁(FOUC)的最佳实践。
随机文章随机推荐













