首页 > 系统 > Linux >

Docker基础教程——镜像

2016-09-14

Docker基础教程——镜像。Docker运行容器前需要本地存在对应的镜像,如果本地不存在,会尝试从默认(Docker Hub)的镜像仓库获取,也可以配置使用自定义的镜像仓库。

上一篇文章也说了,镜像是Docker三大核心概念之一。

Docker运行容器前需要本地存在对应的镜像,如果本地不存在,会尝试从默认(Docker Hub)的镜像仓库获取,也可以配置使用自定义的镜像仓库。

1、获取镜像

镜像是Docker的基础,运行容器的前提。

可以使用命令从网络上下载镜像,命令如下(如果不是Root用户需要在命令前加上sudo命令):

docker pull NAME[:TAG]
如果不显示的指定TAG,会默认选择latest标签的镜像下载。

比如要下载一个最新的ubuntu镜像:

docker pull ubuntu
这里实际上下载的是latest标签的镜像,上面的命令等同于:

docker pull ubuntu:latest
下载过程会看到镜像文件实际是又多个层组成的,每行最前面的内容就是这层的ID。

层(Layer)是AUFS(一种联合文件系统)中的重要概念,是实现增量保存于更新的基础。

如果需要下载指定版本的镜像,可以如下:

docker pull ubuntu:14.04
如果想从指定的注册服务器的仓库下载镜像,可以像下面这样:

docker pull registry.hub.docker.com/ubuntu:latest
下载完成后就可以启动了:

docker -t -i ubuntu /bin/bash
这里的命令后面会解释。

2、 查看镜像信息

docker image命令可以列出本地已有的所有镜像:

docker inages
显示的字段分别表示:

1、来自于哪个仓库

2、镜像的标签信息

3、镜像的唯一ID

4、创建时间

5、镜像大小

其中镜像的ID比较重要,经常会用到。

标签TAG用于标示同一仓库不同版本的镜像。

为了使用方便,还可以通过docker tag命令为本地镜像添加新的标签:

docker tag ubuntu:latest ubuntu:newtag
这时查看镜像列表会多出来一个镜像,但是其ID还是一样的。

使用docker inspect命令可以获取镜像的详细信息:

docker inspecct 镜像ID
这里返回的是一个json格式的字符串,如果只想获取其中指定的内容,可以通过-f指定参数:

docker inspect -f {{".Architecture"}} 550
此时返回的就是Architecture信息。

任何时候,在指定ID时都可以只指定前几个字符来代替完整的ID字符串,前提是能唯一标示。

3、 查找镜像

docker search命令可以搜索远程仓库中的公共镜像,默认为Docker Hub仓库。

用法为:

docker search TERM
支持的参数如下:

1、--automated=false:仅显示自动创建的镜像

2、--no-trunc=false:输出信息不截断显示

3、-s, --stars=0:指定仅显示评论为指定星级以上的镜像

比如要搜索带lamp关键字的镜像:

docker search lamp
之后返回的信息包括:镜像名字、描述、星级、是否官方创建和是否自动创建等。

默认的输出结果将按星级排序,官方镜像说明是官方项目组创建和维护的,automated资源允许用户验证镜像的来源和内容。

4、删除镜像

可以使用镜像的标签和ID删除镜像。
命令格式为:

docker rmi IMAGE[IMAGE...]
IMAGE可以为标签或者ID。

当同一个镜像有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中指定的标签,并不影响镜像文件。

如果镜像只剩下一个标签的时候,使用docker rmi命令会彻底删除该镜像。

如果docker rmi后面跟上ID删除时,会尝试删除该镜像的所有标签后删除镜像文件本身。

如果要删除逇镜像创建的容器存在时,镜像文件默认试试无法被删除的。如果直接执行删除命令,会提示有容器正在运行(即使容器已经Exit)。但是可以加上参数-f强行删除:

docker rmi -f ID或标签
不过并不推荐这么做,因为这可能会导致一些遗留问题,如果一定要删除,推荐先删除该镜像的所有容器,然后再删除镜像,如果有容器不能删除,那么这个镜像也不应该直接被删除。

删除镜像时会输出类似于获取镜像时一样的各层信息。

5、创建镜像

创建镜像有三种方式:

1、基于已有镜像创建

2、基于本地模板导入

3、基于Dockerfile文件创建

其中在大规模应用场景,一般使用第三种方式,所以在此处不会详谈(后续文章会详细介绍),这里主要介绍前两种。

5.1、 基于已有镜像创建

该方法主要使用docker commit命令,格式为:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
其中的选项:

-a、--author="":作者信息-m\--message="":提交消息-p、--pause=true:提交时暂停容器运行。

下面是一个例子:

docker commit -m "message" -a "anxpp" 容器ID 新的容器TAG 新的容器ID
之后就可以通过docker images命令查看到创建的容器了。

5.2、基于本地模板导入

可以直接从一个操作系统模板文件导入一个镜像。比如OpenVZ提供的模板(http://openvz.org/Download/templates/precreated)

比如要导入下载好的ubuntu模板为镜像:

cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
然后使用docker images就可以看到镜像了。

6、镜像的导入导出(文件)

可能有时候我们想直接导出镜像为文件供其他地方使用,docker提供了这样的功能。

6.1、导出镜像为文件

使用docker save命令将镜像保存为文件,如:

docker save -o ubuntu.tar ubuntu:14.04
6.2、从文件导入镜像

使用docker load命令将文件导入为镜像,如:

docker load < ubuntu.tar
此时会导入镜像以及相关的元数据信息,如标签等。

7、上传镜像

上传镜像到仓库使用docker push命令,默认会上传到DockerHub官方仓库(需登录),命令格式为docker push NAME[:TAG]。

小结

镜像是使用Docker的前提,使用过程中可以一边收集一些比较有用的镜像,目前网上流行的镜像仓库已经存在了大量稳定好用的镜像,我们可以拿来即用的。
相关文章
最新文章
热点推荐