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

转载 2016年05月30日 23:37:39

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注册帐号,在上面可以设置自己仓库里的镜像是否为私有。

?

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

Docker 是什么?我初接触到docker的一个疑问是docker到底能做什么?docker是一个什么东西?这里看下百度百科对docker的简单介绍:Docker 是一个开源的应用容器引擎,让开发者...
  • bugall
  • bugall
  • 2015年04月21日 14:02
  • 1445

Docker 快速上手系列(2): 容器的概念及相关操作

什么是容器简单的说,一个镜像想要跑起来需要一个载体,这个载体就是容器,前面的文章我们也提到了,容器加载镜像后会启动一个额外的可写文件层。 我们拿VM举例,VM虚拟的是整个操作系统,然后可以在里面跑引...
  • bugall
  • bugall
  • 2015年04月21日 15:27
  • 1026

Docker 快速上手系列(3): 仓库的概念及相关操作

Docker Hub首先我们先区分下两个概念,一个是仓库,一个是注册服务器。 Docker里仓库是集中存放镜像的地方,而注册服务器是放仓库的, 一个注册服务器可以存放多个仓库,例如:dl.dock...
  • bugall
  • bugall
  • 2015年04月23日 20:01
  • 804

Docker 快速上手系列(4): 数据卷,数据卷容器的概念及相关操作

引子有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作。容器中管理数据主要有两种方式: 数据卷 数据卷容...
  • bugall
  • bugall
  • 2015年04月28日 13:47
  • 1436

Docker 快速上手系列(5): 网络基础配置和容期间通信

引子一个web服务跑起来必不可少的两大功能模块:业务处理,数据服务,大型的web服务需要的组件更多,这往往需要多个容器,但是我们还需要这些容器之间可以进行网络通信,相互配合。 Dokcer目前只支持...
  • bugall
  • bugall
  • 2015年04月28日 18:02
  • 1051

Docker 镜像、容器、仓库的概念及基本操作

Docker 镜像、容器、仓库的概念Docker镜像Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像可以完全包含了Ub...

Docker入门教程 Part 1 基础概念 - 镜像、容器、仓库

第一篇笔记,先总体介绍Docker,及它与虚拟机技术的区别,最后再介绍Docker的最基础的三大组件概念。...
  • iotisan
  • iotisan
  • 2017年10月19日 16:18
  • 150

快速上手写spark代码系列03:开始写一个spark小脚本(1)

快速上手写spark代码系列:03-开始写一个spark小脚本(1)快速上手写spark代码系列03-开始写一个spark小脚本1 训练背景设置 第一步准备数据集 第二步读取文件 第三步做字段提取生成...
  • bon_mot
  • bon_mot
  • 2017年06月30日 16:55
  • 313

Rancher 快速上手指南操作(1)

Rancher 快速上手指南操作(1) 该指南知道用户如何快速的部署Rancher Server 管理容器。 前提是假设你的机器已经安装好docker了。 1 确认 docker 的版本,下面是...

docker 学习笔记1——安装与相关概念

本文展示在windows7上安装docker的步骤。 安装docker 由于Docker 引擎使用了Linux内核特性,所以在windows系统中,你不能直接运行 Docker,而是使用Docke...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Docker快速上手系列(1):镜像的概念及相关操作
举报原因:
原因补充:

(最多只允许输入30个字)