文档章节

docker学习四 镜像1----镜像的创建

dkpenl
 dkpenl
发布于 2017/08/31 14:04
字数 1667
阅读 42
收藏 0

       在上一节,我们从docker的官方仓库(这样的仓库有很多,比如国内的网易、阿里)获取了一个镜像,这一节我们主要聊聊镜的创建、导入导出、移除镜像。因为这个系列的文章主要偏重于docker入门及基本使用,所以,docker镜像的原理及工作机制就不在这里序述了(关键是我也不懂),有兴趣的朋友可以在度娘里找一找docker镜像原理这类的文章,这里看到过一篇文章给大家推荐一下:http://www.csdn.net/article/2015-08-21/2825511

<a href='http://www.csdn.net/article/2015-08-21/2825511'>深入分析Docker镜像原理</a>

一、创建docker镜像

          docker镜像的制作可以通过三种方法:修改已有镜像、使用Dockerfile文件、本地文件系统导入。

          1、通过修改已有镜像创建新镜像

          修改已有镜像这是最简单的方式,在别人已制作好的镜像的基础上,定制自己的需求然后形成新的镜像。比如:我们可以从仓库下载一个只含有最基础centos系统的镜像,然后安装jdk、mysql、tomcat这样就让自己拥有了一个具有java web运行环境的新镜像。为了简单点,我们这里只安装vim工具(linux下的一个文本编辑工具)为例。

          首先,我们先使用docker images命令查看一下我们已拥有的镜像:

           

        这里我们有两个镜像,一个是hub.c.163.com/library/tomcat镜像,别一个是docker.io/ubuntu镜像,我们基于ubuntu镜像启动一个容器:

          

         我们通过docker run -it docker.io/ubuntu:12.04 /bin/bash 命令以终端交互式的方式启动了一个容器(请记住这个容器的ID:823333f46325一会儿会用到),下面我们可以直接输入命令,在这个容器中安装vim工具:

         

         我们在输入apt-get install vim命令时有可能无法安装,我们需要先更新一下使用:apt-get update命令升一下级。然后,我们再安装vim工具:

        

       点击“y”,完成vim的安装。

        现在,我们使用exit来退出,此时我们的容器已经被我们改变了(安装了vim),接着我们使用docker commit 命令来提交更新后的副本。(可以想象是往版本控制系统里提交变更:首先创建一个容器,并在容器里做修改,就行修改代码一样,最后在将修改提交为一个新镜像。)输入以下命令:

        docker commit -m='a new image'-a='user1' 823333f46325 docker.io/ubuntu:12.05

        其中,  -m 来指定提交的说明信息,跟我们使用的版本控制工具一样;    -a   可以指定更新的用户信息;之后是用来创建镜像的容器的ID,最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID信息,之后,我们再通过docker images命令可以看到,我们本机会多处一个12.05版本的镜像:

      总结一下,通过docer run启动一个容器,然后在这个容器中完全成自己的修改后(如安装了一个软件 ),我们再通过docker commit命令提交一个新的镜像,这样就创建了一个新镜,非常简单。

      2、利用Dockerfile来创建镜像

       使用 docker  commit来扩展一个镜像比较简单,但是如果想定制化程序更高,更方便灵活的定制自己的镜像,那么使用dockerfile来创建镜像是一个不错的办法。

       dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。docker程序将这些Dockerfile指令翻译真正的linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

       首先,新建一个目录和dockerfile:

       $    mkdir    dockertest
       $    cd    dockertest
       $    touch    Dockerfile

        $    vi    Dockerfile

         编辑Dockerfile文件,内容如下:

         #    This    is    a    comment
          FROM docker.io/ubuntu:12.04        
          MAINTAINER    test user   
          RUN    apt-get    -qq    update
          RUN    apt-get    -qqy    install    vim

          上面的命令解释如下:

           FROM  指令告诉    Docker    使用哪个镜像作为基础 

           MAINTAINER    用来指定镜像创建者信息

           RUN     可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。 

           编写完成Dockerfile后可以使用docker    build来生成镜像。

           

            其中  -t 标记来添加    tag,指定新的镜像的用户信息。    “.”    是    Dockerfile    所在的路径(当前目录)替换为一个具体的Dockerfile 的路径。

           可以看到    build    进程在执行操作。它要做的第一件事情就是上传这个    Dockerfile    内容,因为所有的操作都要依据    Dockerfile    来进行。    然后,Dockfile    中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的        docker    commit        一样)。当所有的指令都执行完毕之后,返回了最终的镜像    id。所有的中间步骤所产生的容器都被删除和清理了。

         此外,还可以利用   ADD  命令复制本地文件到镜像;用   EXPOSE 命令来向外部开放端口;用   CMD  命令来描述容器启动后运行的程序等,更多的内容请大家自行查找这里不在一一介绍了。

      3、从本地文件系统导入

          可以使用 docker import 从容器快照文件中再导入为镜像,例如:       

          udo    cat    ubuntu-14.04-x86_64-minimal.tar.gz        |docker    import    -    ubuntu:14.04

          此外,也可以通过指定 URL 或者某个目录来导入,例如:

           $sudo docker import http://example.com/exampleimage.tgz example/imagerepo

           

         总结一下,docker镜像的创建都比较简单,可以直接修改原有镜像形成新镜像(docker commit),也可以使用dockerfile文件(docker build)构建,最后还能从本地或远程导入(docker import)。

         下一节,我们讲一下镜像的上传、载入载出以及移除镜像。

 

   

© 著作权归作者所有

共有 人打赏支持
dkpenl
粉丝 1
博文 11
码字总数 9873
作品 0
成都
程序员
容器Docker学习系列六~命令学习仓库命令

在前面几篇文章中,我们学习了怎么安装Docker,并进行本地Docker的操作,现在我们就学习下Docker仓库的学习,其实Docker很多理念操作也是来自git,比如我们在下载一个镜像的时候,可以看到多个...

LuckQI
08/21
0
0
容器Docker学习系列五~命令学习history,save, import

随着我们几篇文章Docker的命令学习,关于Docker本地镜像管理的命令学习已经接近尾声。今天我们就学习下本地镜像管理的最后三个命令history,save, import。当然前面命令没有掌握熟练的同学可以...

LuckQI
08/19
0
0
Docker学习笔记四 镜像

4.1 Docker镜像介绍 Docker镜像是由文件系统叠加而成。最底端是一个引导文件系统(bootfs),Docker用户几乎不会和引导文件系统有交互,当容器启动后它会被卸载而移动到内存中。 第二层是roo...

一万
2016/07/09
144
0
docker学习五   镜像2----镜像的上传、载入、载出和移除

在前面几节里,我们从docker的官方仓库获取了镜像,也可以从国内的仓库,比如网易、阿里的仓库里下载镜像,当然一个公司或个人也可以创建私有的仓库。当我们创建或修改了镜像后,也可以把这些...

dkpenl
2017/10/26
0
0
【Docker】第二篇 Docker镜像的使用

docker镜像管理 一、搜索镜像 1、下载一个docker镜像:我们可以通过登陆docker网站搜索自己需要的镜像,可以选择自己所需要的版本,然后通过详情也可以看到: 网址:https://hub.docker.com/...

旅行者-Travel
09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之声明合并(二)

转发 TypeScript基础入门之声明合并(二) 声明合并 合并命名空间 与接口类似,同名的命名空间也将合并其成员。 由于名称空间同时创建了名称空间和值,因此我们需要了解它们是如何合并的。 要合...

durban
25分钟前
0
0
centos7系统安装sersync+rsync实现服务器同步功能

centos7系统安装sersync+rsync实现服务器同步功能 MQ_douer0人评论21708人阅读2017-04-08 15:49:03 一、为什么要用sersync+rsync架构? 1、sersync是基于inotify开发的,类似于inotify-tools...

linjin200
25分钟前
1
0
Windows下安装phpRedis扩展

Windows下安装phpRedis扩展 通常在做PHP程序测试时,会用到Redis。而一般测试都是在Windows下进行的,所以需要在Windows环境下安装phpRedis扩展,用以支持php对Redis的访问。 工具/原料 php调...

梦梦阁
30分钟前
1
0
HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法

HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法 在做双十一压测时,高并发调用requests时报错.问题解决方法 问题原因 是因为在每次数据传输前客户端要和服务器建立TCP...

_Change_
35分钟前
0
0
iosdfgh

复制 IO流 (***** 了解 *****) 1.1 概述 之前我们学习了 File 类,这个类中有很多操作文件本身的方法, File类它只能操作文件或文件夹,并不能去访问文件中的数据。真正保存数据的是文件,数据...

码农屌丝
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部