Fadey's Blog

arrow_back 返回首页
Docker教程封面

Docker实战教程:从入门到精通的容器化指南

Docker改变了应用的打包、分发和运行方式。从容器基础到生产环境部署,掌握Docker可以显著提升你的开发效率和部署能力。本指南将带你从Docker基础进阶到精通的容器化实战。

第一章:Docker基础

理解容器化的核心概念:

1. 什么是 Docker

  • 容器:应用及其依赖的轻量级可执行包
  • 镜像:只读模板,用于创建容器
  • 容器运行时: Docker Engine

2. 基本概念

# 镜像 vs 容器
# 镜像:静态的, 如虚拟机的模板
# 容器:镜像的运行实例, 如虚拟机的实例

# 核心命令
docker images      # 列出本地镜像
docker ps          # 列出运行中的容器
docker ps -a       # 列出所有容器
docker rmi <image> # 删除镜像
docker rm <container> # 删除容器

第二章:镜像构建

1. Dockerfile

# 基础 Node.js 应用 Dockerfile
FROM node:20-alpine

WORKDIR /app

# 利用缓存层
COPY package*.json ./
RUN npm install --production

# 复制源码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "index.js"]

# 构建命令
docker build -t my-app:latest .

# 常用构建参数
# --no-cache: 不使用缓存
# --pull: 始终尝试拉取最新基础镜像
# -t: 标签 (名称:tag)

2. 多阶段构建

# 多阶段构建 - 精简镜像
FROM node:20-alpine AS builder

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

# 生产构建
RUN npm run build

# 第二阶段 - 运行时环境
FROM nginx:alpine

# 从构建阶段复制 artifacts
COPY --from=builder /app/dist /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

第三章:容器运行

1. 基本操作

# 运行容器
docker run -d -p 8080:80 --name my-container my-image

# 交互模式
docker run -it --name my-container my-image /bin/bash

# 容器内部操作
docker exec -it my-container bash     # 进入容器
docker cp my-container:/path/file ./    # 复制文件出容器
docker logs my-container               # 查看容器日志

# 容器状态管理
docker start my-container     # 启动容器
docker stop my-container      # 停止容器
docker restart my-container   # 重启容器
docker rm my-container        # 删除容器

2. 环境变量

# 通过 -e 传递
docker run -d -p 80:80 -e NODE_ENV=production my-image

# 通过文件传递
# .env 文件
NODE_ENV=production
PORT=80

# docker run 时使用
docker run -d --env-file .env -p 80:80 my-image

第四章:数据持久化

1. 卷

# 挂载主机目录
docker run -d -v /host/path:/container/path my-image

# 命名卷 (推荐)
docker volume create my-data
docker run -d -v my-data:/container/path my-image

# 查看和管理卷
docker volume ls          # 列出卷
docker volume prune       # 删除未使用的卷

2. 数据库容器化

# MySQL 容器示例
docker run -d \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  --name mysql-db \
  mysql:8.0

# 数据持久化
docker run -d \
  -e MYSQL_ROOT_PASSWORD=secret \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  --name mysql-db \
  mysql:8.0

第五章:Docker Compose

1. docker-compose.yml

# 简单服务编排
version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: production
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: app_db
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

2. 常用命令

# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看服务日志
docker-compose logs -f

# 执行命令进入容器
docker-compose exec web bash

总结

从入门到精通 Docker 的路径包括:

  1. 掌握基本概念和基本命令
  2. 学习 Dockerfile 和镜像构建
  3. 理解容器运行和数据持久化
  4. 实践 Docker Compose 编排
  5. 探索生产环境最佳实践

记住,Docker 让 "it works on my machine" 成为过去式。从今天开始尝试容器化你的应用,你会发现开发和部署的效率有质的飞跃。

最重要的原则:显式配置,最小化镜像,数据持久化分离。