简单地理解,Docker镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。

谈到这里,我们可能需要先补充一点与Linux操作系统相关的知识:

一般而言, Linux分为两个部分:Linux内核(Linux Kernel)与用户空间,而真正的Linux操作系统,是指Linux内核,我们常用的Ubuntu,Centos等操作系统其实是不同厂商在Linux内核基础上添加自己的软件与工具集(tools)形成的发布版本(Linux Distribution)。

因此,我们也可以把镜像看成是上面所说的用户空间,当Docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上。

这里要强调一下镜像的两个特征:

镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。

镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。

通过下面的示意图,我可以更好地理解Docker镜像与Linux的关系:

操作镜像的命令

Docker中与镜像操作相关的命令都在docker image这条子命令下,通过docker image --help这条命令,可以看到docker image子命令的详细文档,如下:

Usage: docker image COMMAND

Manage images

Commands:

build Build an image from a Dockerfile(构建镜像的命令)

history Show the history of an image(显示镜像构建历史过程)

import Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)

inspect Display detailed information on one or more images(显示一个镜像的详细信息)

load Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)

ls List images(查看镜像列表)

prune Remove unused images(删除虚悬镜像)

pull Pull an image or a repository from a registry(从仓库拉取镜像)

push Push an image or a repository to a registry(推送镜像到仓库)

rm Remove one or more images(删除镜像)

save Save one or more images to a tar archive (streamed to STDOUT by default)(保存镜像到文件)

tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)

获取镜像

在安装了Docker之后,我们本地并没有任何镜像,当然我们可以自己构建,不过更方便还是从Docker官方提供的仓库服务Docker Hub上拉取官方或第三方已经构建好的镜像。

拉取镜像可以使用docker image pull,其格式如下:

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

当然,docker image pull有更简洁的用法:如:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

要拉取镜像,需要指定Docker Registry的URL和端口号,默认是Docker Hub,另外还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,而仓库名则由作者名和软件名组成。

所以,在省略了那么参数后,比如我们想拉取centos镜像,可以使用下面简单的命令从Docker Hub上拉到:

$ docker pull centos

查看本地镜像

通过上面的方法我们将镜像拉取到了本地,那要如何查看本地有哪些镜像呢?通过下面的命令我们可以查看本地的全部镜像:

$ docker image ls

当然Docker提供了更简洁的写法,如下:

$ docker images

虚悬镜像

我们知道Docker镜像名由仓库名和标签组成,但有时候我们会看到仓库名和标签皆为的镜像,我们称为这种镜像为虚悬镜像,如下图所示:

虚悬镜像一般是当我们使用docker pull拉取最新镜像时,生成的新的镜像,所以仓库名和标签给了新的镜像,旧的镜像仓库和标签则被取消,成为虚悬镜像。

我们可以使用下面的语句打印所有的虚悬镜像:

$ docker image ls -f dangling=true

一般的虚悬镜像已经没有什么作用了,所以可以清理掉的,下面的命令可以清除所有的虚悬镜像:

$ docker image prune

不过,如果我们想保留一些有用的虚拟镜像时,可以使用docker tag命令重新给镜像起个仓库名和标签:

$ docker tag 621d57f27e93 "test:1.0"

镜像导出与导入

如果想与别人共享某个镜像,除了从镜像服务仓库中pull镜像和把镜像push到仓库上去之外,其实我们还可以将本地构建好的镜像直接导出并保存为文件发送给别人,如下:

$ docker image save -o /tmp/test_image.tar.gz centos:latest

而当你拿到别人导出的镜像文件,你可以使用docker load命令把镜像加载到本地的Docker镜像列表中,如下:

$ docker load < /tmp/test_image.tar.gz

删除本地镜像

要删除一个或多个本地的镜像,可以使用下面的命令:

docker image rm [option] IMAGE1,IMAGE2,...IMAGEn

也可以使用更简洁的方式,如:

docker rmi [option] IMAGE1,IMAGE2,...IMAGEn

可以使用镜像的长id、镜像短id、镜像摘要以及镜像名称来删除镜像,如下

$ docker rmi f7302e4ab3a8

一般更常用镜像的短id,如:

$ docker rmi f7302

使用镜像的摘要也可以删除镜像,镜像的摘要可以使用下面的命令查询:

$ docker image ls --digests

当然我们想要清除本地全部镜像时,可以使用下面的命令,不过一般不建议使用。

$ docker rmi $(docker images -qa)

另外,一般如果镜像已经被使用来创建容器,使用上面的命令删除会报下面的错误,告诉我们该镜像已经被使用,不允许删除。

Error response from daemon: conflict: unable to remove repository reference "mysql:5.7" (must force) - container ccd406c07a78 is using its referenced image e1e1680ac726

对于已经被用于创建容器的镜像,删除方法有两种,一种是先把容器删除,再删除镜像,另一种则只需要在删除镜像的命令中跟一个-f参数便可,如:

$ docker rim -f f7302

使用docker commit构建镜像

上面的例子都是直接使用官方提供的镜像,其实,除了从官方仓库或其他镜像仓库拉取别人构建好的镜像外,我们也可以构建自己的镜像,一般有以下两种构建方式。

使用docker commit命令,我们可以将修改过的容器重新提交为一个镜像,如:

$ docker commit conntaner_id my-hello:1.0

使用这种方式构建的镜像,我们称为黑箱镜像,就是一个黑箱子一样,别人并不知道我们对容器做了哪些修改和操作,所以会对其安全性有所质疑。

所以不推荐使用这种方式构建镜像,下面我们介绍一种更加通用且方便的方式。

使用Dockerfile构建镜像

一般推荐编写Dockerfile来构建一种镜像,Docker Hub上的镜像都是采用这种方式构建的,采用这种方式的好处就是,我们不用把镜像分发给别人,而只是把Dockerfile和相应需要写入镜像的资料发给别人,别人也能自己构建镜像,安全透明。

编写一个简单的Got程序

package main

import "fmt"

func main(){

fmt.Println("Hello Go")

}

将Go程序编译为可执行程序,如:

$ go build hello.go

编写Dockerfile文件

下面我们编写一个简单的Dockerfile文件,构建自己的第一个镜像,如下:

# 从一个空白的镜像开始

FROM stratch

ADD hello /

# 执行

CMD /hello

开始构建镜像

编写好Dockerfile文件后,需要使用docker build命令进行构建,docker build命令的格式如下:

$ docker build [OPTIONS] PATH | URL | -# 注意最后的点(.)表示当前目录,即Dockerfile所在的目录

$ docker build -t "hello-go:1.0" .

上面只是简单演示了使用Dockerfile文件如何构建镜像,关于Dockerfile,还有许多更加深入地用法,我们之后有机再谈。

什么是linux系统镜像,什么是镜像(Image)?相关推荐

  1. Linux系统各发行版镜像下载(持续更新)---download

    http://www.linuxidc.com/Linux/2007-09/7399.htm Linux系统各发行版镜像下载(2014年10月更新),如果直接下载不了,请使用迅雷下载.并且注意,我的下 ...

  2. Linux系统各发行版镜像下载

    Red Hat Enterprise Linux 系列: Red Hat领导着Linux的开发.部署和经营,从嵌入式设备到安全网页服务器,它都是用开源软件作为Internet基础设施解决方案的领头羊. ...

  3. Windows环境下用虚拟机安装使用Linux系统(下载安装CentOS7镜像+下载安装VMware+配置虚拟机和系统安装)

    一.下载CentOS镜像 这是Linux的一个发行版,相比红帽子(RedHat)的企业版(Enterprise Linux)来说,这个是免费的版本,特点是兼容性和界面可能差了点,但是非常的稳定,占用资 ...

  4. linux系统下使用docker镜像并安装容器

    文章目录 一.docker安装及配置 1.操作文档 2.步骤 2.1 卸载旧版本 2.2 设置仓库 2.3 安装新docker 2.3 启动docker 2.4 设置docker开机自启动 2.5 卸 ...

  5. linux系统使用国内清华镜像下载安装Anaconda3

    这个有详细的安装 https://blog.csdn.net/ychgyyn/article/details/82258136 关键一点,Anaconda官网下载很慢,使用清华镜像更省时间 https ...

  6. VMware安装Linux系统找不到镜像系统(Operating system not found)

    针对于VMware虚拟机装载Linux镜像时,找不到镜像系统,一般存在的问题是:  CPU架构和所下载iso镜像不是对应的. 下面介绍与常用CPU相适用的iso镜像: 常用intel的cpu(即i5, ...

  7. linux上传挂载镜像文件,linux系统中挂载img镜像文件

    在网上下载了一个sentos的镜像文件: 2016-05-12-centos-lite-preview-bpi-m2p.img.我想在linux下把这个镜像挂载上,然后看看里面有那些文件. 我们可以把 ...

  8. linux vg 镜像,Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)...

    以下是风哥收集的Linux系统各种版本ISO镜像下载,包括redhat,centos,oracle,ubuntu等linux操作系统. Linux下载1:红帽RedHat Linux(RHEL5.RH ...

  9. Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)

    以下是风哥收集的Linux系统各种版本ISO镜像下载,包括redhat,centos,oracle,ubuntu等linux操作系统. Linux下载1:红帽RedHat Linux(RHEL5.RH ...

  10. u盘安装完linux系统没镜像,U盘刻录kali linux启动盘提示找不到镜像解决方案

    U盘刻录14.10镜像出问题的解决方法 从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见:https://bugs.launchpad.net/ubunt ... ...

最新文章

  1. PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)
  2. OSPF分解试验部分-LAB7:NSSA区域
  3. ES6 对象的新功能与解构赋值介绍
  4. java comp env 区别_加和不加java:comp/env/前缀有什么区别?
  5. KVM配置之(3)- 克隆
  6. Mac Oracle SQL Developer “欢迎使用“页卡死,解决办法
  7. mysql的分区技术作用_理解MySQL数据库分区管理的技术细节
  8. ubuntu中用apt命令卸载软件
  9. ES6的字符串与正则表达式
  10. 房屋建筑与装饰工程工程量计算新旧规范对比(二)
  11. 从几个简单例子聊聊Verilog的参数化设计(parameter、localparam和`define)
  12. P2168 [NOI2015]荷马史诗
  13. 计算机考研自我介绍大概多少字,考研复试中文自我介绍多少字合适
  14. 学习ArrayList 和 LinkedList小记【2】
  15. 无人机技术将从硬件创新转向自动化智能飞行
  16. Kaggle所有量化金融竞赛汇总。
  17. TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
  18. 《汇编语言》王爽(第四版) 课程设计1
  19. (-2147483648 0)?
  20. 超级计算机多层网络,超级计算机多层体系结构的摘要和描述

热门文章

  1. 用双引号作为for 里面delims的分隔符
  2. 第八周 oj 2001 打印数字图形
  3. (Python) PAT(Basic Level) Practice 刷题笔记(34-66)
  4. HTML/css/cavas打造的来自程序员的专属春节祝福【内含源码与运行方式】
  5. 怎么设置linux系统字体颜色,如何修改linux系统字体颜色
  6. 持续学习-Continual learning
  7. suse与opensuse的区别
  8. 【MD5】什么是MD5?md5的简要描述
  9. 人月神话的神话色彩 - Boehm的模型和数据分析
  10. 【自动驾驶技术】优达学城无人驾驶工程师学习笔记(七)——计算机视觉基础