关闭

Docker快速上手系列(1):镜像的概念及相关操作

标签: 虚拟机
174人阅读 评论(0) 收藏 举报

Docker 是什么?

我初接触到docker的一个疑问是docker到底能做什么?docker是一个什么东西?这里看下百度百科对docker的简单介绍:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。 

我们可以看出来,Docker是一个容器引擎,这个容器可以实现虚拟化。虚拟化又是什么东西呢?其实虚拟化就是一种资源管理方式。我们看下常用的几种虚拟化方式:

1.完全虚拟化: 对底层硬件完成的虚拟。例如:VMware Workstation
2.部分虚拟化: 只对部分硬件资源的虚拟
3.操作系统级虚拟: 内核通过创建多个虚拟的操作系统实例来隔离各个进程。

我们要说的Docker的容器虚拟化的实现方式就是操作系统级虚拟

Docker的三大功能模块

1.镜像 2.容器 3.仓库

这篇我们主要介绍下镜像。
Docker镜像(image)和虚拟机的镜像相似,用过VM的都知道,如果你想在你的mac中使用windows操作系统,那么我们通常使用的方法是下载一个虚拟机管理程序,例如VirtualBox,然后再下载一个windows的镜像。我们打开VirtualBox加载我们的windows镜像,这样一个windows就能通过虚拟机在mac上跑起来了。后面我们会说Docker容器加载Docker镜像。

获取镜像

就像上面介绍的VirtualBox加载windows镜像的过程一样,但是这里我们不需要虚拟机管理工具,我们的Docker容器已经解决了虚拟机管理工具这一需求,接下来我们要做的就是得到我们需要运行起来的镜像。

?
1
<code class="language-python hljs ">docker pull # docker pull NAME[:TAG]</code>

这里写图片描述

首先我们来看下这条命令:“docker pull ubuntu:14.10”,其实就是下载远端仓库中的ubuntu系统镜像,给它一个TAG标识以助于我们以后能清晰知道各个镜像的功能和内容就像这里的“14.10”,如果你用过Git(一个版本管理工具,博客的其它文章对其有介绍)你会发现有种似曾相识的感觉,使得docker的三大核心功能之一就是仓库,实现形式和Git类似,这里docker pull是从Docker Hub仓库中下载相应镜像到本地,这里的Docker Hub仓库就类似Github一样,不过前者存的是镜像,后者存的是代码。同样的docker也可以像Git那样指定自己的仓库地址。
我们再来看下上面docker pull ubuntu:14.10 这条命令的输出结果,其实我们这里只是下载一个系统镜像,为什么会有5个文件下载成功的显示呢?其实这里docker仓库对镜像存储是按照层来实现的,第一列的数字字母组合代表层的id,为什么用这种形式存储呢?我想就类似我们DB的增量备份的概念一样。节省不必要的空间浪费,提高镜像备份,下载效率。

查看镜像

我们怎么可以才能找到我们本地下载的所有可用镜像呢?这里我还是以Git举例,就像Git怎么查看本地的分支呢?

?
1
<code class="language-python hljs "><code class="language-python hljs ">docker images </code></code>

这里写图片描述
从左至右看下这些字段什么意思:
repository : 来自于哪个仓库,比如ubuntu仓库
tag : 镜像的标签信息
image id : 镜像的唯一id
created : 创建时间
virtual size : 镜像的大小
<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlIGNsYXNzPQ=="language-python hljs ">Tag: 用来标记标记同一仓库的不同镜像,我们也可以对本地的镜像手动添加Tag标识
这里写图片描述
我们可以看到多出了一个job1镜像,其中他们的image id 是一样的,其实他们指向的是同一个镜像文件,只是别名不一样而已。

搜索,删除镜像

?
1
<code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs ">docker search</code></code></code>

这里写图片描述
我们看下这些可选参数什么意思

1.- - automated=false : 只显示自动创建的镜像文件
2.- - no-trunc=false : 输出信息不截断显示
3.-s , - -stars=0 : 制定仅显示评价为指定星级以上的镜像

这里写图片描述
字段从左至右的描述分别为:名字,描述,星级,是否官方创建,是否自动创建。其中星级的表示受欢迎的程度,星级越高越受欢迎。

删除镜像

?
1
<code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs ">docker rmi NAME[:TAG] #删除镜像</code></code></code></code>

这里写图片描述
这里我们删除了刚刚创建的job1:fitest可是看到,删除后的镜像文件其实还是存在的,我们只是删除了一个TAG标记而已。并没有真正的删除镜像文件。如果镜像文件只有一个tag标签的时候,这时候再执行docker rmi命令
进行删除的时候就会删除镜像文件。

另外一种删除镜像的方式。通过iamge id删除镜像文件,这是会删除所有标记在对应镜像上的所有tag,如果被删除的镜像在容器中运行时,是无法删除该镜像的,但是可以通过命令docker rmi -f 强制删除一个镜像,官方不建议通过这种方式删除一个镜像,因为后期会产生一些遗留问题(官方没有说啥影响),官方提供的正确步鄹是先删除依赖该镜像的容器,然后再删除镜像。

?
1
2
<code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs ">docker ps -a #显示所有容器
docker rm CONTAINER_ID#删除制定容器</code></code></code></code></code>

创建镜像

创建镜像有三种方式:
1.基于已有镜像的容器创建
2.基于本地模版导入
3.基于Dockerfile创建

基于已有镜像的容器创建镜像

docker commit [options] container [repository[:tag]]

-a : - -author=”” 作者信息 -m: - -message=”“提交信息 (跟Git多像啊,git commit -m ‘test’) -p: - -pause=true 提交时暂时停止容器

这里写图片描述
这里的7868e765e7d为该容器的id,这是的容器跟ubuntu:14.04镜像相比已经发生了改变,我们在它里面创建了一个1.txt文件。
这里我们需要注意的是,docker的容器加载image镜像后,是在原有的镜像之上加了一个可写层,对于docker镜像来说是只读的,所以我们添加了一个1.txt文件并没有添加到ubuntu:14.04镜像里,而是写在科协层里。接下来我们把改动提交(和Git太像了)。 这时我们再来看看现在的镜像文件:
这里写图片描述

基于本地模版导入

cat ubuntu-14.04.tar.gz | docker import - ubuntu:14.04

导出导入镜像

?
1
2
3
4
5
6
7
<code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs ">    docker sava #导出镜像
    etc: docker save -o ubuntu_14.04.tar ubuntu:14.04
 
    docker load #导入镜像
    etc: docker load --input ubuntu_14.04.tar 或
         docker load < ubuntu_14.04.tar
    #注意这里所说的导入是指导入本地镜像列表</code></code></code></code></code></code>

上传镜像到仓库

?
1
<code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs "><code class="language-python hljs ">    docker push NAME[:TAG]</code></code></code></code></code></code></code>

如果你使用的是默认的远端仓库(DockerHub),你需要在DockerHub注册帐号,在上面可以设置自己仓库里的镜像是否为私有。

?

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:110461次
    • 积分:1612
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:191篇
    • 译文:0篇
    • 评论:0条
    文章分类