• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

Docker 从入门到精通:一篇彻底搞懂容器化技术

适用人群:开发、测试、运维、DevOps 工程师
目标:掌握 Docker 核心概念、常用命令、实战技巧与生产最佳实践
环境要求:Linux / macOS / Windows(WSL2)

一、为什么需要 Docker?

🚫 传统部署的痛点

  • “在我机器上能跑!” → 环境不一致(依赖、版本、配置)
  • 资源浪费 → 虚拟机开销大(GB 级内存)
  • 部署慢 → 手动配置耗时易错
  • 扩展难 → 无法快速横向扩容

✅ Docker 的解决方案

image

💡 核心思想:一次构建,随处运行(Build Once, Run Anywhere)

二、Docker 核心概念(5 分钟理解)

1. 镜像(Image)

  • 只读模板,包含运行应用所需的所有内容(代码、运行时、库、环境变量、配置文件)
  • 类似 Java 的 JAR 包 或 操作系统的 ISO 镜像
  • 分层存储(Layered FS),复用率高

2. 容器(Container)

  • 镜像的运行实例
  • 轻量、可启动/停止/删除
  • 每个容器有独立的文件系统、网络、进程空间

3. Dockerfile

  • 文本文件,定义如何构建镜像(类似 Makefile)
  • 包含一系列指令(FROM, RUN, COPY, EXPOSE...)

4. 仓库(Registry)

  • 存储和分发镜像的服务
  • 公共:Docker Hub(hub.docker.com)
  • 私有:Harbor、Nexus、AWS ECR

5. Docker Daemon

  • 后台服务进程,管理镜像、容器、网络、存储

 

image

 

三、安装 Docker

Linux(Ubuntu/CentOS)

# Ubuntu
sudo apt update
sudo apt install docker.io
sudo systemctl enable --now docker

# CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker

macOS / Windows

  • 下载 Docker Desktop
  • 启用 WSL2(Windows 必需)

验证安装

docker --version        # 查看版本
docker run hello-world  # 运行测试容器

🔑 权限问题?将用户加入 docker 组:

sudo usermod -aG docker $USER && newgrp docker

四、Docker 基础命令速查

image

五、实战:构建你的第一个应用

步骤 1:编写简单 Python 应用(app.py)

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Docker! "

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

步骤 2:创建 requirements.txt

Flask==2.3.2

步骤 3:编写 Dockerfile

# 基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖(使用国内源加速)
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["python", "app.py"]

步骤 4:构建并运行

# 构建镜像(注意末尾的 . )
docker build -t my-flask-app .

# 运行容器(映射端口 5000:5000)
docker run -d -p 5000:5000 --name my-app my-flask-app

# 访问 http://localhost:5000
curl http://localhost:5000

✅ 成功!你已掌握 Docker 核心工作流。

六、关键进阶功能

1. 数据持久化:Volumes

容器删除后数据丢失?用 Volume!

# 创建命名卷
docker volume create my-vol

# 挂载到容器
docker run -d -v my-vol:/app/data nginx

# 查看卷位置
docker volume inspect my-vol

💡 最佳实践:数据库、日志、上传文件等必须用 Volume!

2. 网络通信

  • bridge(默认):容器间通过 IP 通信
  • host:共享 Host 网络(高性能,但无隔离)
  • 自定义网络(推荐):支持 DNS 解析
# 创建自定义网络
docker network create my-net

# 启动容器加入网络
docker run -d --network my-net --name db mysql
docker run -d --network my-net --name app my-flask-app

# 在 app 中可直接 ping db

3. 环境变量与配置

# Dockerfile 中设置默认值
ENV PORT=5000

# 运行时覆盖
docker run -e PORT=8080 my-app

4. 多阶段构建(减小镜像体积)

# 第一阶段:构建
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# 第二阶段:运行
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["node", "server.js"]

⚡ 镜像体积减少 70%+!

七、Docker Compose:编排多容器应用

场景:Flask + Redis + Nginx

docker-compose.yml

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - REDIS_HOST=redis
    depends_on:
      - redis

  redis:
    image: redis:alpine
    volumes:
      - redis-data:/data

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - web

volumes:
  redis-data:

启动整个应用

docker-compose up -d  # 后台启动
docker-compose logs -f web  # 查看日志
docker-compose down   # 停止并删除

✅ 一行命令管理复杂应用!

八、生产环境最佳实践

🔒 安全

  • 不要用 root 用户运行容器
    RUN adduser -D myuser
    USER myuser
    
  • 扫描镜像漏洞
    docker scan my-app
    
  • 最小化基础镜像:优先用 -alpine 或 distroless

🚀 性能

  • .dockerignore:排除无关文件(如 .git, node_modules)
  • 合并 RUN 指令:减少镜像层数
    # ❌ 错误
    RUN apt update
    RUN apt install -y curl
    
    # ✅ 正确
    RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
    

📦 镜像管理

  • 语义化标签:my-app:v1.2.0 而非 latest
  • 私有仓库:敏感镜像不上 Docker Hub

🛠️ 监控

  • 日志驱动:集成 ELK / Loki
  • 指标暴露:Prometheus + cAdvisor

九、常见问题排查

❌ 容器启动失败?

docker logs <container>      # 查看错误日志
docker run -it --rm my-app sh  # 进入调试模式

❌ 端口被占用?

lsof -i :5000  # Linux/macOS
netstat -ano | findstr :5000  # Windows

❌ 镜像太大?

  • 使用 dive 分析镜像层:
    dive my-app
    

❌ 网络不通?

docker network inspect my-net  # 检查 IP 分配
docker exec -it app ping redis  # 测试连通性

十、学习路线图

image

结语

Docker 不是银弹,但它是现代软件交付的基石技术。掌握它,你将:

  • ✅ 告别“环境问题”
  • ✅ 提升开发部署效率
  • ✅ 为云原生(K8s)打下坚实基础

记住:
“Don’t learn Docker to use Docker. Learn Docker to ship better software.”

附:速查 Cheat Sheet
📥 下载 PDF 版命令速查表
🐙 GitHub 示例代码仓库

现在,打开终端,输入 docker run -it ubuntu bash,开始你的容器之旅吧! 🐳

posted @ 2026-03-17 19:47  JackYang  阅读(1)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3