【Docker记录】Docker开发最佳实践

 事实证明,以下的开发模式会帮助你用Docker构建应用,如果发现有哪些需要添加的东西,请告诉我们。

如何让你的镜像缩小

当你启动容器或服务时,小的镜像会更快的从网络拉取,更快的加载到内存中。下面有一些经验方法使你的镜像变小:

  • 从一个合适的基础镜像开始。例如,你需要jdk,考虑用官方 openjdk镜像,而不是用通用的 ubuntu镜像再安装 openjdk。
  • 使用多级构建。例如,你可以使用maven镜像构建你的java程序,然后复制java程序到tomcat镜像的正确位置,所有这些都在同一个Dockerfile中。这就意味着你的最终镜像不包括构建时所有的jar包和依赖,只有程序需要的运行环境。
  • 如果你需要不包含多级构建的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只需加载一次公共层,然后会被缓存。这就意味着你的派生镜像使用Docker内存更高效,加载更快。

  • 要保持你的生产镜像精简但是允许debug,考虑使用生产镜像作为调试镜像的基础镜像。附加的测试工具可以添加到生产镜像的顶部。
  • 当构建镜像时,始终使用有用的标记进行标记,在不同的环境中部署应用程序时,它会对版本信息、预期目标(例如prod或test)、稳定性或其他有用的信息进行编码。不要依赖于自动创建的最新(latest )标记。

如何保存应用程序数据

  • 避免使用storage drivers存储应用数据在应用可写层。这会增加容器的大小,从I/O的角度来看,与使用卷或bind挂载相比,效率更低。
  • 相反,使用卷(volumes)存储数据。
  • 举个例子,在开发过程中使用bind 挂载是合适的,当你想挂载你的源目录或者二级制文件,你只需要构建到你的容器里。生产环境,请使用volume代替mounte。
  • 在生产环境,使用secrets来保存敏感数据,使用configs来保存配置文件等。如果你当前使用的是独立容器,考虑迁移以使用单个副本服务,这样您就可以利用这些只提供服务的功能了。

使用CI/CD进行测试和部署

  • 当你源代码有改变或创建pull请求时,使用Docker Hub或CICD管道,自动构建和打标签。
  • 通过要求您的开发、测试和安全团队在将映像部署到生产环境之前对其进行签名,从而进一步实现这一点
  • 这样,在镜像部署在生产环境之前,他经过开发,质量和安全团队的测试和部署。

开发和生产环境的差异

Development

Production

使用bind mount 存储应用数据

使用 volumes 存储应用数据

使用Docker Desktop for Mac或for Windows。

使用Docker引擎(如果可能的话)和usernamespace映射一起使用,以便将Docker进程与主机进程更好地隔离开来。

别担心时间的不同。

始终在Docker主机上和每个容器进程中运行NTP客户端,并将它们全部同步到同一个NTP服务器。如果您使用swarm服务,还要确保每个Docker节点将其时钟同步到与容器相同的时间源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值