迁移docker容器,以technosoft2000&&&calibre-web为例

类别:信息技术 作者:ATScore 发布日期:2023年11月30日

file

迁移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

启动即可

这样做完后,书架与封面信息都能保留。