Docker 容器化技术详解:从入门到实战

Docker 是一个开源的容器化平台,它使用容器来打包、分发和运行应用程序。本文将深入介绍 Docker 的核心概念、常用命令和实际应用场景。

2025年9月18日
DocsLib Team
Docker容器化DevOps微服务

Docker 容器化技术详解:从入门到实战

什么是 Docker?

Docker 是一个开源的容器化平台,它使用容器来打包、分发和运行应用程序。容器是一种轻量级、可移植的封装技术,能够将应用程序及其依赖项打包在一起,确保在任何环境中都能一致地运行。

Docker 的核心概念

  1. 镜像(Image):只读的模板,用于创建容器
  2. 容器(Container):镜像的运行实例
  3. Dockerfile:用于构建镜像的文本文件
  4. 仓库(Repository):存储镜像的地方
  5. 注册表(Registry):管理仓库的服务

Docker 的优势

  • 一致性:确保应用在不同环境中的一致性
  • 可移植性:容器可以在任何支持 Docker 的平台上运行
  • 资源效率:比虚拟机更轻量,启动更快
  • 可扩展性:易于水平扩展和负载均衡
  • 版本控制:镜像支持版本管理
  • 隔离性:容器之间相互隔离,提高安全性

安装 Docker

Windows 安装

  1. 下载 Docker Desktop for Windows
  2. 运行安装程序
  3. 启用 WSL 2(推荐)
  4. 重启计算机

macOS 安装

  1. 下载 Docker Desktop for Mac
  2. 拖拽到 Applications 文件夹
  3. 启动 Docker Desktop

Linux 安装(Ubuntu 示例)

# 更新包索引
sudo apt update

# 安装必要的包
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 将用户添加到 docker 组
sudo usermod -aG docker $USER

验证安装

# 查看 Docker 版本
docker --version

# 运行测试容器
docker run hello-world

基础命令

镜像管理

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 列出本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

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

# 给镜像打标签
docker tag myapp:1.0 myapp:latest

容器管理

# 运行容器
docker run -d --name mynginx -p 8080:80 nginx

# 列出运行中的容器
docker ps

# 列出所有容器(包括停止的)
docker ps -a

# 停止容器
docker stop mynginx

# 启动容器
docker start mynginx

# 重启容器
docker restart mynginx

# 删除容器
docker rm mynginx

# 进入容器
docker exec -it mynginx /bin/bash

# 查看容器日志
docker logs mynginx

# 查看容器详细信息
docker inspect mynginx

数据管理

# 创建数据卷
docker volume create myvolume

# 列出数据卷
docker volume ls

# 使用数据卷运行容器
docker run -d -v myvolume:/data nginx

# 绑定挂载
docker run -d -v /host/path:/container/path nginx

# 删除数据卷
docker volume rm myvolume

Dockerfile 详解

Dockerfile 是用于构建 Docker 镜像的文本文件,包含了一系列指令。

基本指令

# 基础镜像
FROM node:16-alpine

# 设置工作目录
WORKDIR /app

# 复制文件
COPY package*.json ./

# 运行命令
RUN npm install

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 设置环境变量
ENV NODE_ENV=production

# 设置用户
USER node

# 启动命令
CMD ["npm", "start"]

多阶段构建

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

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

最佳实践

  1. 使用官方基础镜像
  2. 最小化层数:合并 RUN 指令
  3. 利用缓存:将变化频率低的指令放在前面
  4. 使用 .dockerignore:排除不必要的文件
  5. 不要在容器中存储数据:使用数据卷
  6. 使用非 root 用户:提高安全性

Docker Compose

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。

安装 Docker Compose

# Linux
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

docker-compose.yml 示例

version: '3.8'

services:
  # Web 应用
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
      - redis
    volumes:
      - ./logs:/app/logs
    networks:
      - app-network

  # 数据库
  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network

  # 缓存
  redis:
    image: redis:alpine
    networks:
      - app-network

  # 反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - web
    networks:
      - app-network

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

Compose 命令

# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs web

# 扩展服务
docker-compose up -d --scale web=3

# 重新构建服务
docker-compose build web

# 执行命令
docker-compose exec web bash

网络管理

网络类型

  1. bridge:默认网络驱动
  2. host:使用主机网络
  3. none:禁用网络
  4. overlay:用于 Swarm 模式

网络命令

# 创建网络
docker network create mynetwork

# 列出网络
docker network ls

# 查看网络详情
docker network inspect mynetwork

# 连接容器到网络
docker network connect mynetwork mycontainer

# 断开容器网络连接
docker network disconnect mynetwork mycontainer

# 删除网络
docker network rm mynetwork

实际应用场景

1. Web 应用部署

# Node.js 应用 Dockerfile
FROM node:16-alpine

WORKDIR /app

# 安装依赖
COPY package*.json ./
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs

EXPOSE 3000

CMD ["npm", "start"]

2. 微服务架构

# 微服务 docker-compose.yml
version: '3.8'

services:
  api-gateway:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

  user-service:
    build: ./user-service
    environment:
      - DB_HOST=user-db
    depends_on:
      - user-db

  order-service:
    build: ./order-service
    environment:
      - DB_HOST=order-db
    depends_on:
      - order-db

  user-db:
    image: postgres:13
    environment:
      - POSTGRES_DB=users
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password

  order-db:
    image: postgres:13
    environment:
      - POSTGRES_DB=orders
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password

3. 开发环境搭建

# 开发环境 docker-compose.dev.yml
version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    command: npm run dev

  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=devdb
      - POSTGRES_USER=dev
      - POSTGRES_PASSWORD=dev
    ports:
      - "5432:5432"
    volumes:
      - postgres_dev_data:/var/lib/postgresql/data

volumes:
  postgres_dev_data:

性能优化

1. 镜像优化

# 优化前
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt

# 优化后
FROM python:3.9-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

2. 构建缓存优化

# 利用构建缓存
FROM node:16-alpine
WORKDIR /app

# 先复制依赖文件
COPY package*.json ./
RUN npm ci --only=production

# 再复制源代码
COPY . .

CMD ["npm", "start"]

3. 多阶段构建减小镜像大小

# 构建阶段
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

安全最佳实践

1. 使用非 root 用户

FROM node:16-alpine

# 创建应用用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN chown -R nextjs:nodejs /app
USER nextjs

CMD ["npm", "start"]

2. 扫描镜像漏洞

# 使用 Docker Scout
docker scout cves myapp:latest

# 使用 Trivy
trivy image myapp:latest

3. 使用 secrets 管理敏感信息

# docker-compose.yml
version: '3.8'

services:
  app:
    image: myapp
    secrets:
      - db_password
    environment:
      - DB_PASSWORD_FILE=/run/secrets/db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

监控和日志

1. 容器监控

# 查看容器资源使用情况
docker stats

# 查看容器进程
docker top mycontainer

# 查看容器文件系统变化
docker diff mycontainer

2. 日志管理

# 配置日志驱动
version: '3.8'

services:
  app:
    image: myapp
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

3. 健康检查

# Dockerfile 中添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1
# docker-compose.yml 中配置健康检查
services:
  web:
    image: myapp
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

故障排除

常见问题

  1. 容器无法启动

    # 查看容器日志
    docker logs mycontainer
    
    # 以交互模式运行
    docker run -it myimage /bin/bash
  2. 网络连接问题

    # 检查网络配置
    docker network inspect bridge
    
    # 测试容器间连接
    docker exec -it container1 ping container2
  3. 存储空间不足

    # 清理未使用的资源
    docker system prune -a
    
    # 查看磁盘使用情况
    docker system df

总结

Docker 作为容器化技术的领导者,已经成为现代软件开发和部署的重要工具。通过本文的学习,你应该已经掌握了:

  • Docker 的核心概念和基本命令
  • Dockerfile 的编写和最佳实践
  • Docker Compose 的使用
  • 网络和存储管理
  • 性能优化和安全实践
  • 监控和故障排除

Docker 不仅简化了应用的部署和管理,还为微服务架构、CI/CD 流水线和云原生应用提供了强大的支持。继续实践和探索,你将能够更好地利用 Docker 来构建和部署现代化的应用程序。

要了解更多信息,请访问 Docker 官方文档

返回博客列表
感谢阅读!