首先,我对 Docker 之类的东西有点陌生。
所以我有一个 Postgres 数据库在 3 个不同的容器中运行 + pgAdmin。
为此,我有一个 docker-compose.yml 并执行一个
docker compose up -d
好!
但是假设我想在另一台机器上运行一个具有容器当前状态的容器,因此我将容器保存为 TAR 文件,制作一个
docker save -o ...
在目标 PC 中我加载 TAR 文件
docker load -i ...
图像已正确加载,但我无法再次启动容器。我尝试了 docker run、docker start、docker compose up,...正如我所说,我是 docker 的邻居,我在互联网上找到的内容并不能解决我的问题。
您能解释一下吗?
谢谢!
您需要导出数据库数据并以某种形式恢复它。 不要尝试移动容器;这种方法行不通。
例如,如果您已使用主机系统上备份的数据启动数据库;也许你的 Compose 文件看起来像
version: '3.8'
services:
database:
volumes:
- ./pgdata:/var/lib/postgresql/data
然后如果将
./pgdata
目录复制到远程系统,它将具有相同的数据库数据。 您不需要直接复制图像或尝试保留容器。
here$ docker-compose down
hese$ scp docker-compose.yml pgdata there:
here$ ssh there
there$ docker-compose up
PostgreSQL
pgdump
和 pgrestore
工具可以以类似的方式使用:获取本地数据库转储,复制它,在远程系统上启动数据库,然后恢复它。
如果您使用命名卷进行存储,移动原始文件会变得更加复杂:您需要运行一个临时容器来在一个系统上导出卷内容,并运行一个类似的临时容器来在另一个系统上恢复它。 Docker 文档有关于执行此操作的说明。 如果您认为您将经常进行此类迁移,并且您的主机操作系统对于 Docker 绑定挂载没有显着的性能损失,那么这可能是您更喜欢绑定挂载(主机目录)而不是命名的原因音量。
容器是单个进程的包装器,具有一些内核级隔离功能。 就像您通常不会将正在运行的进程从一台计算机移动到另一台计算机一样,您通常也不会移动容器。
最重要的是,容器文件系统本身是临时的。 就像您可以 ^C 一个进程并再次运行它一样,它将丢失其内存中状态,但通常可以重建它,您通常应该能够
docker stop && docker rm
一个容器,然后重新 docker run
,不会丢失东西。
为了支持这一点,任何需要跨容器运行保存的数据都需要存储在容器临时文件系统之外的某种存储中。 这就是上面描述的绑定安装和命名卷机制。 卷与容器分开管理,并且没有专用命令来管理卷内容。
虽然有 Docker 命令尝试导出容器文件系统,但它们会忽略卷内容。
docker export
和 docker commit
(几乎从来不是最佳实践命令)根本看不到卷。 docker save
仅保存映像,而不保存容器文件系统或卷(仅当您需要在不使用注册表的情况下在计算机之间传输映像时才需要,例如在气隙环境中)。
相反,由于容器是临时的,移动体积就足够了。 如果您
docker rm && docker run
具有相同已安装存储的容器,它应该恢复其状态。 但这也意味着这两个命令不需要位于同一系统上:如果您将状态(主机目录或卷内容)复制到远程系统,并且 docker run
那里有一个新容器,它应该返回相同的状态。