Docker 是一个基于GO语言开发的开源应用容器,开发者可以打包应用和相关包,到一个轻量级 、可移植的容器中,并且可以发布到任何机器 ,实现虚拟化,完全使用沙箱机制,而且性能开销很低。
其中镜像是Docker三大核心概念中最重要的一个。镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像是容器在本地运行的基础,Dokcer运行容器前需要本地存在对应的镜像,如果不存在对应的镜像,Docker 会先从默认的镜像仓库下载(如果用户不希望Docker从默认的镜像仓库下载镜像的话,可以使用自定义镜像仓库)。这篇文章将讲解镜像的拉取、查看镜像信息、搜索镜像、删除镜像和镜像的导入导出。
拉取镜像
要想拉取镜像,就要用到 pull 命令,该命令的语法为:
docker[image]pull NAME[:TAG]
注:pull 命令中参数 NAME 表示镜像仓库名称,TAG 表示镜像标签(一般表示为版本)
举个例子来看一下pull命令怎么使用。
我们从默认的镜像仓库与拉取 Ubuntu 16.04,输入如下命令:docker pull ubuntu:16.04
执行上面的命令,将会看到如下输出:
注1:如果不显示指定TAG,Docker默认使用latest标签,下载镜像仓库中最新的镜像
注2:latest标签会随着最新版本的变化而变化,例如昨天某镜像的版本是 1.0 ,今天上传了2.0版本的镜像,那么latest标签指的就是2.0这个版本
我们从前面的图中可以看到,在镜像下载过程中出现了4行,这四行代表着镜像文件有4个层,每层的唯一id就是每行开头的那串字符串(例如:35b42117c431)。当不同的镜像存在相同的层时,本地仅存出一份内容,这样就叫少了存储空间。
一般情况下,如果是从官方仓库注册服务器下载镜像文件时是不需要加上仓库注册服务器地址的,但是如果是从非官方仓库注册服务器下载的话,就需要加上注册服务器地址,例如我们要从阿里云下载ubuntu16.04的镜像,那么我们应该这样写命令:
docker pull registry.cn-shanghai.aliyuncs.com/ubuntu:16.04
常用的pull命令参数有如下两个:
查看镜像信息
查看镜像信息所用到的命令是 images 、 ls 和 inspect 命令。比如要查看当前电脑上存在的镜像,可以这么做:
docker images
或者
docker image ls
执行上面的命令,将会列出当前系统中存在的镜像,如下图
从上图中可以看出如下信息:
-
REPOSITORY:镜像来源
-
TAG:镜像标签,用于标记来自同一个仓库的不同镜像
-
IMAGE ID:镜像ID,镜像的唯一标识
-
CREATED:创建时间
-
SIZE:镜像大小
注1:镜像ID是很重要的信息,因为它是镜像的唯一标识,我们在操作镜像时需要用到它。一般情况下我们只会输入镜像ID的前N位就可以区分一个镜像了。
注2:镜像的大小只是代表了镜像的逻辑体积大小。由于相同镜像层在本地只会存储一份,因测镜像在物理上占用的空间小于各个镜像的逻辑体积之和。
images 和 ls 命令常用的参数选项如下:
我们有时候需要获取镜像详细的信息,这时我们可以使用 inspect 命令,语法格式为:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
例如我们要查看刚才我们拉取的Ubuntu16.04镜像的详细信息,可以这么操作:
docker inspect 13c9
运行上面的命令后,我们会看到镜像的详细信息以json的形式打印出来,如图:
我们不仅可以查看镜像的详细信息,同样我们也可以查看层的详细信息,这时就需要用到history 命令,语法如下:
docker history [OPTIONS] NAME|ID
例如我们查看Ubuntu16.04镜像层的详细信息:
docker history 13c9
运行命令,将打印出层的详细信息。
搜索镜像
我们可以使用 search 命令搜索仓库中的镜像,语法为:
docker search [option] keyword
option 常用的参数如下:
我们举个例子来看一下,我们要搜索仓库中包含mysql的镜像,代码如下:
docker search mysql
运行上面的命令,将会列出包含mysql关键字的镜像:
删除/清除镜像
1. 删除镜像
我们删除镜像的时候可以利用 镜像标签 、 镜像ID 来删除镜像。删除镜像的语法为:
docker rmi IMAGE_NAME|IMAGE_ID
例如我们利用镜像标签删除u16.04这个镜像:
docker rmi u16.04
运行上面的命令,u16.04这个镜像将会被删除。
注1:u16.04 这个镜像是我利用ubuntu:16.04 这个镜像通过添加镜像标签创建的
注2:当使用镜像ID删除镜像时,会先删除所有指向该镜像的标签,然后再删除该镜像文件本身
注3:如果存在通过该镜像创建的容器时,镜像文件无法删除。如果要强制删除镜像时,可以使用 -f 参数:
docker rmi -f u16.04
,但是不建议强制删除镜像。
2. 清理镜像
经过一段时间,系统中会存在临时/不再使用的镜像文件,那么我们可以通过 prune 命令清理镜像,语法如下:
docker image [options] prune
option 常用的参数如下:
导入导出镜像
1. 导出
如果要将镜像导出可使用 save 命令,语法如下:
docker save image -o file
-o 表示将镜像导出到tar文件,例如我们将 ubuntu:16.04导出到 u1604.tar 文件中:
docker save 13c9 -o u1604.tar
运行上面命令后,ubuntu:16.04就导入到了ub1604.tar文件中:
2. 导入
如果要将镜像导出可使用 load 命令,语法如下:
docker load -i file
-i 表示将要导入到docker的镜像tar文件,例如我们将 ub1604.tar导入到docker中:
docker load -i u1604.tar
运行上面命令后,ub1604.tar将被导入到docker中
上传镜像
如果是上传到官方仓库,那么需要先注册,然后才可以利用 push 命令上传镜像,语法如下:
docker push NAME[:TAG]|[REGISTRY_HOST[:REGISTRY_PORT]/]
例如我们将ubuntu:16.04上传到官方服务器上:
docker push 13c9
==========================
构建镜像
Docker 提供了两种构建镜像的方法:
1. docker commit 命令
docker commit 命令是创建新镜像最直观的方法,其过程包含三个步骤:
运行容器 - 修改容器 - 将容器保存为新的镜像
举个例子:在 ubuntu base 镜像中安装 vi 并保存为新镜像。
- 运行容器
-it 参数的作用是以交互模式进入容器,并打开终端。
# docker run -it ubuntu
- 确认 vi 没有安装,安装 vi。
# apt-get install -y vim
- 保存为新镜像
在新窗口中docker ps查看当前运行的容器。silly_goldberg 是 Docker 为我们的容器随机分配的名字。执行 docker commit 命令将容器保存为镜像,新镜像命名为 ubuntu-with-vi。
# docker commit silly_goldberg ubuntu-with-vi
docker images 从 size 上看到镜像因为安装了软件而变大了。
2. Dockerfile 构建文件
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 分为四部分:
基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。
运行 docker build 命令构建镜像示例来并详细分析每个细节。
root@ubuntu:~# pwd ① 当前目录为 /root
/root
root@ubuntu:~# ls ② Dockerfile 准备就绪
Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y vim
root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile . ③
运行 docker build 命令,-t 将新镜像命名为 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。
Sending build context to Docker daemon 32.26 kB ④ 开始构建
首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。
Step 1 : FROM ubuntu ⑤ 执行FROM ubuntu作为基础镜像
---> f753707788c5
Step 2 : RUN apt-get update && apt-get install -y vim ⑥
执行RUN,安装 vim,具体步骤为 ⑦、⑧、⑨
---> Running in 9f4d4166f7e3 ⑦
......
Setting up vim (2:7.4.1689-3ubuntu1.1) ...
---> 35ca89798937 ⑧ 这一步底层使用的是类似 docker commit 的命令。
Removing intermediate container 9f4d4166f7e3 ⑨ 删除临时容器 9f4d4166f7e3
Successfully built 35ca89798937 ⑩ 构建完成
root@ubuntu:~# docker images
ubuntu-with-vi-dockerfile 35ca89798937 # 创建好的镜像
docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。