事实证明,以下的开发模式会帮助你用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节点将其时钟同步到与容器相同的时间源。 |