迁移docker容器,以technosoft2000&&&calibre-web为例
类别:信息技术
作者:ATScore
发布日期:2023年11月30日
迁移docker容器
将黑群晖里的docker容器迁移到ubuntu
面临的问题
docker有镜像,有容器,有挂载的目录数据,有容器运行过程中的数据,这数据应该是要全部移去新环境,才能保证迁移后的容器可以正常运行。
这里面有以下坑
- docker容器的启动命令entrypoint与command
- 环境变量
- 自动卷的数据不会被commit
- 手写docker-compose脚本
迁移路线1:commit+save+load
步骤
- commit打包镜像
- save导出镜像文件
- 手工迁移镜像文件
- 手工打包挂载目录
- 重写docker-compse脚本
- 启动容器
优点
- 不用考虑环境变量和entrypoint/cmd
缺点
- 文件体积比较大
- commit的文件会生成在docker中
- 保留了镜像所有的历史,易导致臃肿
评价
- 这种方法其实主要用于整体迁移,符合我们本次的目的
迁移路线2:export+import
这种方法仅作导出、导入的方式迁移,优点是文件体积较小,缺点是需要手工补全entrypoint和CMD和环境变量,否则启动容器时会报“no command specific"或者类似错误。
注意
不论哪种方法,都需要手工迁移bind目录,并注意未bind的卷是否有数据需要迁移,并重写启动脚本。
technosoft2008/calibre-web它会在每次运行时从github下载数据,所以被我在/init/start.sh里注释掉了source get_or_update.sh,但是它是把数据写到我未bind目录上的,所以commit,这部分程序就没了,要自己手工迁移!!!
实操,以technosoft2000/calibre-web为例
--旧机
#进入docker容器
docker exec -it $container_id /bin/bash
#手工移出/calibre-web目录下app、config、kindlegen三个文件夹
cd /
tar zcvf calibre-web-program.tar.gz calibre-web/
#将数据通过挂载的books目录移出
mv calibre-web-program.tar.gz /books
#app.db gdrive.db metadata.db都在/books目录下,本就是在外部的,不用处理
#退出镜像
exit
#此时你应该在例如群晖的/volume3/nas类似的文件夹下
#打包镜像
docker commit $container_id calibre-web/calibre-web:20231201
#导出镜像文件
docker save calibre-web/calibre-web:20231201 > calibre-web.tar
--新机
#去到工作目录
cd /home/docker/install/calibre-web
#我的容器挂载目录是/home/docker/calibre-web,注意阅读时区别
#install/calibre-web目录下你要放好镜像文件和打包的程序文件
#scp或者手工传递都可以
#展开程序文件
tar xf calibre-web-program.tar.gz
#把程序移到挂载目录下
mv calibre-web-program/* /home/docker/calibre-web/
#导入镜像
docker load < calibre-web.tar
编写docker compose脚本
version: '3'
services:
calibre-web:
image: calibre-web/calibre-web:20231201
restart: always
ports:
- 你的端口:8083
volumes:
- 你的书的目录:/books:rw
- /home/docker/calibre-web/app:/calibre-web/app:rw
- /home/docker/calibre-web/config:/calibre-web/config:rw
- /home/docker/calibre-web/kindlegen:/calibre-web/kindlegen:rw
启动即可
这样做完后,书架与封面信息都能保留。