← 返回首页
一、Docker 核心原理
- 容器 vs 虚拟机:容器共享宿主机内核,轻量级(MB 级),秒级启动;VM 有独立内核,GB 级,分钟级启动
- Namespace:资源隔离(PID/Network/Mount/UTS/IPC/User),每个容器有独立的进程树、网络栈、文件系统
- Cgroups:资源限制,控制容器的 CPU、内存、磁盘 IO、网络带宽使用量
- UnionFS 联合文件系统:分层存储,镜像层只读 + 容器层可写(Copy-on-Write),OverlayFS 主流驱动
二、镜像管理
- 镜像分层:每条 Dockerfile 指令生成一层,层可共享复用,减少存储和传输
- 常用命令:
docker pull / docker images / docker rmi / docker tag / docker push
- 镜像仓库:Docker Hub(公共)/ Harbor(企业私有)/ 阿里云 ACR
Dockerfile 最佳实践
- 多阶段构建:编译阶段和运行阶段分离,最终镜像只包含运行时依赖,大幅减小体积
- 合并 RUN:多条命令用
&& 连接减少层数,末尾清理缓存 rm -rf /var/cache/*
- 利用缓存:不常变的指令放前面(如 COPY package.json),频繁变化的放后面(如 COPY src/)
- 基础镜像选择:alpine(~5MB 极小)/ slim(精简)/ distroless(无 shell,更安全)
- .dockerignore:排除 node_modules、.git、日志等无关文件,加速构建
三、容器操作
- 生命周期:Created → Running → Paused → Stopped → Deleted
- 启动:
docker run -d --name app -p 8080:80 -v data:/app/data image:tag
- 常用参数:
-d(后台)/ -p(端口映射)/ -v(挂载卷)/ -e(环境变量)/ --restart=always(自动重启)
- 进入容器:
docker exec -it container bash
- 日志查看:
docker logs -f --tail 100 container
- 资源限制:
--memory=512m --cpus=1.5 限制内存和 CPU
四、网络模式
- bridge(默认):虚拟网桥 docker0,容器通过 veth pair 连接,NAT 访问外部
- host:共享宿主机网络栈,无网络隔离,性能最好
- none:无网络,完全隔离
- 自定义网络:
docker network create mynet,同网络容器可通过容器名互相访问(内置 DNS)
- 容器间通信:推荐自定义 bridge 网络,避免使用
--link(已废弃)
五、数据持久化
- Volume(推荐):Docker 管理的存储,
docker volume create,数据独立于容器生命周期
- Bind Mount:挂载宿主机目录,
-v /host/path:/container/path,开发环境常用
- tmpfs:内存临时存储,容器停止即丢失,适合敏感数据
- 备份恢复:
docker run --volumes-from db -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data
六、Docker Compose
- 定义:多容器应用编排工具,YAML 文件定义服务、网络、卷
- 常用命令:
docker compose up -d / down / logs / ps / restart
- 服务依赖:
depends_on 控制启动顺序(不等待就绪,需配合健康检查)
- 健康检查:
healthcheck 配置检测命令、间隔、超时、重试次数
- 环境变量:
.env 文件 / environment 字段 / env_file 引用外部文件
- 典型场景:本地开发环境一键启动(App + MySQL + Redis + Nginx)
七、生产实践
- 安全:非 root 用户运行(USER 指令)、只读文件系统(--read-only)、扫描镜像漏洞(Trivy)
- 日志管理:json-file(默认)/ syslog / fluentd,配置
max-size 和 max-file 防止磁盘撑满
- 监控:
docker stats 实时资源占用、cAdvisor + Prometheus 采集容器指标
- 镜像瘦身:多阶段构建 + alpine 基础镜像 + 清理缓存,目标:Java 应用 <200MB