Docker 从入门到实战:完整学习指南

👤 云小白 📅 2026-05-10 🔄 2026-05-12 更新 👁 9,821 阅读 ⏱ 约 15 分钟
Docker 容器化 云运维 DevOps
📌 本文概述:本教程从零开始介绍 Docker 核心概念,涵盖安装配置、镜像管理、容器操作、Compose 编排及生产实践,适合有一定 Linux 基础的开发者阅读。

1. Docker 是什么

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖打包到一个轻量、可移植的容器中,确保应用在任何环境下都能一致地运行。

你可以把 Docker 容器想象成一个轻量级的"集装箱"——就像真实的集装箱可以在轮船、卡车、火车上通用,Docker 容器也可以在开发机、测试环境、生产服务器上无缝运行。

1.1 容器与虚拟机的区别

容器和虚拟机都实现了隔离,但原理和资源消耗差异很大:

对比维度 虚拟机 (VM) Docker 容器
隔离级别 硬件级别(含完整 OS) 操作系统级别(共享内核)
启动时间 分钟级 秒级甚至毫秒级
镜像大小 GB 级 MB 级
性能损耗 较高(~5%~15%) 极低(接近原生)
资源利用 低(固定分配) 高(动态分配)
适用场景 强隔离、不同 OS 微服务、CI/CD、云原生

1.2 核心架构

Docker 采用 C/S 架构,主要由三部分组成:

  • Docker Daemon(dockerd):后台守护进程,负责管理镜像、容器、网络、数据卷
  • Docker Client(docker CLI):用户交互的命令行工具,通过 REST API 与 Daemon 通信
  • Docker Registry:镜像仓库,官方提供 Docker Hub,也可自建私有仓库
核心概念三要素:镜像(Image)是只读模板;容器(Container)是镜像的运行实例;仓库(Registry)是存储镜像的地方。

2. 安装与配置

2.1 Linux 安装

推荐使用官方安装脚本,适用于 Ubuntu / Debian / CentOS:

bash
# 官方一键安装脚本(推荐)
curl -fsSL https://get.docker.com | sh

# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER

# 重新登录后验证安装
docker version
docker run hello-world

安装完成后,启动并设置开机自启:

bash
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker

2.2 镜像加速配置

国内访问 Docker Hub 较慢,建议配置国内镜像加速器:

bash
# 编辑 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com"
  ],
  "log-driver": "json-file",
  "log-opts": { "max-size": "100m", "max-file": "3" }
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

3. 镜像管理

3.1 常用镜像命令

bash
# 搜索镜像
docker search nginx

# 拉取镜像(不指定 tag 则默认 latest)
docker pull nginx:1.25-alpine

# 查看本地镜像列表
docker images

# 查看镜像详细信息
docker inspect nginx:1.25-alpine

# 删除镜像
docker rmi nginx:1.25-alpine

# 清理无用镜像(悬空镜像)
docker image prune -f

3.2 编写 Dockerfile

Dockerfile 是构建自定义镜像的核心,下面是一个 Node.js 应用的最佳实践示例:

dockerfile
# ── 构建阶段(多阶段构建减小镜像体积)──
FROM node:20-alpine AS builder

WORKDIR /app

# 先复制依赖清单,利用层缓存
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

# ── 运行阶段 ──
FROM node:20-alpine

WORKDIR /app

# 创建非 root 用户(安全最佳实践)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

USER appuser

EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=5s \
  CMD wget -qO- http://localhost:3000/health || exit 1

CMD ["node", "dist/server.js"]
⚠️ 注意:每条 RUNCOPYADD 指令都会创建一个新的镜像层。合理使用多阶段构建和 && 合并命令,可以显著减小最终镜像体积。

构建并推送镜像:

bash
# 构建镜像(. 表示当前目录为构建上下文)
docker build -t myapp:1.0.0 .

# 为镜像打标签
docker tag myapp:1.0.0 registry.example.com/myapp:1.0.0

# 推送到私有仓库
docker push registry.example.com/myapp:1.0.0

4. 容器操作

掌握容器的完整生命周期管理是日常使用 Docker 的基础:

bash
# 运行容器(-d 后台,-p 端口映射,--name 命名,--restart 重启策略)
docker run -d \
  --name my-nginx \
  -p 8080:80 \
  -v /data/html:/usr/share/nginx/html:ro \
  --restart unless-stopped \
  nginx:1.25-alpine

# 查看运行中的容器
docker ps

# 查看所有容器(含已停止)
docker ps -a

# 进入容器交互终端
docker exec -it my-nginx /bin/sh

# 查看容器日志(-f 实时跟踪,--tail 最后N行)
docker logs -f --tail 100 my-nginx

# 查看容器资源使用
docker stats my-nginx

# 停止 / 启动 / 重启
docker stop my-nginx
docker start my-nginx
docker restart my-nginx

# 强制删除容器
docker rm -f my-nginx

# 清理所有停止的容器
docker container prune -f

5. Docker Compose

Docker Compose 用于定义和运行多容器应用。下面是一个 Web 应用 + Redis + MySQL 的典型配置:

yaml
# compose.yml
services:

  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=mysql://root:secret@db:3306/myapp
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    restart: unless-stopped

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  cache:
    image: redis:7-alpine
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
    volumes:
      - redis_data:/data

volumes:
  db_data:
  redis_data:

常用 Compose 命令:

bash
# 启动所有服务(-d 后台运行)
docker compose up -d

# 查看服务状态
docker compose ps

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

# 重新构建并启动(代码更新后)
docker compose up -d --build

# 停止并删除容器(保留数据卷)
docker compose down

# 停止并删除容器+数据卷(慎用!)
docker compose down -v

6. 生产实践

在生产环境使用 Docker 时,请遵循以下最佳实践:

  • ✅ 使用 多阶段构建减小镜像体积,只保留运行时必要文件
  • ✅ 始终指定具体的镜像 版本 tag,避免使用 latest
  • ✅ 容器以非 root 用户运行(安全)
  • ✅ 为容器配置资源限制--memory--cpus)防止资源耗尽
  • ✅ 设置合理的健康检查HEALTHCHECK),让编排系统感知服务状态
  • ✅ 敏感信息使用 Docker Secrets 或环境变量注入,不写入镜像
  • ✅ 日志统一输出到 stdout/stderr,由宿主机的日志驱动收集
🚨 安全警告:不要在 Dockerfile 中硬编码密码、API 密钥等敏感信息,也不要将 .env 文件打包进镜像。使用 .dockerignore 排除敏感文件。

至此,你已掌握 Docker 的核心知识。接下来推荐继续学习 Kubernetes 入门指南,将容器化应用扩展到集群编排层面。

💬 评论 (共 8 条)

  • 🧑
    前端小王 2026-05-11 14:32
    写得非常清晰!多阶段构建这个技巧很实用,之前构建 Node.js 镜像都有 1GB 多,用了这个方法直接缩到 150MB。
  • 👩
    运维小李 2026-05-11 16:45
    Compose 的 depends_oncondition: service_healthy 这个写法我之前一直不知道,解决了我数据库还没启动应用就挂的问题。
  • 🧑‍💻
    张同学 2026-05-12 09:17
    请问生产环境推荐直接用 Docker Compose 还是上 Kubernetes?项目规模不大,三四个服务。
  • 👤
    云小白(作者) 2026-05-12 10:03
    @张同学 三四个服务规模用 Compose 完全够用,简单易维护。K8s 更适合需要高可用、自动扩缩容的大规模场景,复杂度也高很多,建议团队规模和服务量上来之后再考虑迁移。