登录

DockHop 开源项目:简单两步,完整迁移你的 dcoker 服务,主打易用、安全、可靠✨✨✨

16125
  • 楼主 编辑于

    写在最前面
    写这个项目的初衷就是为了帮大家更简单的迁移 Docker。毕竟作为一名 MJJ,迁移 Docker 是常有的事。但是每次都要手动一个一个的迁移还是太费劲了,而且还常常因为各种问题导致出错。于是这个项目便诞生了。只需要跟着提示一步一步的运行,你就能迁移你的所有 docker 服务,简单好用的一批。至于项目本身的可靠性方面,这个项目并不是临时起意,也不是草草 vibe coding 了一下就拿来给大家的,项目本身我已经打磨了几个月,项目开始我就设计好了完整的架构。按照架构一步步实现的,而且 AI 写的重要代码,我也会自己 review,确保没问题了再上线。所以,大家可以放心使用。 最后,希望这个项目能给大家带来一点点的帮助吧。如果有帮到你,也希望能给项目点个免费的 star。万分感谢!

    只需两步,完整迁移你的 Docker 服务
    是什么?

    DockHop 是一个 Docker 迁移工具:一个脚本即可完整迁移你的 docker 服务,迁完就能直接用。主打安全、可靠、易用。

    特点

    • 简单:两台服务器运行同一条命令,一台选「迁出」,一台选「迁入」,按步骤即可完成迁移。不用记配置、不用记参数、这些都由脚本来搞定。
    • 完整迁移:镜像、数据卷、挂载目录、端口、环境变量、网络、Compose 项目都会迁移,容器里改过的文件也不丢。完整迁移
    • 可靠:严格的测试流程,保证使用的可靠性。你能想到的问题点,我都有考虑。
    • 安全:数据加密传输,不怕中间人劫持或篡改。保证迁移安全。给你满满的安全感。
    • 干净:只需要 Docker,不需要安装其他依赖;运行过程中的中间产物,包括脚本自身也是用完即删。不会在服务器上面乱拉屎

    快速开始

    在旧服务器和新服务器上运行同一条命令:

    bash <(curl -fsSL https://dockhop.run)
    

    第一步,旧服务器:选 1. 迁出,选好要迁的服务。打包完会显示一条迁移链接,复制它。这个窗口先别关,新服务器要从这里下载数据。

    第二步,新服务器:选 2. 迁入,粘贴刚才复制的链接。检查、下载、恢复都会自动完成,迁入成功后旧服务器那边也会自动结束。

    [!NOTE]
    迁移链接里含有解密密钥,不要发给别人。

    [!TIP]
    新服务器连不上,几乎都是旧服务器没有放行端口(默认 TCP 8080)。在云服务商的安全组和服务器防火墙里放行就行。

    迁移哪些东西

    • 镜像:和旧服务器上的版本一模一样。新服务器上已经有、或者能从镜像仓库拉到同一个镜像时,就不从旧服务器传
    • 数据卷、挂载的目录和文件,属主和权限保持不变
    • 容器里没挂载出来、但改过的文件
    • 端口、环境变量、启动命令、重启策略、资源限制、健康检查等全部运行参数
    • 自定义网络、固定 IP、网络别名
    • Docker Compose 项目:整个项目目录和它引用的文件,迁移后照常 docker compose up -d
    • 容器原来的状态:运行、暂停或停止

    系统要求

    • Linux,x86_64、arm64 或 armv7,用 root 运行
    • Docker 20.10 或更新的版本
    • 迁移 Compose 项目时,新服务器要装好 docker compose
    • 一行命令需要 curl(或 wget)和 sha256sum,常见的发行版都自带
    • 新服务器要能连上旧服务器的一个 TCP 端口(默认 8080)

    更多用法

    一般按菜单走就够了。需要的时候,把选项加在命令后面,例如:

    bash <(curl -fsSL https://dockhop.run) out --port 9000
    
    选项作用
    out --port 端口下载服务用的端口,默认 8080。安全组只放行了某个端口时用它
    out --host 地址链接里用的 IP 或域名。自动探测不准(NAT、多网卡),或者想走内网时用
    out --include a,b只迁移这几个容器(或它们所在的 Compose 项目),不显示菜单
    out --stop-shared允许临时停掉和所选容器共用数据的其他容器,打包完自动恢复
    in --yes检查发现的问题自动按推荐的方式处理
    in --existing replace|skip|fail新服务器已有同名服务时:替换、保留已有的,或者停止迁入
    in --keep-succeeded有服务起不来时,保留已经正常运行的,只删除起不来的
    环境变量作用
    DOCKHOP_HOMEDockHop 放文件的目录,默认 ~/.dockhop。系统盘不够大时,换到大一点的盘
    DOCKHOP_MIRROR下载程序用的镜像站。不设置时,国内先用 Gitee,其他地方先用 GitHub
    DOCKHOP_NO_STATS=1不统计、也不显示迁移次数

    完整说明见 dockhop --help。

    项目地址:https://github.com/lx969788249/dockhop 欢迎来点个免费的 star

    收藏 2支持 1反对打赏

25 条回复

  • #1

    技术帖,顶一下,然后学习。

    个性签名

    一个小白的经历

  • #2

    建议设精

    个性签名

    cofo.co.fo

    楼主:

    嘿嘿,感谢

    #3
    共 1 条回复
  • #4

    路过水一贴,帮顶

    个性签名

    搏一搏,单车变摩托,赌一赌,摩托变路虎。不怕输的苦,就怕断了赌。小赌养家糊口,大赌发家致富!

  • #5

    dockhop 先收藏了,迁 docker 确实麻烦

    #6
    共 1 条回复
  • #7

    直接 ai 迁移就行 都是 compose 写的

    楼主:

    确实,AI 也可以的,不过有一个操作更简单的脚本,用一下也不亏对吧doge

    #9
    共 1 条回复
  • #8

    项目真不错

  • #10

    可能有用 周末研究下

  • #11

    感谢分享

    个性签名

    🗑️招财猫的废纸篓

  • 管理博主
    #12

    链接被别人拿到了会怎样?
    旧服务器的下载服务开着的时候,拿到完整链接的人能下载并解开你的数据。

    为何不加密传输?

    个性签名

    我思故我在,烧饼博客与你同行。

    楼主:

    我有考虑过这个,不过考虑下来觉得没有必要做这个,首先迁移包本身就是加密的状态,再套一层加密其实收益不大。其次我觉得链接被别人拿到这种情况应该也是极少数。除非我们主动分享给别人,不然别人几乎不可能拿到我们的链接以及里面的密钥。除非我们的服务器被黑了,不过服务器都被黑了,那其实再讨论安全也没有意义。所以才没做这个

    #13
    回复 小猫咪嘬嘬嘬:

    为何不直接 rsync 传输呢

    #14
    楼主 回复 Showfom:

    技术上是没有问题的,但是会增加操作复杂性,与项目的易用观念冲突。你看,用 rsync 还得登陆 ssh 需要用户输入密码,这一步风险就很大,因为有的人它可能不太会相信脚本,而且还要装 rsync。复杂性上了一个台阶,但是安全性其实没有提高太多。项目现在用的这种方式我觉得即兼顾了安全,又降低了复杂性,是我目前能想到的最优解了

    #15
    回复 小猫咪嘬嘬嘬:

    直接起了 http 服务的话,你也可以临时随机用户名和密码认证,或者给接受的服务器的 IP 做一层白名单,而不是直接给个公网就可以下载的链接呀

    #16
    楼主 回复 Showfom:

    有道理,这个建议确实很棒。感谢建议,我会在后续的更新当中加入 ip 白名单这个校验脱单doge!

    #17
    回复 小猫咪嘬嘬嘬:

    双重保障嘛

    #18
    楼主 回复 Showfom:

    是的是的,可以滴哈哈

    #19
    共 7 条回复
  • #20

    @gork 帮我看看好不好用

    :

    能用,但别被「两步、安全、满满的安全感」哄睡着。这就是个给自己两台机器搬家的便利脚本,不是保险箱。

    它想解决的事是真的烦:镜像、卷、挂载目录、端口、环境变量、网络、Compose,外加容器里没挂出来却改过的文件。这些要是手撸,漏一个就够你重装一晚上。菜单选迁出 / 迁入,用完把临时文件删掉,这个方向没毛病。楼主后面也认了该加 IP 白名单,说明不是完全不听人说话。

    坑在威胁模型,不是在文案:

    • 安装方式是 bash <(curl ...),还得 root。远程脚本直接在机器上跑,你连看都没看。要装就去 GitHub 把脚本和发布物对一下,别闭眼管道。
    • 帖里写「数据加密传输」,楼底下自己又说包是加密的,再套一层没必要。链接里就带着解密密钥。服务开着的时候,谁拿到完整链接,谁就能下下来解开。这不叫传输加密,这叫「密钥写在门牌上」。
    • 默认公网 TCP 8080,快速开始里没有账号密码,也没有白名单。白名单是 #17 说的「后续更新」,你用之前自己看仓库里有没有,别把承诺当已上线。
    • 迁出那个窗口别关、链接别贴聊天、别截图。迁完把安全组和防火墙的口子关上。新机连不上,十有八九就是 8080 没放行,这点帖里写对了。
    • 和别的容器共用数据时,--stop-shared 会临时把那些容器停掉。Compose 项目新机器还得自己装好 compose。架构不一样(x86 迁 arm)别指望镜像原样就能跑。

    所以:自己的机器、不重要的栈,先迁一个试试,能起来再搬正经服务。链接当密码看,8080 只对新服务器放行。真有不能见光的数据,这套「窗口开着等人来拉」就不该碰。周末研究可以,无脑「放心使用」就算了。

    #21
    楼主:

    惊讶 这么尖锐吗哭成泪人

    #22
    共 2 条回复
  • 楼主
    #23

    @gork 帮我看一下这个项目代码怎么样

    :

    没看过仓库里的最新代码,不会假装逐行审过。只按你帖子里的设计和你自己在楼里认的那几条说,别把「我 review 过 AI 写的代码」当成代码质量证明。

    这东西是 root 下的搬家脚本,不是安全产品。能用,坑也写在脸上。

    安装就是 bash <(curl ...),还要 root。脚本、二进制、镜像站(Gitee/GitHub)任何一环被换,两边机器一起交出去。要跑就先把仓库和发布物对上再执行,别闭眼管道。

    「加密传输」和实现不是一回事。你自己说了:包是加密的,链接里带着解密密钥,传输不再套一层。服务开着时,完整链接等于密码写在地址上。默认公网 TCP 8080,快速开始里没有账号、没有白名单。白名单是你在 #17 说的「后续更新」,用之前看仓库里有没有,没有就当没有。

    迁移面太大,最容易翻车的不是文案,是边界:和别的容器共用卷时 --stop-shared 会临时停别人;容器里没挂出来的改动靠导出层,overlay、匿名卷、bind mount、权限、SELinux 很容易漏;x86 迁 arm 镜像不会魔法变可运行;新机器没装 compose,Compose 项目迁过去也起不来。这些帖里写了,脚本再「两步」也省不掉。

    所以:自己的机器、不重要的栈,先迁一个能起来再搬正经的。链接当密码,窗口别关、别贴、别截图,迁完把端口关上。不能见光的数据,别用「窗口开着等人来拉」这套。代码怎么样,得看仓库现在的实现,不是看 README 里的安全感。

    #24
    共 1 条回复
  • #25

    拿个烧饼 微笑

发表回复