1. Docker入门与核心概念解析

Docker作为当前最流行的容器化技术,已经成为开发者必备技能之一。我第一次接触Docker是在2014年,当时为了解决开发环境不一致的问题,现在它已经发展成完整的应用交付平台。对于初学者来说,掌握Docker的核心概念和基础操作是迈向容器化开发的第一步。

容器技术的本质是进程隔离,与虚拟机不同,Docker容器共享主机操作系统内核,通过命名空间(Namespace)和控制组(CGroup)实现资源隔离。这种架构使得容器启动速度极快(通常只需毫秒级),资源占用也远低于传统虚拟机。

重要提示:在Windows/macOS上使用Docker Desktop时,实际是通过轻量级Linux虚拟机运行容器,这与Linux原生环境有细微差异。

2. Docker环境搭建实战

2.1 多平台安装指南

不同操作系统下的Docker安装方式有所差异:

Windows环境:

  1. 确保启用Hyper-V和WSL2功能
  2. 下载Docker Desktop安装包(推荐稳定版)
  3. 安装后需重启系统
  4. 首次启动时可能提示"Starting the Docker Engine...",这是正常初始化过程

macOS环境:

# 使用Homebrew安装更便捷
brew install --cask docker

Linux环境(以Ubuntu为例):

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 设置仓库
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加源
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
sudo docker run hello-world

2.2 安装后配置优化

  1. 镜像加速 :国内用户建议配置镜像仓库
# 创建/修改daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF

# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 用户组配置 :避免每次使用sudo
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker  # 立即生效

3. Docker核心命令精讲

3.1 镜像操作命令集

命令 说明 常用参数
docker pull 拉取镜像 --platform 指定架构
docker images 查看本地镜像 -a 显示所有
docker rmi 删除镜像 -f 强制删除
docker build 构建镜像 -t 打标签
docker tag 给镜像打标签
docker save 导出镜像 -o 输出文件
docker load 导入镜像 -i 输入文件

镜像搜索与获取示例:

# 搜索官方Nginx镜像
docker search nginx

# 拉取指定版本
docker pull nginx:1.23-alpine

# 查看镜像详情
docker inspect nginx:1.23-alpine

3.2 容器生命周期管理

典型工作流程:

  1. 创建容器: docker create
  2. 启动容器: docker start
  3. 查看运行状态: docker ps
  4. 停止容器: docker stop
  5. 删除容器: docker rm

实用组合命令:

# 运行并自动删除临时容器
docker run --rm -it ubuntu bash

# 后台运行并设置自动重启策略
docker run -d --restart=unless-stopped nginx

# 查看容器日志
docker logs -f --tail=100 容器ID

3.3 网络与存储配置

网络模式对比:

模式 说明 适用场景
bridge 默认桥接网络 单机容器通信
host 共享主机网络 高性能需求
none 无网络 特殊隔离场景
overlay 跨主机网络 Swarm集群

数据卷操作示例:

# 创建命名卷
docker volume create mydata

# 挂载卷到容器
docker run -v mydata:/app/data nginx

# 绑定主机目录
docker run -v /host/path:/container/path nginx

4. Dockerfile深度解析

4.1 最佳实践指南

  1. 多阶段构建 :减少最终镜像体积
# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 运行阶段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
  1. 层优化技巧
  • 合并RUN命令减少层数
  • 变动频繁的指令放后面
  • 使用.dockerignore文件
  1. 安全建议
  • 不要以root用户运行
  • 使用官方基础镜像
  • 定期更新基础镜像

4.2 典型Dockerfile示例

Python应用示例:

FROM python:3.11-slim

# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 安装依赖
RUN apt-get update && apt-get install -y \
    gcc \
    python3-dev \
    && rm -rf /var/lib/apt/lists/*

# 创建工作目录
WORKDIR /app

# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8000

# 运行命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app.wsgi"]

5. Docker Compose实战

5.1 编排文件结构解析

典型docker-compose.yml示例:

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - app

  app:
    build: .
    environment:
      - DB_HOST=db
      - DB_PORT=5432
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

5.2 常用操作命令

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

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f web

# 停止服务
docker-compose down

# 重建单个服务
docker-compose up -d --no-deps --build web

6. 常见问题排查手册

6.1 启动类问题

问题1:Docker Desktop启动失败

  • 现象:卡在"Starting the Docker Engine..."
  • 解决方案:
    1. 检查虚拟化是否启用(BIOS设置)
    2. 重置Docker Desktop到出厂设置
    3. 清理旧数据: docker system prune -a

问题2:端口冲突

# 查找占用端口的进程
sudo lsof -i :8080

# 杀死进程
sudo kill -9 <PID>

6.2 网络连接问题

跨容器通信失败排查:

  1. 检查网络模式: docker network inspect bridge
  2. 测试基础连接:
docker run --rm busybox ping <目标容器IP>
  1. 检查防火墙规则

6.3 存储卷问题

权限问题处理:

# 查看容器内文件权限
docker exec -it 容器ID ls -l /path

# 临时解决方案(不推荐生产使用)
docker run -v /host/path:/container/path:z nginx

7. 进阶实战练习

7.1 多容器应用部署

目标 :部署WordPress+MySQL完整应用

version: '3.8'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  wordpress:
    depends_on:
      db:
        condition: service_healthy
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

7.2 CI/CD集成示例

GitLab CI配置示例:

stages:
  - build
  - test
  - deploy

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

build:
  stage: build
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

test:
  stage: test
  script:
    - docker run --rm $IMAGE_TAG npm test

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

8. 性能优化与安全加固

8.1 容器资源限制

# 内存限制示例
docker run -it --memory="512m" --memory-swap="1g" ubuntu

# CPU限制示例
docker run -it --cpus="1.5" ubuntu

# IO限制
docker run -it --device-read-bps="/dev/sda:1mb" ubuntu

8.2 安全最佳实践

  1. 镜像扫描
docker scan nginx:latest
  1. 最小权限原则
FROM alpine
RUN adduser -D myuser
USER myuser
  1. 敏感信息管理
# 使用Docker secret
echo "mydbpassword" | docker secret create db_pass -

9. 生产环境部署建议

9.1 监控方案

Prometheus+Grafana监控配置:

version: '3.8'

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

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana

  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'

volumes:
  grafana_data:

9.2 日志管理

ELK栈配置示例:

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.9.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"

  logstash:
    image: docker.elastic.co/logstash/logstash:8.9.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:8.9.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

volumes:
  es_data:

10. 扩展学习资源

10.1 官方文档重点

10.2 推荐学习路径

  1. 基础阶段

    • 容器生命周期管理
    • 基础网络配置
    • 数据卷使用
  2. 中级阶段

    • Dockerfile优化
    • Compose编排
    • 多阶段构建
  3. 高级阶段

    • Swarm集群
    • Kubernetes集成
    • 安全加固

10.3 实用工具推荐

  1. 开发辅助

    • Dive:镜像层分析工具
    • ctop:容器监控工具
    • lazydocker:终端UI管理工具
  2. 测试工具

    • container-structure-test:镜像结构测试
    • Dockle:镜像安全检查
  3. 构建优化

    • BuildKit:下一代构建引擎
    • Earthly:改进的构建工具

在实际工作中,我发现很多团队在使用Docker时容易忽视构建缓存机制,导致CI/CD流水线效率低下。一个实用的技巧是合理组织Dockerfile指令顺序,将变动频率低的指令(如基础包安装)放在前面,变动频繁的指令(如应用代码复制)放在后面。这样可以最大化利用构建缓存,显著减少构建时间。

更多推荐