Docker最佳实践
这里主要针对制作Docker镜像,汇总常见的正确使用方式:
制作镜像
使用继承镜像
如果要制作包含Tomcat和Java运行环境的镜像, 建议先基于CentOS制作Java镜像,接着基于它做Tomcat镜像。
centos7-java8 > centos7-java8-tomcat8
在一个容器最好只运行一个进程
制作合适层数的镜像
避免只包含一层,也避免太多层。常用的方式例如:
- 基于操作系统的定制基础镜像
- 新用户创建准备
- 安装运行时
- 配置
- 应用层
定义.dockerignore
使用WORKDIR
注意顺序,依照构建过程(不变的在前)
缩减镜像尺寸
镜像的选择:
Ubuntu > openjdk:8-alpine > tomcat:8.5-alpine
常用清除命令
# Alpine
apk add --no-cache curl
# CentOS
yum clean all
# Ubuntu
rm -rf /var/lib/apt/lists/*
使用Health Check
HEALTHCHECK CMD curl --fail http://localhost || exit 1
--interval=10s
--timeout=10s
--start-period=30s
# 检查状态
docker ps response
Java应用性能优化
JVM
应该指定 -Xmx
使用docker资源限制
- --memory 等价于 -m
- --memory-reservation
- --cpus
如果CPU被限制,需要同时设置 -XX:ParallelGCThreads
内存默认不设置任何限制:
- --memory=1G 设置最大值
- --memory-swap=1G
- -1为没有限制
- 默认=memory
- --oom-kill-disable 禁用OOM Killer
日志处理
不建议写到容器的RW层,应该发送到数据卷(NAS/SAN)或使用 Docker Log Drivers.
问题诊断
JVM命令:
GC Stats: jstat –gcutil
Heap Dump/直方图: jmap
Docker命令: docker stats
ctop