Docker 容器化实践:从入门到生产部署
运维与架构

Docker 容器化实践:从入门到生产部署

深入探索 Docker 容器技术,从基础概念到实际生产环境的应用,全面掌握现代化应用部署方案

在现代软件开发中,Docker 已经成为不可或缺的工具。本文将带你深入了解 Docker 容器化技术,从基础概念到生产环境的实际应用。

什么是 Docker?

Docker 是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。容器可以在任何支持 Docker 的环境中运行,确保了”一次构建,到处运行”的理念。

容器 vs 虚拟机

传统虚拟机需要完整的操作系统,而容器共享宿主机的内核,因此更加轻量和高效:

  • 启动速度:容器秒级启动,虚拟机需要数分钟
  • 资源占用:容器占用 MB 级别,虚拟机占用 GB 级别
  • 隔离级别:容器进程级隔离,虚拟机系统级隔离

Docker 核心概念

1. 镜像 (Image)

镜像是容器的模板,包含了运行应用所需的所有内容:代码、运行时、库、环境变量和配置文件。

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

2. 容器 (Container)

容器是镜像的运行实例。你可以创建、启动、停止、删除容器。

# 运行容器
docker run -d -p 3000:3000 --name myapp myapp:latest

# 查看运行中的容器
docker ps

# 停止容器
docker stop myapp

3. 仓库 (Registry)

Docker 仓库用于存储和分发镜像,最常用的是 Docker Hub。

实战:构建一个 Node.js 应用

让我们通过一个实际例子来学习如何 Docker 化一个 Node.js 应用。

步骤 1: 创建 Dockerfile

# 使用官方 Node.js 镜像作为基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动应用
CMD ["node", "server.js"]

步骤 2: 构建镜像

docker build -t myapp:1.0.0 .

步骤 3: 运行容器

docker run -d \
  -p 3000:3000 \
  --name myapp \
  --restart unless-stopped \
  myapp:1.0.0

Docker Compose:编排多容器应用

在实际项目中,应用通常依赖多个服务。Docker Compose 可以帮助我们定义和运行多容器应用。

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://postgres:password@db:5432/mydb
    depends_on:
      - db
      - redis

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

启动所有服务:

docker-compose up -d

最佳实践

1. 使用多阶段构建

减小镜像体积,提高安全性:

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

# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]

2. 优化镜像层

  • 将不常变化的层放在前面
  • 合并 RUN 命令减少层数
  • 使用 .dockerignore 排除不必要的文件

3. 健康检查

HEALTHCHECK --interval=30s --timeout=3s \
  CMD node healthcheck.js

生产环境部署

在生产环境中使用 Docker 时,需要考虑:

  1. 日志管理:使用集中式日志收集
  2. 监控告警:集成 Prometheus、Grafana
  3. 安全加固:使用非 root 用户、扫描镜像漏洞
  4. 资源限制:设置 CPU 和内存限制
docker run -d \
  --memory="512m" \
  --cpus="0.5" \
  --user 1000:1000 \
  myapp:1.0.0

总结

Docker 容器化技术极大地简化了应用的开发、测试和部署流程。通过本文的学习,你应该掌握了:

  • Docker 的核心概念
  • 如何编写 Dockerfile
  • 使用 Docker Compose 编排多容器应用
  • 生产环境的最佳实践

在下一篇文章中,我们将深入探讨如何使用 Kubernetes 来编排和管理容器化应用。

相关资源