为什么需要容器化
传统的服务器部署方式有一个老大难问题——"在我电脑上能跑啊"这句话,每个开发者都说过。环境不一致导致的 Bug 浪费了大量排错时间。Docker 容器化技术通过把应用及其依赖打包成标准化的镜像,从根源上解决了这个问题。无论你在本地开发、测试环境还是生产服务器,同一个镜像运行的行为完全一致。
Docker 核心概念速通
镜像与容器
镜像是一个只读模板,包含运行应用所需的代码、运行时、系统工具和库。容器是镜像的运行实例,可以启动、停止、删除。如果把镜像比作一个类,容器就是实例化的对象。
Dockerfile 编写规范
编写 Dockerfile 时有一个黄金法则——充分利用层缓存。Docker 构建过程中每一行指令都会生成一层缓存,只有文件变化时才会重新构建。所以应该把变更最频繁的操作放在 Dockerfile 末尾。一个典型的 Node.js 应用的 Dockerfile 范例:
FROM node:18-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]这种多阶段构建模式能显著减小最终镜像体积。第一阶段安装编译工具、构建应用,第二阶段只复制构建产物到最小化的运行环境。
Docker Compose 编排多容器
实际项目中很少只有一个容器,通常需要 Web 服务加数据库再加缓存。Docker Compose 通过一个 YAML 文件定义和管理多容器应用:
version: '3.8'
services:
web:
build: .
ports:
- "80:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/app
depends_on:
- db
restart: unless-stopped
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: app
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
restart: unless-stopped
volumes:
pgdata:这里有几个关键点值得注意。depends_on 只控制启动顺序,不等待数据库就绪。生产环境中应该在应用代码里加入重试机制。volume 挂载确保数据库重启后数据不丢失。restart 策略保证意外崩溃后自动恢复。
生产环境最佳实践
1. 镜像瘦身技巧
一个臃肿的镜像不仅占用磁盘空间,还会拖慢部署速度。建议遵循以下原则:优先选择 Alpine 版本基础镜像,体积通常只有标准版的十分之一。apt 安装软件包后清理缓存,删除不必要的临时文件。使用 .dockerignore 避免把 node_modules、.git 目录打包进镜像。
2. 容器资源限制
生产环境中千万不要让容器无限制使用主机资源。不加限制的容器可能把服务器的 CPU 和内存占满,影响同机其他服务。Docker 支持精细的资源控制:
docker run -d --name myapp --memory="512m" --cpus="1.5" --memory-reservation="256m" --oom-kill-disable=false myapp:latest3. 日志管理
容器默认把日志输出到标准输出,但如果不加管理,日志文件会无限增长撑爆磁盘。建议配置日志轮转:
docker run --log-opt max-size=10m --log-opt max-file=3 myapp或者在 daemon.json 中全局配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}4. 安全配置要点
永远不要用 root 用户运行容器进程。通过 USER 指令切换到普通用户。使用只读文件系统防止恶意识入文件。定期扫描镜像漏洞,推荐使用 Trivy 或 Docker Scout。
监控与运维
容器化部署后必须建立监控体系。cAdvisor 可以收集容器的 CPU、内存、网络和磁盘指标。Prometheus 负责时序数据存储。Grafana 提供可视化面板。一个标准的生产监控栈虽然看起来复杂,但一旦搭建完成,对集群的健康状况了如指掌。
常见问题排查
容器启动后立即退出时,执行 docker logs 查看启动日志。宿主机端口被占用时,修改端口映射或杀掉冲突进程。容器内连接数据库超时,检查网络模式是否配置正确。镜像构建缓慢时确认层缓存是否被破坏——不合理的 COPY 顺序会拖慢每次构建。
总结
从单机部署到容器化是现代运维的必经之路。Docker 降低了环境管理的复杂度,让开发者可以更专注于业务本身。掌握 Dockerfile 优化、Compose 编排和生产配置这三个核心技能,你就能在生产环境中游刃有余地管理容器化应用。