目录

Docker容器化部署实战指南

Docker 已经成为现代开发运维不可或缺的工具,本文将带你从零掌握容器化部署的核心技能。

什么是 Docker?

Docker 是一个开源的容器化平台,它可以将应用及其依赖打包到一个轻量级、可移植的容器中运行。与虚拟机相比,Docker 容器启动更快、资源占用更少。

核心概念

  • 镜像(Image):只读模板,包含运行应用所需的所有内容
  • 容器(Container):镜像的运行实例
  • 仓库(Registry):存储和分发镜像的服务(如 Docker Hub)
  • Dockerfile:描述如何构建镜像的文本文件

编写 Dockerfile

以下是一个 Node.js 应用的 Dockerfile 示例:

dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

多阶段构建

多阶段构建可以显著减小镜像体积:

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

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Docker Compose 编排

对于多容器应用,使用 Docker Compose 进行编排:

yaml
version: "3.8"
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/app

  db:
    image: postgres:15-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=pass

volumes:
  pgdata:

数据卷管理

数据卷用于持久化容器数据:

bash
# 创建命名卷
docker volume create mydata

# 挂载卷到容器
docker run -v mydata:/data alpine

# 挂载宿主机目录
docker run -v /host/path:/container/path alpine

网络配置

Docker 提供多种网络驱动:

驱动 说明 使用场景
bridge 默认桥接网络 单机容器通信
host 共享宿主机网络 需要最高网络性能
overlay 跨主机网络 Docker Swarm 集群
none 无网络 安全隔离

常用命令速查

bash
# 构建镜像
docker build -t myapp:latest .

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

# 查看容器日志
docker logs -f myapp

# 进入容器
docker exec -it myapp sh

# 清理资源
docker system prune -a

最佳实践

  1. 使用 .dockerignore 排除不需要的文件
  2. 合并 RUN 指令减少镜像层数
  3. 使用特定版本标签而非 latest
  4. 非 root 用户运行容器
  5. 利用构建缓存优化构建速度

总结

Docker 容器化部署能够极大简化应用的部署和运维流程。掌握 Dockerfile 编写、Compose 编排和数据卷管理,就能应对大多数部署场景。