[TOC]

学习参考:https://yeasy.gitbooks.io/docker_practice/repository/registry.html

Docker 优化使用

1.Dockerfile 最佳实践

容器应该是短暂的,短暂意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的
下面列出了Dockerfile最佳实践的一些要素方法:

  • 学习Docker的hub中官方仓库中镜像和对应的Dockerfile;
  • 提高构建镜像的效率:使用.dockerignore文件来要忽略的文件和目录与指定上下文环境(Dockerfile目录尽量为空)
  • 使用精简镜像(选择合适的镜像)/避免安装不必要的包(指定软件版本号)/多阶段构建,来减少所构建镜像的大小,降低复杂性、减少依赖、节约构建时间
  • 减少镜像层数,则要尽量合并指令(调整合理的指令顺序),例如多个RUN指令可以合并为一条 (别使用yum upgrade来更新)
  • 增加可读性将多行参数排序, 建议在反斜杠符号 \ 之前添加一个空格;
  • 保证容器的横向扩展和复用, 一个容器只运行一个进程,将多个应用解耦到不同容器中(类似于微服务)
  • 构建缓存:查找是否已经存在可重用的镜像,如果有就使用现存的镜像不再重复创建 (一旦缓存失效,所有后续的 Dockerfile 指令都将产生新的镜像,缓存不会被使用) - 在开启缓存的情况下,内容不变的指令尽量放在前面
  • 及时删除临时文件和缓存文件,特别是在执行apt-get指令后 /var/cache/apt 下面会缓存一些安装包;


2.Dockerfile 指令最佳实践
  • FROM:尽可能使用当前官方仓库作为你构建镜像的基础
  • LABEL: 一个镜像可以包含多个标签但建议将多个标签放入到一个 LABEL 指令中
  • RUN:将长的或复杂的 RUN 指令用反斜杠 \ 分割成多行 (不要使用 RUN apt-get upgrade 或 dist-upgrade,因为许多基础镜像中的「必须」包不会在一个非特权容器中升级,而且建议使用指定版本的形式)
  • CMD:用于执行目标镜像中包含的软件可以包含参数
  • EXPOSE:在执行 docker run 时使用一个标志来指示如何将指定的端口映射到所选择的端口
  • ENV: 为了方便新程序运行,你可以使用 ENV 来为容器中安装的程序更新 PATH 环境变量
  • ADD 和 COPY(优先使用它),了让镜像尽量小最好不要使用 ADD 指令从远程 URL 获取包,而是使用 curl 和 wget
  • ENTRYPOINT: 最佳用处是设置镜像的主命令,允许将镜像当成命令本身来运行(用 CMD 提供默认选项)。
  • VOLUME: 强烈建议使用它来管理镜像中的可变部分和用户可以改变的部分。
  • USER:如果某个服务不需要特权执行,建议使用 USER 指令切换到非 root 用户(你应该避免使用 sudo),同时也避免频繁地使用USER来回切换用户。
    • 使用类似 RUN groupadd -r postgres && useradd -r -g postgres postgres 的指令创建用户和用户组。
  • WORKDIR:为了清晰性和可靠性建议都使用结对路径;


3.Dockerfile 操作系统

Docker拥有自己的操作系统,完全基于于 Docker 的Linux发行版CoreOS。
目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列。

  • 前者以自带软件包版本较新而出名
  • 后者则宣称运行更稳定一些


0x01 docker页面化管理

1. dockerui

描述:Dockerui是基于docker API提供图形化页面简单的容器管理系统,支持容器管理和镜像管理;容器信息查看只是画面比较酷,不怎么实用用来看看为以后造轮子也是极好;

$docker pull abh1nav/dockerui
#两种启动方法一种是sock,另外一种是是rest API
$docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock \
--name dockerui abh1nav/dockerui:latest -e="/docker.sock"

WeiyiGeek.dockerui


2. shipyard

0x03 docker监控