将iso镜像转换为docker镜像
为什么不用官方的镜像?
不是不想使用,而是官方镜像提供的功能实在是太少了,不信的话,你pull一个ubuntu:latest的进行,你看有没有wget、curl、ssh这些功能,就连最简单的ifconfig都没有,可谓是最纯净、最精简的操作系统。但是我们平时工作中往往需要一些镜像能够拥有尽可能多的功能,当然这就可能造成镜像比较臃肿。
本次测试过程使用的ubuntu16.04桌面版。没错,带GUI的桌面版,其实什么版并没有什么区别,转换为docker镜像之后,使用方法没有区别。
前提:iso已经在虚拟机中安装好
操作很简单,就是耗时---就是进入虚拟机中,然后将某些目录的文件打成tar包,有了tar包之后,再使用docker的import命令来创建镜像。
打包操作:
iso镜像1.62G,打出的tar包5.6G,时间稍长,10分钟左右,大概是在虚拟机里面的原因。
需要注意的是,在打包之前,请先确认要将哪些文件进行打包,比如下面这些目录都可以不用打包:
- 某些用户的家目录是否需要打包
- 每个用户的执行的历史命令是否需要清除
- 一些涉及到隐私的文件
- 与系统镜像没有关系的文件,或者说只是系统运行过程中保存的垃圾文件或者缓存等
- 临时文件
建议手动选择要进行打包的目录,比如:bin dev lib64 media opt root snap var boot etc lib mnt sbin srv usr vmlinuz这些目录
如果你拿不准哪些文件目录要打包,那么可以将根目录下所有文件都打包(不推荐)
1 2 | → ~ # cd / → ~ # tar -cf system.tar bin dev lib64 media opt root snap var boot etc lib mnt sbin srv usr vmlinuz |
建议打包时不要加-v选项,因为文件太多了,翻页速度太快,显示出来也看不清。
将打出的包拷贝到一个安装了docker的环境,如果本地有docker的话,就可以不用移动。
导入操作
1 2 | → ~ # cat image.tar | docker import - ubuntu:16:04 sha256:e2b87a8f4f31657f9781b6dad1bdf423f3f3e62865995f4720852c81be0c4e96 |
查看导入的镜像
1 2 3 | → ~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 16.04 e2b87a8f4f31 29 minutes ago 4.97GB |
运行新建的镜像
这里可能会遇到一个问题,就是尝试运行docker镜像的时候,会提示错误docker: Error response from daemon: No command specified.
即使是使用管理员权限来运行也是不行的,
1 2 3 4 5 6 7 | → ~ $ docker run -t -i ubuntu:16.04 docker: Error response from daemon: No command specified. See 'docker run --help' . → ~ $ sudo docker run -t -i ubuntu:16.04 Password: docker: Error response from daemon: No command specified. See 'docker run --help' . |
正确方法:
1 2 3 4 5 | → ~ $ docker run -t -i ubuntu:16.04 docker: Error response from daemon: No command specified. See 'docker run --help' . → ~ $ docker run -t -i ubuntu:16.04 /bin/bash #正确方法 root@f0389c5d3270:/ # wget www.baidu.com |
至于docker run -t -i ubuntu:16.04为什么不行,可以参考:使用Dockerfile来构建镜像,因为他没有设定RUN命令的参数,即容器启动时,要运行的命令
推到镜像库
最后,可以将镜像push到自己的镜像库,需要的时候就pull下来运行即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通