背景
之前由于服务器的根目录空间不够用了,将 Docker 的 data-root
修改到 NAS 存储上,该存储使用了 NFS(Network File System)文件系统。NFS 是一种常见的网络文件系统协议,允许多个客户端共享访问远程文件。但由于其性能和与 Docker 底层存储驱动的兼容性问题,不建议将其用作 Docker 的核心存储位置。
在将 data-root
指定为 NFS 挂载点后,使用 --storage-driver vfs
来启用 Docker 守护进程。这种配置虽然能解决存储问题,但也导致了容器构建和运行的速度极为缓慢。
经过一段时间的使用后,还是将 Docker 的存储位置切回默认的本地存储。现在,我需要在不影响当前正在 Docker 上运行的服务的情况下,将之前在 NAS 上使用的容器导出。
环境
Ubuntu 20.04 + Docker 24.0.6
启动新的 Docker 实例
为了启动新的 Docker 实例,执行以下命令:
touch /tmp/empty-daemon.json # 用于覆盖系统默认的配置文件
sudo dockerd --data-root /nas/docker \
--storage-driver vfs \
-H unix:///var/run/docker-alt.sock \
--config-file /tmp/empty-daemon.json \
--pidfile /var/run/docker-alt.pid
参数说明:
--data-root
: 指定 Docker 实例的数据根目录为 NAS 挂载点--storage-driver vfs
: 使用vfs
作为存储驱动,这是由于 NAS 文件系统不支持 Docker 的默认存储驱动。-H unix:///var/run/docker-alt.sock
: 指定 Docker 守护进程使用一个新的 Unix 套接字文件docker-alt.sock
,以避免与现有的 Docker 实例冲突。--config-file /tmp/empty-daemon.json
: 使用一个空的配置文件,确保不会加载默认的配置,以避免参数冲突。--pid-file /var/run/docker-alt.pid
: 将新的 Docker 守护进程的 PID 存储在指定的文件中,以便与默认的 Docker 进程区分开来。
启动结果验证
运行以下命令能看到 Docker Root Dir 已经换成之前的存储位置了
docker -H unix:///var/run/docker-alt.sock info
导出容器
1. 导出容器为镜像
docker -H unix:///var/run/docker-alt.sock commit <container-id> <new-image-name>
2. 导出镜像
docker -H unix:///var/run/docker-alt.sock save -o <output-file.tar> <new-image-name>
3. 导入镜像
sudo docker load -i <input-file.tar>
4. 重新创建容器
docker run -d <new-image-name>
总结
通过这些步骤,能够在不影响现有服务的情况下完成容器的迁移。希望本文提供的解决方案对你在处理类似问题时有所帮助,让你能够顺利地管理和迁移 Docker 容器。