基于docker开发的最佳实践

翻译自docker官方文档,原文:https://docs.docker.com/develop/dev-best-practices/

下面的开发模式已被证明是对基于docker开发应用的人们有帮助的。如果你发现了其他我们应该加入的东西,请告诉我们。

怎样让镜像保持小巧

小的镜像能更快地通过网络拉取而且在启动容器或服务时能更快地加载到内存。下面是一些保持镜像小巧的经验法则(rules of thumb)。

  • 基于一个合适的基础镜像。比如,如果你需要JDK,考虑让你的镜像基于官方的openjdk镜像,而不要从一个普通的ubuntu镜像开始再在Dockerfile中安装openjdk。
  • 使用多级构建。比如,你可以用maven镜像构建你的Java应用,然后重置(reset)到tomcat镜像并把构建好的Java组件拷贝到正确的位置来发布你的应用,所有这些操作都可以在一个Dockerfile中。这意味着你最后的镜像不会包含构建过程中被拉取的库和依赖,只包含最终的组件和运行他们所需的环境。
    如果你要使用不包含多级构建功能的docker版本,尝试减少镜像中层的数量,通过最小化Dockerfile中独立的RUN命令的数量。你可以把多条命令合并到一个RUN行并用shell技巧来把他们组合成一句。考虑下面的两种情况,前者在镜像中创建了两层,而后者只创建了一层。
RUN apt-get -y update
RUN apt-get install -y python
RUN apt-get -y update && apt-get install -y python
  • 如果你有多个镜像而且它们又有很多公共部分,考虑用公共部分创建你自己的基础镜像,并且基于这个镜像构建其他特有的镜像。这意味着你使用docker宿主机的内存来派生镜像能更高效而且加载更快。
  • 要保持你生产环境的镜像小巧又支持调试(debug),尝试把生产环境用的镜像作为调试用镜像的基础镜像。额外的测试或调试工具可以加在生产用镜像之上。
  • 当构建镜像时,记得用有效的标签标记它们,标签应该包含版本信息,目标环境(比如prod或test),稳定性和其他在不同环境部署应用时有用的信息。不要依赖自动生成的latest标签。

把应用数据存到哪里,怎样存储

  • 不要通过存储引擎把应用数据存到容器的可写层中。这会增加容器的大小而且从I/O角度看比数据卷或挂载点效率更低。
  • 取而代之的,使用数据卷存储数据。
  • 一种适合用挂载点的场景是开发过程中,当你想把你源代码目录或刚构建好的二进制文件挂载到容器中时。在生产环境,把数据卷代替,把它挂载到你开发时挂载点所在的位置。
  • 生产环境中,用秘密机制(secrets)来保存服务中用到的敏感应用数据,用配置机制(configs)来保存非敏感数据,如配置文件。如果你在使用独立的容器,考虑改成单副本的服务(single-replica services),这样你就能享受到这些只在服务中才有的好处。

尽可能使用集群服务

  • 如果可能,通过集群服务(swarm services)把你的应用设计成可扩展的。即使你只需运行一个应用实例,集群服务也能提供很多独立容器没有的优点。一个集群的配置是公开的,而且docker会确保同步状态(不确定翻译的对不对:A service’s configuration is declarative, and Docker is always working to keep the desired and actual state in sync.)。
  • 网络和数据卷可以与集群服务连接或断开,而且docker会以稳定的方式进行单一服务容器的重新部署。单独的容器则需要人为的停止,删除和为了更改配置而重新创建。
  • 一些特性,如存储秘密和配置的能力(译者注:指secrets和configs两个机制)只在服务中可用,在单独的容器中不可用。这些特性能让你的镜像尽可能普通,而且能避免在镜像或容器内部存储敏感数据。
  • 让docker stack帮你处理镜像拉取工作,而不是使用docker pull命令。这样,你发布过程中就不会尝试从挂掉的节点拉取镜像。而且当新节点加入到集群时,镜像会自动拉取。

在集群服务间共享数据是有限制的。如果你用的是Docker for AWSDocker for Azure,你可以使用Cloudstor插件进行集群服务节点间的数据共享。你也可以把你的应用数据写到单独的支持并发更新的数据库中。

使用持续集成/持续部署(CI/CD)进行开发和测试

  • 当你在代码控制中进行了修改或创建了pull request时,用Docker Cloud或其他CI/CD流程自动构建docker镜像并打标签,然后测试它。Docker Cloud也能把测试过的应用直接发布到生产环境。
  • 使用Docker EE可以做更多,可以在把镜像发布到生产环境前,要求开发,测试和安全团队必须标记好该镜像。这样,你就能确保镜像被发布到生产环境前,已经被测试过,并被例如开发,测试和安全这些团队标记过。

开发和生产环境的区别

开发环境生产环境
使用挂载点让容器能访问到你的源码使用数据卷来保存容器数据
使用Docker for Mac 或 Docker for Windows如果可能,使用Docker EE,用 userns mapping在宿主机进程和docker进程间提供更好的隔离
不用担心时间偏移(time drift)总是要在docker宿主机和每个容器中运行一个NTP客户端,并把它们同步到同一个NTP服务器。如果你使用了集群服务,确保每个docker节点都把时钟同步到和容器相同的时间源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值