1. linux内核的限制
一个容器镜像能运行在任何一个运行Docker的机器上。 但是,容器化的应用需要一个特定的内核版本, 那它可能不能在每台机器上都工作。 如果一台机器上运行了一个不匹配的Linux内核版本, 或者没有相同内核模块可用, 那么此应用就不能在其上运行。
2.硬件架构的问题
一个在特定硬件架构之上编译的容器化应用, 只能在有 相同硬件架构的机器上运行。 将一个x86架构编译的应用容器化后(例如在一个非Linux的系统上运行Docker,实际上Docker的客户端和守护进程不要求在一台机器上,当构建的时候,是在Docker的守护进程中构建的。), 不能在ARM架构的机器上。
拓展:
目前市面上一些软路由已经支持Docker容器,例如爱快、群辉等,这些处理器所用的架构是ARM架构,在PC的Docker无法直接运行。
如何进行迁移:
- 借助qemu模拟环境
wget https://github.com/multiarch/qemu-user-static/releases/download/v5.1.0-2/qemu-aarch64-static.tar.gz
docker run --rm --privileged multiarch/qemu-user-static:register
#运行ARM容器
docker run -it -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static 容器名字
##最后快照打包
- 利用CRIU工具进行迁移
①:Ubuntu中的服务模块从镜像仓库中下载支持跨架构和跨操作容器迁移的Docker容器镜像,然后使用该镜像启动容器。该镜像由Popcorn 编译器生成的二进制文件构建。
②:安卓设备发送容器迁移请求到边缘服务器。
③:服务模块向容器发出信号,表明它必须在最近的迁移点冻结。
④:服务模块调用CRIU模块对容器进行checkpoint,然后将容器状态转储到一系列CRIU镜像文件中。
⑤:服务模块调用CRIU转换模块,将CRIU镜像文件从X86架构转换为ARM架构。
⑥:安卓设备连接到边缘的服务模块,然后下载CRIU镜像文件。
⑦:安卓从镜像仓库中下载支持跨架构和跨操作系统容器迁移的Docker容器镜像,然后使用该镜像创建一个容器。
⑧:安卓使用CRIU镜像文件来恢复创建的容器。 恢复的容器进程将从迁移点继续运行。
参考
1.《Kubernetstat in Action》 Marko Luksa
2. https://blog.csdn.net/zhaocb_Swan/article/details/108474051?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.opensearchhbase&spm=1001.2101.3001.4242.1
3. https://blog.csdn.net/weixin_42443075/article/details/118076160