1. Docker基础概念与核心组件
Docker作为现代应用容器化的标准工具,其核心价值在于通过轻量级的虚拟化技术实现应用与环境的隔离打包。与传统的虚拟机不同,Docker容器直接共享主机操作系统内核,这使得容器启动速度极快(通常只需毫秒级),资源占用仅为传统虚拟机的1/10左右。
Docker架构主要由三个核心组件构成:
- Docker Daemon:常驻后台的守护进程,负责管理镜像、容器、网络等核心对象
- Docker Client:用户通过命令行或API与之交互的客户端工具
- Registry:镜像仓库服务(默认使用Docker Hub),用于存储和分发镜像
注意:在Windows/macOS上安装Docker Desktop时,常见的"virtualization support not detected"错误通常需要进入BIOS启用VT-x/AMD-V虚拟化支持,部分杀毒软件的Hyper-V功能也可能导致冲突。
2. 镜像管理命令详解
2.1 镜像获取与查询
# 从仓库拉取镜像(默认使用latest标签) docker pull nginx:1.21 # 查看本地镜像列表(按创建时间倒序) docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 4 -h # 搜索Docker Hub中的镜像(按星级过滤) docker search mysql --filter=stars=10002.2 镜像构建与推送
# 通过Dockerfile构建镜像(带缓存机制) docker build -t myapp:v1 --build-arg ENV=prod . # 给镜像打新标签(用于多仓库推送) docker tag myapp:v1 registry.example.com/dev/myapp:v1 # 登录私有仓库并推送镜像 docker login registry.example.com -u username -p password docker push registry.example.com/dev/myapp:v12.3 镜像维护技巧
- 清理悬空镜像:
docker image prune -f - 查看镜像分层:
docker history nginx:1.21 - 导出/导入镜像:
docker save -o nginx.tar nginx:1.21 docker load -i nginx.tar
3. 容器生命周期管理
3.1 容器启停操作
# 启动容器并映射端口(-d后台运行) docker run -d -p 8080:80 --name web nginx:1.21 # 优雅停止容器(发送SIGTERM信号) docker stop web # 强制终止容器(发送SIGKILL信号) docker kill web # 重启策略配置(容器崩溃自动重启) docker run -d --restart=unless-stopped redis3.2 容器状态监控
# 查看运行中的容器(带状态过滤) docker ps --filter "status=running" # 查看容器资源占用(类似top命令) docker stats --no-stream # 查看容器日志(带时间戳和尾部跟踪) docker logs -ft --tail 100 web3.3 容器调试技巧
# 进入运行中容器的shell环境 docker exec -it web /bin/bash # 从容器内拷贝文件到宿主机 docker cp web:/etc/nginx/nginx.conf ./nginx.conf.bak # 查看容器元数据(包括IP、挂载点等) docker inspect web | jq '.[0].NetworkSettings'4. 存储与网络配置
4.1 数据持久化方案
# 创建命名卷(推荐生产环境使用) docker volume create mysql_data # 挂载主机目录(开发调试常用) docker run -v /host/path:/container/path nginx # 使用临时内存文件系统 docker run --tmpfs /app/cache:size=100m,exec app4.2 网络模式对比
| 模式 | 特点 | 适用场景 |
|---|---|---|
| bridge | 默认模式,NAT转发 | 单机多容器通信 |
| host | 直接使用主机网络 | 高性能网络需求 |
| overlay | 跨主机虚拟网络 | Swarm集群部署 |
| macvlan | 为容器分配MAC地址 | 需要真实IP的场景 |
# 创建自定义bridge网络 docker network create --driver=bridge --subnet=172.28.0.0/16 mynet # 查看容器网络详情 docker network inspect mynet5. 生产环境最佳实践
5.1 资源限制配置
# 限制CPU和内存使用(防止OOM) docker run -d --cpus=1.5 --memory=2g --memory-swap=3g app # 磁盘IO限制(需启用--storage-opt) docker run --storage-opt size=10G ubuntu5.2 安全加固措施
# 以非root用户运行容器 docker run -u 1000:1000 app # 禁用危险的内核功能 docker run --cap-drop=NET_RAW secure-app # 只读文件系统(需配合tmpfs使用) docker run --read-only --tmpfs /tmp app5.3 日志与监控集成
# 配置日志驱动(输出到syslog) docker run --log-driver=syslog --log-opt syslog-address=udp://logserver:514 app # 使用Prometheus监控指标 docker run -p 8080:8080 --expose 8080 -e METRICS_PORT=8080 app6. Docker Compose编排实战
6.1 多服务定义示例
version: '3.8' services: web: image: nginx:1.21 ports: ["80:80"] volumes: ["./conf:/etc/nginx/conf.d"] depends_on: [app] app: build: ./app environment: - DB_HOST=db healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] db: image: postgres:13 volumes: ["pgdata:/var/lib/postgresql/data"] environment: POSTGRES_PASSWORD_FILE: /run/secrets/db_pass secrets: - db_pass volumes: pgdata: secrets: db_pass: file: ./secrets/db_password.txt6.2 常用操作命令
# 启动所有服务(后台模式) docker-compose up -d # 查看服务日志(带颜色标记) docker-compose logs -f --tail=50 web # 执行一次性命令(在指定服务中) docker-compose run --rm app python manage.py migrate # 水平扩展服务实例数 docker-compose up -d --scale app=37. 常见问题排查指南
7.1 容器启动失败分析
# 查看容器退出码含义 docker inspect --format='{{.State.ExitCode}}' failed-container # 常见退出码: # 0 正常退出 # 1 应用错误 # 125 Docker守护进程错误 # 137 SIGKILL终止 # 143 SIGTERM终止7.2 网络连接问题排查
# 测试容器间连通性 docker exec -it web ping app # 检查DNS解析 docker exec -it web cat /etc/resolv.conf # 查看iptables规则(影响端口映射) sudo iptables -t nat -L -n7.3 性能问题诊断
# 检查容器进程树 docker top web -e f # 分析容器系统调用 docker run --privileged --pid=host -it alpine:3.14 nsenter -t 1 -m -u -n -i sh # 生成CPU火焰图(需安装perf) docker run --cap-add=SYS_ADMIN --pid=host -it ubuntu bash -c \ "apt update && apt install -y linux-perf && perf record -F 99 -a -g -- sleep 30"8. 进阶技巧与工具链
8.1 多阶段构建优化
# 构建阶段 FROM golang:1.18 as builder WORKDIR /app COPY . . RUN CGO_ENABLED=0 go build -o server . # 最终镜像 FROM alpine:3.15 COPY --from=builder /app/server /usr/bin/ CMD ["server"]8.2 镜像安全扫描
# 使用Trivy扫描漏洞 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image --severity CRITICAL nginx:1.21 # 使用Dive分析镜像层 docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock \ wagoodman/dive:latest nginx:1.218.3 开发环境加速
# 使用BuildKit并行构建(需设置环境变量) DOCKER_BUILDKIT=1 docker build -t app . # 配置国内镜像加速器(在/etc/docker/daemon.json) { "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn" ] }9. 典型应用场景示例
9.1 数据库容器化部署
# MySQL主从复制配置 docker run -d --name mysql-master \ -e MYSQL_ROOT_PASSWORD=secret \ -v mysql-master-data:/var/lib/mysql \ mysql:8.0 \ --server-id=1 --log-bin=mysql-bin --binlog-format=ROW docker run -d --name mysql-slave \ --link mysql-master:master \ -e MYSQL_ROOT_PASSWORD=secret \ -v mysql-slave-data:/var/lib/mysql \ mysql:8.0 \ --server-id=2 --log-bin=mysql-bin --binlog-format=ROW \ --relay-log=mysql-relay-bin --read-only=19.2 CI/CD流水线集成
# GitLab Runner的Docker执行器配置示例 [[runners]] name = "docker-runner" url = "https://gitlab.com/" executor = "docker" [runners.docker] image = "alpine:latest" privileged = true volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]9.3 微服务架构支持
# 使用Docker Swarm部署服务栈 docker swarm init docker stack deploy -c docker-compose.yml myapp # 滚动更新策略配置 docker service update \ --image myapp:v2 \ --update-parallelism 2 \ --update-delay 10s \ --update-order start-first \ myapp_web