Docker-将新内容上传到生产环境的最安全方法

问题描述

我是Docker的新手。 每次我需要在生产中上传内容时,我都会担心会出问题,因此我尝试了解备份的工作方式以及如何备份我的Volumes,这对我来说现在似乎很复杂。

因此,我有每次创建新图像时都要创建新图像的想法。 然后,我将这个图像拉到机器中,并堆叠rm /部署容器,看看它是否有效-如果不行,我拉旧图像。 如果该代码有效,则可以删除旧图像。 这是更新生产机器的正确/安全方法,还是我需要进行备份和还原? 我的意思是我已阅读本指南https://www.thegeekdiary.com/how-to-backup-and-restore-docker-containers/,但我不太了解如何还原卷。

任何建议都会很好。 谢谢

解决方法

这是使用Docker的一种非常正常的方式。确保为每个版本提供一个不同的标签,例如日期戳或源代码管理ID。您可以像

那样进行升级
# CONTAINER=...
# IMAGE=...
# OLD_TAG=...
# NEW_TAG=...

# Shell function to run `docker run`
start_the_container() {
  docker run ... --name "$CONTAINER" "$IMAGE:$1"
}

# Shut down the old container
docker stop "$CONTAINER"
docker rm "$CONTAINER"

# Launch the new container
start_the_container "$NEW_TAG"

# Did it work?
if check_if_container_started_successfully; then
  # Delete the old image
  docker rmi "$IMAGE:$OLD_TAG"
else
  # Roll back
  docker stop "$CONTAINER"
  docker rm "$CONTAINER"
  start_the_container "$OLD_TAG"
  docker rmi "$IMAGE:$NEW_TAG"
fi

这里唯一的docker run命令在start_the_container shell函数中;如果您具有环境变量或卷装入设置,则可以将它们放在此处,并且旧卷将重新连接到新容器。您确实需要备份卷内容,但这可以与此升级过程分开。除此以外,您不需要备份或还原容器文件系统的内容。

如果您使用的是Kubernetes,则在Deployment规范中更改image:会自动为您执行此操作。实际上,它将在停止旧容器之前启动新容器,从而实现零停机升级;这样做的关键部分是能够识别正在运行的容器,并将它们连接到可以路由入站请求的某种负载均衡器。

这里重要的警告是,您必须不要使用Docker卷或为应用程序的关键部分绑定安装。不要将卷用于您的应用程序代码,静态资产文件或库文件。否则,卷的生命周期将优先于映像/容器的生命周期,并且您将结束运行旧代码,并且无法以这种方式进行更新。 (它们对于将配置文件压入,读取日志文件并存储诸如数据库的基础数据之类的东西是有意义的。)