悠悠楠杉
【程序源代码】docker精选操作,docker 源代码
一、镜像构建的艺术
"为什么我的镜像体积总是比预期大50%?"这是不少新手容易踩的坑。通过docker history
命令分析镜像层结构后,你会发现那些被遗忘的临时文件仍在占用空间。
多阶段构建实战:dockerfile
构建阶段
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
最终镜像
FROM alpine:latest
COPY --from=builder /app/myapp /
CMD ["/myapp"]
这个经典案例将1.2GB的构建环境最终压缩到仅15MB的Alpine镜像,体积缩减98%。关键在于:
1. 使用轻量级基础镜像
2. 分离构建环境和运行环境
3. 清除不必要的构建缓存
二、容器网络的精妙设计
当你在本地测试环境中运行docker network inspect bridge
时,可能没意识到这个默认网络正在成为性能瓶颈。生产环境中更推荐自定义网络:
bash
创建自定义覆盖网络
docker network create --driver overlay --subnet=10.0.9.0/24 myprodnet
容器接入指定网络
docker run -d --network=myprodnet --name=service1 nginx
这种配置带来的优势包括:
- 容器间通信自动加密
- 支持DNS服务发现
- 细粒度的流量隔离
三、持久化存储的智能方案
某电商平台曾因未配置持久化存储导致促销活动数据丢失。正确的做法应该是:
bash
创建命名卷(推荐方案)
docker volume create mysql_data
挂载到容器
docker run -d \
-v mysqldata:/var/lib/mysql \
-e MYSQLROOT_PASSWORD=secret \
mysql:8.0
关键决策点:
- 开发环境可使用bind mount
直接挂载主机目录
- 生产环境务必使用named volume
确保数据安全
- 分布式存储考虑CSI插件集成
四、资源限制的实战经验
当某个容器突然占用90%的CPU时,整个集群都可能崩溃。通过以下配置预防:
bash
docker run -d \
--cpus=2 \
--memory=1g \
--memory-swap=1g \
--pids-limit=100 \
nginx
这些参数背后是Linux内核的:
- Cgroups控制CPU份额
- OOM Killer内存管理
- PID数量限制
五、企业级监控方案
简单的docker stats
已不能满足生产需求。推荐组合:
1. Prometheus收集Docker引擎指标
2. cAdvisor监控容器资源
3. Grafana构建可视化看板
配置示例:yaml
docker-compose.yml
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
最佳实践总结
- 镜像构建遵循"最小化原则"
- 生产环境必须配置资源限制
- 重要数据使用volume持久化
- 网络配置考虑安全隔离
- 监控系统需要覆盖容器生命周期