遵照这十一条,你就是 Docker 高手了

不少人最终仍是决定使用 Docker 解决问题。linux

Docker 的优势不少,好比:docker

一体化——将操做系统、库版本、配置文件、应用程序等所有打包装在容器里。从而保证 QA 所测试的镜像 (image) 会携带一样的行为到达生产环境。数据库

轻量——内存占用极小,只为主要过程分配内存。缓存

快读——一键启动,就像启动常见的 linux 过程同样快。安全

尽管如此,众多用户仍然只是把容器当作常见的虚拟机,而忘记了容器的一个重要特性:服务器

用后即弃微服务

正由于这一特色,一些用户须要改变他们对容器的观念,为了更好的使用与发挥 Docker 容器的价值,有一些事情是绝对不该该作的:性能

1.不要在容器(container)中存储数据测试

容器可能会被中断、被替换或遭到破坏。在容器中运行的 1.0 版应用程序很容易就会被 1.1 版取代,而不会对数据形成影响或致使数据丢失。所以,若是须要存储数据,请存储在卷 (volume) 中。在这一状况下,还应注意两个容器是否会在同一个卷上写入数据,这将致使损坏。请确保应用程序适用于写入共享的数据存储。ui

2.不要分两部分传送应用程序

有些人把容器看成虚拟机,因此他们大多会认为,应该将应用程序部署到现有正在运行的容器中。在须要不断部署和调试的开发阶段,可能确实如此;但对于 QA 和生产的持续交付 (CD) 渠道,应用程序应当是镜像的一部分。切记:容器转瞬即逝。

3.不要建立大尺寸镜像

大尺寸的镜像难以分配。请确保仅使用必需文件和库来运行应用程序。不要安装没必要要的数据包,也不要运行“更新”(yum update),这些操做会把大量文件下载到新的镜像层。

4.不要使用单层镜像

为了有效利用多层文件系统,请始终为操做系统建立属于本身的基本镜像层,而后为用户名定义建立一个层,为运行时安装建立一个层,为配置建立一个层,最后再为应用程序建立一个层。这样,从新建立、管理和分配镜像就会容易些。

5.不要从正在运行的容器中建立镜像

换句话说,不要使用"docker commit"命令来建立镜像。这一镜像建立方法不可复制,所以应彻底避免使用。请始终使用 Dockerfile 或其余任何可彻底复制的 S21(从源代码到镜像)方法,如此一来,若是存储在源代码控制存储库 (GIT) 中,就能够跟踪 Dockerfile 的变动状况。

6.不要只使用“最新版”标签

最新版标签就像 Maven 用户的“快照”(SNAPSHOT) 同样。容器具备多层文件系统这一基本特征,因此咱们鼓励使用标签。相信谁也不肯意在构建了几个月的镜像后,忽然发现应用程序由于父层(即 Dockerfile 中的 FROM)被新版本取代而没法运行(新版本没法向后兼容或从构建缓存中检索的“最新“版有误)这样的意外吧?在生产过程当中部署容器时也应避免使用”最新版“标签,这是由于没法跟踪当前运行的镜像版本。

7.不要在单个容器中运行一个以上进程

容器只运行一个进程(HTTP 守护进程、应用程序服务器、数据库)时效果最佳,但若是运行一个以上进程,在管理和检索日志以及单独更新进程时就会遇到不少麻烦。

8.不要在镜像中存储证书及使用环境变量。

不要在镜像中对任何用户名/密码进行硬编码操做。请使用环境变量从容器外部检索信息。Postgres 镜像就是这一原理的极佳诠释。

9.不要以 root 权限运行进程

“默认状况下,Docker 容器以 root 用户权限运行。(……)随着 Docker 技术日趋成熟,可以使用的安全默认选项愈来愈多。目前,要求 root 对其余用户来讲较为危险,另外,不是全部环境都可以使用 root。镜像应使用 USER 指令来为容器的运行指定非 root 用户。”(摘自《Docker 镜像做者指南》(Guidance for Docker Image Authors))

10.不要依赖 IP 地址

每一个容器都有本身的内部 IP 地址,若是启动而后中止容器,内部 IP 地址可能会发生变化。若是你的应用程序或微服务须要和另外一个容器进行通讯,请使用环境变量在容器之间传递相应的主机名和端口。

11.监控容器

Docker 监控已经愈来愈受到开发者们的重视,实时监控 Docker 的方法,这里推荐 Cloudinsight。 不一样于一些须要自写脚本的监控手段,Cloudinsight 做为一家免费的 SaaS 服务,可以一键监控 Docker,且拥有很棒的可视化界面。除此以外,Cloudinsight 还支持多种操做系统、数据库等的监控,可以一体化展现全部被监控的系统基础组件的性能数据。

遵照这十一条,你就是 Docker 高手了!

相关文章
相关标签/搜索