镜像制作大法

一、前言

上一节《程序员背锅救星-docker》中,我们讲述了docker最基本的概念以及镜像、容器以及仓库的概念和使用,还包含了实践内容,我们通过拉取centos镜像,创建容器并且进入容器对linux系统进行操作;但是那只是利用了仓库中的镜像,然后创建容器进行操作的,那我们如果需要自己的镜像改怎么做呢?这次就和大家一起看看镜像是怎么制作的~


二、制作镜像

一般制作镜像有两种方式,一种是基于commit命令,另外一种是基于dockerfile创建镜像;

过程如下图所示:


对于这两种创建镜像的方式,我们会实地操作一下,并且会区分一下两种镜像创建的优点缺点;

一般在工作中,会采用第二种方式,至于为什么不采用第一种,后面细说~


<1>基于commit命令

基于commit命令

命令:

docker commit :从容器创建一个新的镜像。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

实践:

按照之前《程序员背锅救星-docker》中的实例,我们把这个容器制作成一个新的镜像;

1、拉取镜像
docker pull centos:centos7


2、运行镜像
docker run -itd --name centos-test centis:centos7


3、进入容器并安装gcc、vim


4、在vim中编写C代码并编译运行
#include 

int main(){    printf("this is test\n");    return 0;}


5、退出容器
exit


6、获取容器
docker pa -a


7、从容器中制作镜像
docker image 10ba02adb18f


8、再次制作容器
docker run -it --name test mycentos:V1 /bin/bash

进去发现,我们之前所有的环境都存在,证明我们的镜像制作的很成功



以上就是使用commit制作docker进行全部过程啦~


<2>基于dockerfile

基于dockerfile

1、dockerfile概念

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile由一行行命令语句组成,支持#注释。一般分为四个部分:基础镜像,维护者信息,镜像操作指令和容器启动时执行指令


2、Dockerfile 命令

下面简单的介绍几个命令:

  • FROM

    指明构建的新镜像是来自于基础镜像是什么,比如:

    FROM gcc:latest
  • RUN

    用于执行后面跟着的命令行命令,有两种格式:

    • shell 格式:RUN (终端操作命令一样),例如:

      RUN mkdir tmp
    • exec 格式:RUN ["可执行文件", "参数1", "参数2"],例如:

      RUN ["./test"]

  • COPY

    拷贝文件或目录到镜像中,COPY...,例如:

    COPY test.cpp /home/CPP

  • ADD

    拷贝文件或目录到镜像中,ADD...例如:

    ADD test.cpp /home/CPP

    如果是URL或压缩包,会自动下载或自动解压。


  • WORKDIR

    为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:

    WORKDIR /home/CPP

  • CMD

    启动容器时执行的Shell命令,例如:

    CMD [“./test”]

    注:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

    • CMD 在docker run 时运行。
    • RUN 是在 docker build。

  • ENV

    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

    格式:

    ENV  

基本的命令就是这些了,对于我们构建一个镜像也差不多了,后续需要其他命令,可以自行学习~

实践

构建一个运行C++程序的镜像

1、编写C++代码
#include #include 

using namespace std;

int main(){    while(1)    {        sleep(1);        cout<<"this is test"<    }    return 0;}

2、编写dockerfile
FROM codenvy/cpp_gccRUN mkdir /home/testADD test.cpp /home/testWORKDIR /home/testRUN g++ test.cppCMD ["./a.out"]
3、创建镜像

执行命令:

docker build -f ./test_dockerfile -t test_cpp_dockerfile .

如果提示下面的错误:

 ---> Running in de73d0b0da3emkdir: cannot create directory ‘/home/test’: Permission deniedThe command '/bin/sh -c mkdir /home/test' returned a non-zero code: 1

需要在dockerflie中加上

USER root


5、查看镜像是否创建成功
docker images


6、运行容器
docker run test_cpp_dockerfile

我们会发现我们的程序运行正常,没有异常。


三、总结

这就是我们一般使用这两种方式构建镜像,但是我们一般使用**Dockerfile **进行创建,原因如下:(采用网络资料)

使用docker commit命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。

首先,如果在安装软件,编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像及其臃肿。

此外,使用docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制定镜像的人知道执行过什么命令,怎么生成的镜像,别人根本无从得知,而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作的。虽然docker diff或许可以得到一点线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。

而且,任何修改的结果仅仅是在当前层进行标记,添加,修改,而不会改动上一层。如果使用docker commit制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到,这会使镜像更加臃肿。

docker commit有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用docker commmit定制镜像,定制行为应该使用Dockerfile来完成。

祝大家早日熟练使用docker相关命令~


程序员背锅救星-docker

重温TCP协议

探索静态库与动态库的“奥秘”

禁止拷贝构造,禁止bug

微信公众号 : 后台服务器开发

语言:C++ JAVA  python

● 扫码关注我们

点点在看行不行

改镜像_镜像制作大法相关推荐

  1. anaconda 安装tensorfollow 镜像_镜像也有可能出问题

    镜像也有可能出问题 本文基于windows,所有类似的字段需要自行进行替换. 在使用python和R时,经常需要安装包,包的官方服务器在国外,我们一般选择配置国内镜像来解决下载速度问题. 国内镜像最常 ...

  2. jvm 内存镜像_镜像镜像–使用反射在运行时查看JVM内部

    jvm 内存镜像 开发人员:Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射. 它是Java和Scala编程的主要方面,它使我们 ...

  3. a10 amd 安装黑苹果_通宵制作黑苹果lingxi_AMD_Ryzen_macOS_10.13.傻瓜版安装镜像

    通宵制作黑苹果lingxi_AMD_Ryzen_macOS_10.13.简单傻瓜版安装镜像: 嗨,大家好! 这次是给大家带来的是AMD Ryzen平台全新的mac10.13.3的简洁安装镜像! 镜像安 ...

  4. dockerfile安装yum_Docker镜像-基于DockerFile制作yum版nginx镜像

    Docker镜像-基于DockerFile制作yum版nginx镜像 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. DockerFile可以说是一种能被Docker程序解释的脚本, ...

  5. 【制作镜像】BCEC制作镜像

    如要制作的新镜像已存在标准版本镜像,即linux发行版本相同(此处指CentOS6.5 64位),可利用BCEC制作. 在BCEC创建centos6.5系统的可联外网的虚机,ssh到此虚机,用yum方 ...

  6. 系统镜像_如何通过云服务器创建Windows系统镜像

    系统盘镜像是包含用户运行业务所需的操作系统.应用软件的镜像. 用户可以通过已安装Windows操作系统的云服务器来创建Windows系统盘镜像. 本指南以创建Windows系统盘镜像为例,指导您通过云 ...

  7. 系统制成docker镜像_如何让Docker基础镜像变得更小?

    本次实验是基于上一篇在<Centos7系统上制作一个7系的Docker镜像>方法制作,只是这次先在Centos65的系统上实现,并配置本人在减少镜像大小的一些思路和方法: 系统环境: Ce ...

  8. linux 镜像自动安装,制作能自动安装的CentOS镜像文件

    FILE=\'/root/packages.txt\' DEST_DIR=\'/root/iso/CentOS\' SRC_DIR=\'/media/cdrom/CentOS\' While  rea ...

  9. 系统制成docker镜像_docker镜像原理 镜像制作 dockerfile

    为什么一个centos镜像只有两百多兆,而tomcat镜像五百多兆 1.先说说操作系统 操作系统组成部分: 进程调度子系统 进程通信子系统 内存管理子系统 设备管理子系统 文件管理子系统 网络通信子系 ...

最新文章

  1. 图解CAN总线数据的组成和帧格式
  2. 基于R语言构建的电影评分预测模型
  3. 网管网络布线之常用兵器谱
  4. 叫你两招编辑PDF文档的方法
  5. Android属性动画 ViewPropertyAnimator
  6. 面试官问:ZooKeeper是强一致的吗?怎么实现的?
  7. Unity将来时:IL2CPP是什么?
  8. 数据结构基础:栈和队列学习笔记
  9. 前端JS笔试面试题目
  10. 计算机网络中的node是指_信息工程及计算机网络技术简介
  11. 那是财务自由的声音!寒武纪上市造就一批85后亿万富翁
  12. turtlebot3_teleop_key 键盘控制程序,使之0速度时不会一直发送 topic,通过topic代替键盘控制小车运动。
  13. 学习 尚硅谷_宋红康_第2章_Java基本语法(下):程序流程控制超详细课件
  14. 魔方机器人之下位机编程----串口接收数据并解析
  15. Chrome浏览器模拟手机访问网站
  16. 偷窥Play Framework 2.0
  17. oracle数据库表空间扩容方法
  18. html项目答辩策划书,职业生涯规划大赛答辩会策划书
  19. PMP考纲解读 |【人】任务3—支持团队绩效(二)
  20. 眼保健操(UPWND公益版)保护眼睛

热门文章

  1. SAP UI5 router的初始化逻辑
  2. FioriLaunchpad.html的三个round-trip
  3. How does framework interpret $expand=Notes
  4. 根据变量值取得变量的参数名
  5. 如何处理错误消息Please install the gcc make perl packages
  6. CRM product UI里assignment block的显示隐藏逻辑
  7. python php perl,python 调用 php 范例
  8. PHP于js的交互,关于php与js交互问题
  9. 【测评】想买投影仪,预算又不多,该怎么选?——三款高性价比投影仪PK测评
  10. left join 后数据变多_Flink 双流 Join 的3种操作示例