【Docker】【基础】定制镜像

举报
huahua.Dr 发表于 2021/06/21 14:34:43 2021/06/21
【摘要】 所谓定制镜像就是以一个镜像为基础,在其上进行定制

所谓定制镜像就是以一个镜像为基础,在其上进行定制;定制镜像常用方法:

一、利用docker commit命令定制镜像

镜像是容器的基础,镜像是多层存储,每一层是在前一层的基础上进行的修改而来;二容器同样也是多层存储,是在以镜像为基础,在其基础上加一层作为容器运行时的存储层;利用docker commit命令可以将该容器的基础镜像加上运行容器的存储层打包构建成新的镜像。

步骤:

    • 使用docker run命令运行现有的一个docker镜像,启动一个容器
    • 使用docker exec -it  <container_name> /bin/bash命令进入一个运行中的容器
    • 进入到运行中的容器之后,根据自己想要定制的内容,修改容器内的文件内容,也就是修改容器的存储层
    • 修改完容器文件之后,使用exit命令,退出容器(注意不是停止运行容器)
    • 可以使用docker diff <container_name>命令查看容器文件的具体变动
    • 确认以上修改变动就是我们需要定制的内容之后,使用docker commit [optional] <container_id or container_name>  [<repository_name>[:<tag>]] 命令将正在运行的容器保存为镜像;例如:
      $ docker commit \
      --author "huahua.Dr" \
      --message "update default index.html" \
      webserver \
      nginx:v2
      
    • 使用docker images命令即可查看生成的新镜像了
    • 可以使用docker history [<repository_name>[:<tag>]]查看具体镜像的历史变化记录
    • 最后就可以使用新保存的镜像运行为一个容器了。

优点:

    • Docker commit命令利用了镜像分层存储的原理:在原来镜像的基础上,再叠加一层容器的存储层,构成新的镜像,这样很方便生成定制镜像
    • 使用场景:用于紧急情况下保留现场

缺点:

    • 使用docker commit命令制作镜像后,除了要修改的文件之外,还有大量的无关内容被添加进来:原来的镜像每一层都不会改变,变化的仅仅是当前层,每次修改都是改变当前层,制作修改次数一多,会造成镜像极为臃肿,体积会越来越大,无法重复利用
    • 使用docker commit制作的镜像为黑箱镜像,因为除了制作镜像的人以外不知道执行过什么命令,时间一长,很难进行维护,镜像构建透明性很差

二、使用dockerfile文件定制镜像

上面利用docker commit定制镜像的时候,知道镜像的定制实际上就是定制每一层所添加的配置、文件,镜像是分层存储的;为了解决使用docker commit定制镜像所带来的镜像体积大、镜像无法重复利用、镜像构建透明性差等问题,推荐使用Dockerfile脚本文件进行镜像构建,Dockerfile是一个文本文件,其中包含的每一条指令都表示构建镜像的每一层,即是每一条指令就类似我们调用了docker commit命令构建一层镜像,因此需要合理编写Dockerfile文件中的每一条指令。因为docker是clent/server模式,docker制作镜像都是客户端docker通过RESTAPI通信服务端dockerd,在dockerd完成镜像构建。

步骤:

    • 注意后面的.表示上下文路径context为当前路径,并不是Dockerfile文件路径(Dockerfile文件,默认为当前路径的一个名叫Dockerfile的文件);
    • 如果需要制定Dockerfile文件,使用docker build -f <dockerfile_path>制定Dockerfile文件路径;
    • 如果指令中有需要上传一些文件到dockerd,则需要将这些文件放到这个上下文路径上(因为dockerd才是真正制作镜像的地方,需要将所有需要的东西上传到dockerd后才开始制作镜像)
    • Docker build还支持git仓库、tar压缩包等方式构建
    • 在一个空白目录中,新建一个文本文件,命名为Dockerfile(Dockerfile为自定义名称,文件名可自定义,在docker build的时候指定即可)
    • 按照编写Dockerfile文件的规范,编写好需要定制的指令(注意:每一条指令都会构建一层镜像,因此需要合理使用指令,例如操作同一个资源的多步骤可以使用连接符&&将这些操作步骤连在一起,编写一条指令即可)
    • 编写完需要定制的指令之后,如果涉及到文件的下载、copy等,一定要记得在Dockerfile文件每一层构建的最后清理掉无关的文件,如脚本中下载文件,在当前层镜像制作完成后需要将下载的文件删除,避免臃肿。
    • 在Dockerfile文件所在目录执行命令:docker build  [optional] <Context or URL>; 例如:docker build -t nginx:v1 . 
    • 构建命令执行完,即可docker images查看构建的新镜像

优点:

    • 镜像构建透明化
    • 镜像可重复利用
    • Dockerfile文件编写好可避免镜像臃肿

缺点:

    • 编写Dockerfile文件指令有点复杂,需要对Dockerfile指令熟悉理解。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。