目录

使用docker构建应用

如何保持图像小

在启动容器或服务时,小图像可以更快地通过网络,并且可以更快地加载到内存中。有一些经验法则可以保持图像尺寸小:

  • 从适当的基本图像开始。例如,如果您需要JDK,请考虑将您的图像基于官方openjdk图像,而不是从通用ubuntu图像开始并openjdk作为Dockerfile的一部分进行安装。

  • 使用多级构建。例如,您可以使用该maven映像构建Java应用程序,然后重置为tomcat映像并将Java工件复制到正确的位置以部署您的应用程序,所有这些都在同一个Dockerfile中。这意味着您的最终图像不包含构建所引入的所有库和依赖项,而只包含运行它们所需的工件和环境。

    • 如果您需要使用不包含多级构建的Docker版本,请尝试通过最小化RUNDockerfile 中单独命令的数量来减少图像中的图层数。您可以通过将多个命令合并为RUN一行并使用shell的机制将它们组合在一起来实现此目的。考虑以下两个片段。第一个在图像中创建两个图层,而第二个图层仅创建一个图层。

      1
      2
      
      RUN apt-get -y update
      RUN apt-get install -y python
      
      1
      
      RUN apt-get -y update && apt-get install -y python
      
  • 如果您有多个共同点的图像,请考虑使用共享组件创建自己的基本图像,并在其上创建独特的图像。Docker只需要加载公共层一次,然后缓存它们。这意味着您的衍生图像可以更有效地使用Docker主机上的内存并加载更快。

  • 要使生产映像保持精简但允许调试,请考虑使用生产映像作为调试映像的基本映像。可以在生产映像之上添加其他测试或调试工具。

  • 在构建图像时,始终使用有用的标记对其进行标记,这些标记用于编码版本信息,预期目标(prod或者test,例如),稳定性或在不同环境中部署应用程序时有用的其他信息。不要依赖自动创建的latest标签。

在何处以及如何保留应用程序数据

  • 避免使用存储驱动程序将应用程序数据存储在容器的可写层中 。这会增加容器的大小,从I/O角度来看,与使用卷或绑定装载相比效率较低。
  • 而是使用卷存储数据。
  • 适合使用bind mounts的一种情况 是在开发期间,您可能希望将源目录或刚刚构建的二进制文件挂载到容器中。对于生产,请使用卷,将其安装到与开发期间装入绑定装置相同的位置。
  • 对于生产,使用secrets来存储服务使用的敏感应用程序数据,并对 配置文件等非敏感数据使用configs。如果您当前使用独立容器,请考虑迁移以使用单一副本服务,以便您可以利用这些仅限服务的功能。

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

  • 当您检查对源代码管理的更改或创建拉取请求时,请使用CI/CD自动构建和标记Docker镜像并对其进行测试。

开发和生产环境的差异

发展 生产
使用bind mounts为您的容器提供对源代码的访问权限。 使用卷来存储容器数据。
使用Docker for Mac或Docker for Windows。 如果可能,请使用Docker EE,并使用userns-remap以更好地隔离Docker进程与主机进程。
不要担心时间漂移。 始终在Docker主机上和每个容器进程内运行NTP客户端,并将它们全部同步到同一个NTP服务器。如果使用swarm服务,还要确保每个Docker节点将其时钟与容器同步到同一时间源。