1. Docker技术概述与核心价值

Docker作为当前最流行的容器化技术,本质上是一个轻量级的虚拟化解决方案。与传统的虚拟机相比,Docker容器直接运行在宿主机的操作系统内核上,通过命名空间(namespace)和控制组(cgroup)实现资源隔离,这使得容器启动速度极快(通常只需毫秒级),资源占用也大幅降低。我在实际生产环境中测试发现,同一台物理机上可以运行的容器数量通常是虚拟机的5-10倍。

容器技术的核心优势在于环境一致性。开发者在本地构建的Docker镜像,可以百分百还原到测试、预发布和生产环境。我们团队曾经遇到过典型案例:一个Python服务在开发环境运行正常,但上线后由于底层glibc版本差异导致崩溃。采用Docker后,这类"在我机器上能跑"的问题彻底消失。镜像的层级存储机制(layer)也极具巧思——当多个镜像共享相同基础层时,物理存储只需保留一份副本。

2. 安装部署全平台指南

2.1 Windows系统安装要点

Windows用户推荐使用Docker Desktop,但需特别注意:

  1. 必须开启Hyper-V或WSL2后端(Win10 2004及以上版本)
  2. BIOS中确保开启VT-x/AMD-V虚拟化支持
  3. 安装后若出现"Virtualization support not detected"错误,可尝试:
    bcdedit /set hypervisorlaunchtype auto
    
    然后重启计算机

我在Surface Pro设备上实测发现,某些型号需要在BIOS中单独开启"Virtualization Technology for Directed I/O"选项才能正常运行。内存建议至少分配4GB给Docker,特别是需要运行数据库等重型服务时。

2.2 macOS最佳实践

Mac用户同样使用Docker Desktop,但要注意:

  • M1/M2芯片需选择Apple Silicon版本
  • 在Preferences → Resources中建议调整:
    • CPUs: 不少于2核
    • Memory: 建议4GB以上
    • Swap: 至少1GB

遇到网络问题时,可尝试重置DNS配置:

sudo killall -HUP mDNSResponder

2.3 Linux生产环境部署

对于Linux服务器,建议直接使用官方脚本安装:

curl -fsSL https://get.docker.com | sh

关键配置项:

// /etc/docker/daemon.json
{
  "registry-mirrors": ["https://<your-mirror>.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

配置后需重启服务:

sudo systemctl restart docker

重要提示:生产环境务必配置镜像加速源,否则拉取镜像速度极慢。阿里云、腾讯云等厂商都提供免费镜像服务。

3. 核心概念速成手册

3.1 镜像(Image)深度解析

镜像是Docker的构建基石,其本质是分层的只读文件系统。通过Dockerfile构建镜像时,每条指令都会创建一个新层。例如:

FROM ubuntu:22.04          # 基础层
RUN apt-get update && \    # 新层1
    apt-get install -y curl
COPY app.py /opt           # 新层2

查看镜像分层结构:

docker history <image_name>

镜像命名规范:

[仓库URL/][命名空间/]镜像名:标签

例如:

  • nginx:latest
  • registry.example.com/dev/backend:v1.2

3.2 容器(Container)操作大全

启动容器的高级参数示例:

docker run -dit \
  --name myapp \
  -p 8080:80 \
  -v /host/path:/container/path \
  -e "ENV_VAR=value" \
  --restart unless-stopped \
  myimage:tag

常用状态管理命令:

# 查看运行日志
docker logs -f --tail 100 myapp

# 进入容器终端
docker exec -it myapp /bin/bash

# 资源使用统计
docker stats myapp

# 端口映射检查
docker port myapp

3.3 网络模型实战

Docker提供多种网络模式:

  • bridge:默认模式,NAT网络
  • host:直接使用主机网络
  • overlay:跨主机通信
  • macvlan:直接分配MAC地址

创建自定义网络:

docker network create \
  --driver bridge \
  --subnet 172.28.0.0/16 \
  --gateway 172.28.0.1 \
  my-net

容器间通信测试:

# 容器1
docker run -it --net my-net --name c1 alpine sh

# 容器2
docker run -it --net my-net --name c2 alpine sh

# 在c2中ping c1
ping c1

4. 开发实战全流程

4.1 Python应用容器化

典型Flask应用的Dockerfile:

FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV FLASK_APP=app.py
EXPOSE 5000

CMD ["gunicorn", "-b :5000", "app:app"]

构建优化技巧:

  1. 使用.dockerignore文件排除无关文件
  2. 多阶段构建减小镜像体积
  3. 合并RUN命令减少层数

4.2 多容器编排实战

使用docker-compose.yml部署WordPress:

version: '3.8'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: wordpress

  wordpress:
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: example
    depends_on:
      - db

volumes:
  db_data:

启动命令:

docker-compose up -d

4.3 生产环境最佳实践

  1. 镜像安全扫描:
docker scan myimage:tag
  1. 资源限制:
# docker-compose.yml片段
services:
  app:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
  1. 日志管理:
docker run --log-driver=syslog --log-opt syslog-address=udp://logserver:514 myimage

5. 故障排查指南

5.1 常见错误解决方案

  1. 端口冲突
# 查看占用端口进程
sudo lsof -i :8080

# 修改容器映射端口
docker run -p 8081:80 ...
  1. 磁盘空间不足
# 清理无用资源
docker system prune -a --volumes

# 查看磁盘使用
docker system df
  1. 容器启动失败
# 查看详细日志
docker inspect --format='{{.LogPath}}' <container>

5.2 性能调优技巧

  1. 存储驱动选择:
# 查看当前驱动
docker info | grep "Storage Driver"

# 推荐overlay2
  1. 内核参数优化:
# /etc/sysctl.conf
vm.swappiness = 0
net.ipv4.ip_local_port_range = 1024 65535
  1. 容器内存限制:
docker run -m 2g --memory-swap=2g ...

6. 进阶实战项目

6.1 私有镜像仓库搭建

使用Registry官方镜像:

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /opt/registry:/var/lib/registry \
  registry:2

推送镜像到私有仓库:

docker tag myimage localhost:5000/myimage
docker push localhost:5000/myimage

6.2 CI/CD流水线集成

GitLab CI示例:

stages:
  - build
  - deploy

build_image:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

deploy_prod:
  stage: deploy
  script:
    - docker-compose -f docker-compose.prod.yml up -d

6.3 监控方案实施

Prometheus监控配置:

# docker-compose.yml
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  node-exporter:
    image: prom/node-exporter
    restart: unless-stopped

7. 生态工具推荐

  1. 可视化管理

    • Portainer:轻量级Web管理界面
    docker run -d -p 9000:9000 --name portainer \
      -v /var/run/docker.sock:/var/run/docker.sock \
      portainer/portainer
    
  2. 开发调试

    • Dive:镜像分析工具
    docker run --rm -it \
      -v /var/run/docker.sock:/var/run/docker.sock \
      wagoodman/dive:latest <image>
    
  3. 安全扫描

    • Trivy:漏洞扫描工具
    docker run --rm \
      -v /var/run/docker.sock:/var/run/docker.sock \
      aquasec/trivy image myimage:tag
    

8. 学习路径建议

  1. 基础阶段

    • 掌握Dockerfile编写规范
    • 熟悉常用CLI命令
    • 理解容器网络原理
  2. 进阶阶段

    • 学习Docker Compose编排
    • 实践多阶段构建
    • 研究存储驱动原理
  3. 生产级技能

    • 掌握Swarm/Kubernetes编排
    • 实现CI/CD流水线
    • 建立监控告警体系

个人经验:建议从实际项目入手,比如先将本地开发环境容器化,再逐步应用到测试和生产环境。遇到问题时, docker inspect 和日志分析是排障的利器。

更多推荐