硬盘镜像制作 (镜像视频制作)

镜像制作*法大**

镜像备份制作,如何制作镜像图

一、前言

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

二、制作镜像

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

过程如下图所示:

镜像备份制作,如何制作镜像图

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

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

<1>基于commit命令

基于 commit命令

命令:

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

dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]

OPTIONS说明:

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

实践:

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

1、拉取镜像

dockerpullcentos:centos7

镜像备份制作,如何制作镜像图

2、运行镜像

dockerrun-itd--namecentos-testcentis:centos7

镜像备份制作,如何制作镜像图

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

镜像备份制作,如何制作镜像图

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

#include<stdio.h>

intmain()
{
printf("thisistest\n");
return0;
}

镜像备份制作,如何制作镜像图

5、退出容器

exit

镜像备份制作,如何制作镜像图

6、获取容器

dockerpa-a

镜像备份制作,如何制作镜像图

7、从容器中制作镜像

dockerimage10ba02adb18f

镜像备份制作,如何制作镜像图

8、再次制作容器

dockerrun-it--nametestmycentos: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 ”] CMD 在docker run 时运行。RUN 是在 docker build。 注:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

  • ENV 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。 格式: ENV <key> <value>

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

实践

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

1、编写C++代码

#include<iostream>
#include<unistd.h>

usingnamespacestd;

intmain()
{
while(1)
{
sleep(1);
cout<<"thisistest"<<endl;
}
return0;
}


2、编写dockerfile

FROMcodenvy/cpp_gcc
RUNmkdir/home/test
ADDtest.cpp/home/test
WORKDIR/home/test
RUNg++test.cpp
CMD["./a.out"]

3、创建镜像

执行命令:

dockerbuild-f./test_dockerfile-ttest_cpp_dockerfile.

如果提示下面的错误:

--->Runninginde73d0b0da3e
mkdir:cannotcreatedirectory‘/home/test’:Permissiondenied
Thecommand'/bin/sh-cmkdir/home/test'returnedanon-zerocode:1


需要在dockerflie中加上

USERroot

镜像备份制作,如何制作镜像图

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

dockerimages

镜像备份制作,如何制作镜像图

6、运行容器

dockerruntest_cpp_dockerfile

镜像备份制作,如何制作镜像图

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

三、总结

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

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

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

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

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

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

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