首页>软件资讯>常见问题

常见问题

docker应用升级

发布时间:2025-06-12 09:46:16人气:89

使用 docker 一般会有一个误解,认为不要把数据存在 docker 中,docker 升级后数据会丢失。

docker 的最佳实践的确不推荐使用 docker 存有状态的数据,特别是数据库应用。最好用作随时可销毁的无状态的应用,应用垮了随时再生成一个新的。

实际上 docker 使用 overlay 挂载文件系统,它的变动部分的数据还是存在系统目录中的,一般在 lib 目录的 overlay2 目录。

/var/lib/docker/overlay2

只要容器不销毁,正常重启容器数据是不会丢的。日常我们可以通过 inspect 命令查看 docker 的存储情况。

$ docker inspect c208d38a600fz

1.png

其中 LowerDir 是镜像解压后的目录,通过 overlayfs 挂载后,将多个 LowerDir 合并到 MergedDir,其中 MergedDir 是容器的最终可访问目录,是可写的。LowerDir 一般是只读目录,并且有多个。

当容器处于 stop 状态时,MergedDir 不可访问。通过 mount 命令可以查看活跃状态的 docker 目录挂载情况。

当我们需要升级 docker 应用时,如果之前的容器运行时使用的是 latest tag 的镜像。当使用 docker pull xxx:latest 时,docker 应用会自动使用最新镜像。

以 neosmemo/memos:latest 为例,升级到最新镜像后,原镜像的 latest tag 会并抹掉变成 <none>。

2.png

这时重启容器即可应用最新镜像:

3.png

但如果创建容器时没有使用 latest 标签,比如:


docker run --privileged=true -d --network=bridge -p 8080:8080 -v /data:/app/backend/data --name open-webui-new ghcr.io/open-webui/open-webui

当 docker pull ghcr.io/open-webui/open-webui:latest 获取到最新镜像后,容器会指向之前的镜像ID,从而导致应用没有升级。

4.png

这时只能停掉旧的容器,重新创建新容器。可以使用 runlike 查看之前容器的创建命令:

5.png

通过 runlike 复原容器的创建命令,然后基于最新镜像创建新容器,从而升级应用。

当没有使用 -v 挂载数据卷目录时,不同的容器使用的是不同的 overlay 目录。不同容器的 LowerDir 和 MergedDir 是不同的,在更新镜像时,MergedDir 的内容会发生变动。所以建议将变动的数据通过 -v 数据卷挂载出来,不然镜像一更新,原 docker 应用的数据就没了。

升级 docker 应用前应做好备份,不然应用打不开,没法回滚就不好了。



上一条:docker简介及使用

下一条:购软平台是vmware软件经销商