前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何反编译一个Docker镜像还原Dockerfile?

如何反编译一个Docker镜像还原Dockerfile?

作者头像
chengcheng222e
发布于 2021-11-12 09:31:46
发布于 2021-11-12 09:31:46
5.6K02
代码可运行
举报
文章被收录于专栏:简栈文化简栈文化
运行总次数:2
代码可运行
前言

现在对于一个开发来说,Docker应该是再熟悉不过了。还记得在2013~2014左右的时候,听说多最多的就是Cloud Foundry,那个时候就一直在说云的事情。后面Docker就绝杀了它~

那它帮我们解决了一个什么问题了?面试的时候也许会问到。

在很久以前,我们开发代码,估计最蛋疼的事情就是发布版本了。我还记得在房多多的时候(2014~2016)左右,每次发布几个开发围绕在运维的身边,有时候运维忙不过来,开发就直接在运维的电脑上开始VIM干活了,修改若干配置。由于多环境的原因,我们无法保证每个环境都是一样的。

  • 可能你的操作系统不同,导致打包、发布的脚本不同
  • 环境不同,没有很好的配置管理,你的代码有不同的写法
  • 特别是跟操作系统相关的那些参数,可能瞬间就会带来性能问题

那么Docker就可以把我们的操作系统、代码、脚本等都一起打包成一个Image,就可以保证只要是运行同一个Image,我们的所有内容都是一样的。就不会出现,我在测试环境跑的好好的,一到生产连启动都成问题。

问题

现在一般一个POD就只跑一个进程,DevOps会根据我们的发布流水线自动的将一个项目进行打包、发布,整套的CI、CD做的是行云流水。但是,每个项目ROOT下都会需要一个叫Dockerfile的文件。但偏偏有一些历史项目,没有Dockerfile文件,只有一个Run的容器再跑,真的是非常惊悚。docker rm [OPTIONS] CONTAINER [CONTAINER...],就GAME OVER了。

怎么办?
方法1:以当前容器作为基础镜像

真的,什么也不想。先保个底,把你当前的容器打包成一个镜像推送到仓库里去,哪天有意外或者说需要基于它做一些事情的时候才有可能。比如:你要本地也部署一份代码来debug

一般都是私有的仓库,会需要输入用户名与密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ docker login {仓库地址}
Username: chenyuan
Password:
Login Succeeded

然后,将镜像打包推送到私有仓库去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker commit -a "name" -m "小陈来拯救你" 706e502e8693 {镜像地址}:{tag}

docker push {镜像地址}:{tag}

docker pull {镜像地址}:{tag}

但是这样子的问题在于,我们无法知道环境依赖了哪些模块,如果需要重新再部署一套,我为了保证环境的干净又需要删除哪些东西。就是无法知道增加与减少哪些东西,也就会导致环境存在不一致性,失去了我们的初衷。

方法2:从运行的容器中复制

先把镜像跑起来,然后从运行起来的容器中复制文件出来,复制命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 从容器复制文件或目录到宿主机器
docker cp 6619ff360cce:/opt/h2-data/pkslow ./
docker cp 6619ff360cce:/opt/h2-data/pkslow/pkslow.txt ./

第一种方法并不是万能的,因为有些镜像过于简单,少了许多基础命令,以至于无法复制文件,也无法进入shell环境。其次,要运行起来再操作,也有点占用资源,比较麻烦。

方法3:解压镜像tar文件(推荐)

此方法就是相当于反编译,拿到当时打镜像时候你做的详细操作。比较麻烦,但是是最靠谱的,最具有操作性的。

先将镜像保存为tar文件,命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker save -o {name}.tar {镜像地址}:{tag}

下载后就会有一个tar包在本地,然后就解压出来。可以看一下manifest.json文件的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    {
        "Config": "dca33100e3683d6fb4d56a4c142ccccc1c113f061454a64bc07c852fe068ea1d.json",
        "RepoTags":
        [
            "{镜像地址}:{tag}"
        ],
        "Layers":
        [
            "216168069a5195a9424b3a73a62bda39e4d5f8dcae2f7149a336c2e29beeb06b/layer.tar",
            "4b0e1f4bede4cef5dee11aff78ff89f543dc62eb02306db1b96d896b101e069d/layer.tar",
            "3fe7f20416fdd4958cc18b6fb0d28881147246c32677d102a431c31bf12288f7/layer.tar",
            "84c1758c9c15f83d8aa4e1ad13c2918aea80f802f01d19eeb2f7c6e1897d7160/layer.tar",
            "31bf0d828ecc19f178d8337e1c22a030984e9185e805b48ea911bd866730af2f/layer.tar",
            "7b30e9a6f195343744ca82c66d31b61771e8d6502a271ad60deb1fa1103e83ca/layer.tar",
            "522ee848bbd06c6e4dad8d5200b83c9197ccce717fb09687b435190d287f6829/layer.tar",
            "a64965663d7c30ed09d35f05439dcfb6247f030df0d72a0e78f54fb6ae5a8c74/layer.tar",
            "a93f0f89669c097497a3e3de7aeffebeba2838f180e4f13844be55fe124885ae/layer.tar",
            "fd69896888f7361654ed0e27ed2634311b6707dd20706487e33e24f32bb23ebe/layer.tar",
            "69c55c418aba5b8fb5239b4e8b092e02100f4ec49dae8ded9cc0a161b21884d7/layer.tar",
            "5ef51ffa437403d5d33a40208c3781ea84a93f53947e5d7fad086092667bd3b1/layer.tar"
        ]
    }
]

图片是解压后的效果,里面都会存在一个layer.tar,这里再解压就是当时打镜像时候的一些资源文件。

http://static.cyblogs.com/image-20210928200049751.png

http://static.cyblogs.com/image-20210928200334841.png

红色的部分就是我们想要的内容。再辛苦一点,把自己想要的东西整理出来。描述的比较轻描淡写,任何事情只要手动去做一遍,就会理解与记住。

参考地址
  • https://segmentfault.com/a/1190000040213872?sort=newest

如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简栈文化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
docker 仓库
Docker Hub 是docker官方维护了一个公共仓库,大部分需求都可以在Docker Hub上直接下载镜像
dogfei
2020/07/31
6880
Docker存出载入镜像
如果你的生产环境不能连通互联网,而你又希望从互联网上获取镜像。你就需要借助 docker save命令,可以将镜像导出为 tar 文件。使用 docker load 命令,可以将tar文件导入镜像库。整个流程是这样的:
大江小浪
2018/07/24
7350
Docker存出载入镜像
Docker利用Dockerfile来制作镜像
在前面的例子(Docker Tomcat镜像制作)中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析、执行,那么重复构建、更新将变得很方便,所以Dockerfile就此诞生了。
星哥玩云
2022/07/26
4790
Docker利用Dockerfile来制作镜像
Kubernetes全栈架构师(Docker基础)--学习笔记
Docker:它是一个开源的软件项目,在Linux操作系统上,docker提供了一个额外的软件抽象层及操作系统层虚拟化的自动管理机制。
郑子铭
2021/07/25
1.4K0
Kubernetes全栈架构师(Docker基础)--学习笔记
Docker学习笔记(2)
文章共3780字18图 预计阅读时间11分钟 前言 如何安装Docker?请参考上一篇文章(传送门) Docker环境信息、容器生命周期管理部分命令参考上一篇文章(传送门) 总结到了一张脑图上,可以做
天钧
2019/09/03
4910
Docker学习笔记(2)
【快学Docker】Docker镜像相关操作
Docker运行容器前需要本地存在镜像,如果本地不存在镜像,Docker则会尝试从远端仓库拉去镜像。镜像是Docker一大核心,我们今天就来了解下Docker镜像的相关操作。
Happyjava
2019/07/16
6180
【快学Docker】Docker镜像相关操作
Terrier:一款功能强大的镜像&容器安全分析工具
Terrier是一款针对OCI镜像和容器的安全分析工具,Terrier可以帮助研究人员扫描OCI镜像和容器文件,并根据哈希来识别和验证特定文件是否存在。
FB客服
2020/06/16
9290
干货 | Docker文件系统的分层与隔离
张克琛 英文名Marshall,我们亲切的叫他马老师(以下简称M老师) 专注运维8年时间,经历过自主创业,负责过日均PV5千万的网站开发及 运维工作,目前担任云智慧运维总监,维护云智慧旗下监控宝几十万企业级 用户的SaaS平台,资深运维专家,喜欢接受一切新鲜事物,爱运维, 爱Docker! 现在就开始今天的分享~ M老师:docker 的很多特性都表现在它所使用的文件系统上,比如大家都知道docker的文件系统是分层的,所以它可以快速迭代,可以回滚。这个回滚机制跟github很像,每次提交的时候都会有一个
小小科
2018/05/02
1.9K0
突破 DockerHub 限制,全镜像加速服务
DockerHub 是全世界最早也是最大的容器镜像仓库,托管着众多操作系统发行版及各类软件的 Docker 镜像。
Jintao Zhang
2020/09/23
2.8K0
如何使用Skopeo做一个优雅的镜像搬运工
[TOC] 0x00 基础介绍 描述: 作为公司内部 PaaS toB 产品的打包发布人员,容器镜像对我们打工人而言就像是工地上的砖头 🧱,而我的一部分工作就是将这些砖头在各个仓库之间搬来搬去,最终
全栈工程师修炼指南
2022/09/29
4.8K0
如何使用Skopeo做一个优雅的镜像搬运工
docker(9)Dockerfile制作镜像[通俗易懂]
如果我们已经安装了一个python3的环境,如果另一台机器也需要安装同样的环境又要敲一遍,很麻烦,这里可以配置Dockerfile文件,让其自动安装,类似shell脚本
全栈程序员站长
2022/09/19
2.1K0
Docker 入门实践
张戈
2017/10/10
8.4K1
Docker 入门实践
云原生时代下的容器镜像安全(上)
Kubernetes 作为云原生的基石,为我们带来了极大的便利性,越来越多的公司也都将 Kubernetes 应用到了生产环境中。然而,在享受其带来的便利性的同时,我们也需要关注其中的一些安全隐患。
Jintao Zhang
2021/12/01
7510
云原生时代下的容器镜像安全(上)
构建django的docker镜像
采用centos镜像作为地板镜像,然后安装python3、pip3,再安装django即可。
Devops海洋的渔夫
2019/05/31
1.8K0
Docker入门(五):使用镜像
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库 下载该镜像。
传说之下的花儿
2023/10/03
8K1
Docker入门(五):使用镜像
docker基本命令
1、获取镜像 1 docker pull ubuntu:16.04 使用docker import导入镜像 1 2 3 4 [root@xs_test01 ~]# docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz openvz/ubuntu:14.04 Downloading from http://download.openvz.org/template/prec
dogfei
2020/07/31
3740
运维实践|如何使用docker离线安装mysql
docker是一种开源的容器化平台,可以将应用程序及其依赖项打包成一个隔离的容器,然后在任何操作系统中运行。MySQL是一个流行的开源关系型数据库管理系统。本文将介绍拉取镜像、保存镜像、创建容器、启动应用容器以及测试。
艾特
2024/02/28
3190
运维实践|如何使用docker离线安装mysql
Docker如何搭建私有registry镜像仓库
说明:在docker01机器有registry镜像和docker-registry-web镜像,用搭建私有镜像仓库和web页面访问。
踏歌行
2020/10/15
3.2K0
Docker如何搭建私有registry镜像仓库
Docker容器Registry私有镜像仓库安全配置与GC回收实践
描述:本来我想直接写Harbor的Docker镜像仓库搭建配置与使用,但是觉得还是应该从基础的Docker的Registry镜像讲起从安全构建到GC回收同时加深学习映像;
全栈工程师修炼指南
2022/09/29
2.5K0
Docker容器Registry私有镜像仓库安全配置与GC回收实践
【实践】4.DOCKER之使用镜像
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。 本章将介绍更多关于镜像的内容,包括: 从仓库获取镜像; 管理本地主机上的镜像; 介绍镜像实现的基本原理。
辉哥
2021/05/24
1K0
相关推荐
docker 仓库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验