重新创建 Docker 个图像而不是重复使用 - 用于微服务
Recreating Docker images instead of reusing - for microservices
一个微服务保留在一个 docker 容器中。现在,假设我要升级微服务——例如,更改了一些配置,我需要重新运行它。
我有两个选择:
我可以尝试重新使用现有图像,方法是在容器启动时使用 运行s 脚本,并通过从某些容器读取新配置(如果有)来更新微服务共享卷。更新后,脚本 运行s 微服务。
我可以简单地删除现有图像和容器并创建新图像(使用新名称)和更新后的新容器configuration/code。
解决方案 #2 对我来说似乎更可靠。没有 'update' 过程,只有单个容器创建。
然而,令我困扰的是,这种重新创建图像是否会产生不良副作用?就像很多悬垂的图像或类似的东西。想象一下,这可能会在用户玩应用程序期间经常发生——例如,如果开发人员正在尝试一些东西,他想玩不同的微服务配置,他会经常重新启动它。但是一旦配置好,就不会改变了。另外,当我说 configuration 时,我指的不仅仅是配置文件,还包括用户代码等
对于生产更改,您需要为文件更改部署新映像。这确保您的过程是可重复的。
但是,每次编写新代码行时都创建一个新图像进行开发将是一场噩梦。最好的选择是 运行 你的 docker 容器并将容器的源目录挂载到你的文件系统。这样,当您在编辑器中进行更改时,容器中的代码也会更新。
你可以这样实现:
docker run -v /Users/me/myapp:/src myapp_image
这样您只需构建 myapp_image
一次,之后就可以轻松进行更改。
现在,如果您有一个未安装的 运行ning 容器并且您想要更改该文件,您也可以这样做。不推荐这样做,但很容易看出您可能想要这样做的原因。
如果你运行:
docker exec -it <my-container-id> bash
这会将您放入容器中,您可以在容器中根据自己的选择进行更改。vim/nano/editor。
您的选项 #2 绝对更适合生产环境。理想情况下,您应该围绕此过程进行一些自动化,通常是执行类似 blue-green 部署的操作,在该部署中,您将基于旧映像的容器一个一个地替换为新的容器,边进行边测试,然后仅在您需要时进行测试对新部署感到满意,您是否清理了以前版本的容器并删除了图像。这样您就可以在需要时快速 roll-back 到以前的版本。
在开发环境中,您可能希望采用不同的方法,即在运行时将应用程序绑定挂载到容器中,这样您就可以动态进行更新,而无需重建映像。 Docker Compose docs 中有一个很好的示例,说明了如何使用通用基础编写 YML,然后对其进行扩展,以便在开发和生产场景中获得不同的行为。
一个微服务保留在一个 docker 容器中。现在,假设我要升级微服务——例如,更改了一些配置,我需要重新运行它。
我有两个选择:
我可以尝试重新使用现有图像,方法是在容器启动时使用 运行s 脚本,并通过从某些容器读取新配置(如果有)来更新微服务共享卷。更新后,脚本 运行s 微服务。
我可以简单地删除现有图像和容器并创建新图像(使用新名称)和更新后的新容器configuration/code。
解决方案 #2 对我来说似乎更可靠。没有 'update' 过程,只有单个容器创建。
然而,令我困扰的是,这种重新创建图像是否会产生不良副作用?就像很多悬垂的图像或类似的东西。想象一下,这可能会在用户玩应用程序期间经常发生——例如,如果开发人员正在尝试一些东西,他想玩不同的微服务配置,他会经常重新启动它。但是一旦配置好,就不会改变了。另外,当我说 configuration 时,我指的不仅仅是配置文件,还包括用户代码等
对于生产更改,您需要为文件更改部署新映像。这确保您的过程是可重复的。
但是,每次编写新代码行时都创建一个新图像进行开发将是一场噩梦。最好的选择是 运行 你的 docker 容器并将容器的源目录挂载到你的文件系统。这样,当您在编辑器中进行更改时,容器中的代码也会更新。
你可以这样实现:
docker run -v /Users/me/myapp:/src myapp_image
这样您只需构建 myapp_image
一次,之后就可以轻松进行更改。
现在,如果您有一个未安装的 运行ning 容器并且您想要更改该文件,您也可以这样做。不推荐这样做,但很容易看出您可能想要这样做的原因。
如果你运行:
docker exec -it <my-container-id> bash
这会将您放入容器中,您可以在容器中根据自己的选择进行更改。vim/nano/editor。
您的选项 #2 绝对更适合生产环境。理想情况下,您应该围绕此过程进行一些自动化,通常是执行类似 blue-green 部署的操作,在该部署中,您将基于旧映像的容器一个一个地替换为新的容器,边进行边测试,然后仅在您需要时进行测试对新部署感到满意,您是否清理了以前版本的容器并删除了图像。这样您就可以在需要时快速 roll-back 到以前的版本。
在开发环境中,您可能希望采用不同的方法,即在运行时将应用程序绑定挂载到容器中,这样您就可以动态进行更新,而无需重建映像。 Docker Compose docs 中有一个很好的示例,说明了如何使用通用基础编写 YML,然后对其进行扩展,以便在开发和生产场景中获得不同的行为。