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

一些镜像资源

参考