[Docker] 容器开发环境最佳实践理论
保持 image 小
选择合适的 base image。
使用 multi-stage 构建。 https://docs.docker.com/develop/develop-images/multistage-build/
如果多个 image 有共同之处,考虑创建一个 base image 来共享组件,并在其上构建 image。
保持生产 image 小并支持 debug,考虑使用生产 image 作为 base image 来 debug image。
构建 image 时,总是使用 版本信息,目标环境(prod,test) 来打标签,而不要依赖自动创建的 latest 标签。
在哪里和如何持久化应用数据
不要把数据存储在容器的可写层,相比使用 volume 和绑定mounts,增加了 container 大小且I/O低效。
作为代替,使用 volumes 存储数据。
使用 bind mounts 更适合在开发期间。
生产中使用 secrets 来存储敏感数据,对非敏感数据使用 configs。
在可能的情况下使用 swarm 服务
可能的情况下,使用 swarm 服务设计你的应用并具有规模化的能力。
即使只需要运行一个独立的应用实例,swarm services 提供了一些高级特性,servies 配置是说明性的,docker总是让实际状态与预期的保持同步。
网络和volumns 可以在 swarm services 中连接和断开,docker 使用非破坏的方式重新部署独立的服务。独立的容器需要根据配置改变手动停止删除创建。
若干特性,如存储 secrets 和 configs 的能力,让 image 尽可能通用,image 和 container 不存储敏感信息。
让 docker stack deploy 代替 docker pull,当新节点添加到 swarm,imags会自动被pull。
对测试和部署使用 CI/CD
当版本控制检测到变更或pull request,使用 Docker Cloud 或其他 CI/CD 管道自动 build 和 tag image 并测试。Docker Cloud 可以部署app直接到生产环境。
开发环境和生产环境的不同之处
Refer:什么是容器开发
Other:Play-with-docker