我是Docker的新手。每次我需要上传生产中的新内容时,我都会担心会出问题,所以我会尝试了解备份是如何工作的,以及如何备份我的卷,这在目前对我来说似乎相当复杂。
因此,每当我想要上传新内容时,我就有了创建新图像的想法。然后,我在机器中拉出此镜像,并堆叠rm/deploy容器,看看它是否正常工作-如果不能,我将拉出旧镜像。如果代码工作正常,我就可以删除我的旧图像。这是一种正确/安全的更新生产计算机的方法,还是我需要开始备份和恢复?我的意思是,我读了这个指南https://www.thegeekdiary.com/how-to-backup-and-restore-docker-containers/,但我不太明白如何恢复我的卷。
任何建议都会很好。谢谢
发布于 2020-08-26 18:19:30
这是使用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外壳函数中;如果您有环境变量或卷挂载设置,则可以将它们放在那里,旧卷将被重新附加到新容器。您确实需要备份卷内容,但这可以与此升级过程分开。除此之外,您不需要备份或恢复容器文件系统的内容。
如果您正在使用Kubernetes,那么在部署规范中更改image:会自动为您完成此操作。它将在停止旧容器之前实际启动新容器,因此您可以获得零停机时间升级;执行此操作的关键部分是能够识别正在运行的容器,并将它们连接到某种类型的负载均衡器,该均衡器可以路由入站请求。
这里需要注意的是,您不能对应用程序的关键部分使用Docker卷或绑定挂载。不要将卷用于应用程序代码、静态资源文件或库文件。否则,卷的生命周期将优先于镜像/容器的生命周期,您将最终运行旧代码,无法以这种方式更新内容。(它们对于推送配置文件、读出日志文件以及存储诸如数据库的底层数据之类的内容很有意义。)
https://stackoverflow.com/questions/63594167
复制相似问题