现在的位置: 首页 > 云计算 > Docker > 正文
docker容器技术系列三:docker镜像
2015年10月30日 Docker ⁄ 共 2602字 暂无评论 ⁄ 被围观 2,754 views+

前面基本概念部分我们已经介绍了docker镜像就是一个只读模板,可以从镜像启动一个容器实例。我们也发现,在启动容器的过程中,如果镜像不存在,docker会自动从默认镜像仓库(默认为官方Docker Hub)下载相应的镜像,然后再启动容器。

现在我们来探讨更多镜像的操作

1、列出本地已有的镜像

[root@localhost ~]# docker images
REPOSITORY            TAG                         IMAGE ID                        CREATED                        VIRTUAL SIZE
centos                        latest                      ce20c473cd8a               2 weeks ago                   172.3 MB

2、从默认镜像仓库搜索镜像

[root@localhost ~]# docker  search redis

image

*说明:没有/分隔前缀的,表示官方镜像,我们尽量选择官方镜像或者下载量较高的镜像使用。

3、下载镜像到本地

[root@localhost ~]# docker  pull redis

下载过程如下图:

image

下载过程要耐心等待,因为从国外的服务器下载,速度是很慢的,好在我们仅需下载几个基本镜像即可,后期均可通过这些基本镜像仅需修改,修改我们所需的即可。

下载完成后,查看如下:

[root@localhost ~]# docker images
REPOSITORY           TAG                         IMAGE ID                  CREATED                   VIRTUAL SIZE
redis                        latest                       c08dd1f8fad9           12 days ago               109.2 MB
centos                     latest                       ce20c473cd8a           2 weeks ago              172.3 MB

*注:也可以会看到新增了3个镜像,实际上这三个镜像都是对应的一个(注意看image ID),这是镜像的tag,类似软连接。下一条将讲解。

4、给镜像添加tag

tag的作用主要有两点:一是为镜像起一个容易理解的名字,二是可以通过docker tag来重新指定镜像的仓库,这样在push时自动提交到仓库。

image

如上图,通过docker images命令,我们可以看到一个镜像有如下几个关键信息:

REPOSITORY :包含仓库信息,如docker.io/redis ,表示docker.io仓库的redis名称镜像。

TAG:同一个名称的镜像可能有多个版本,默认为latest版本(最新版),TAG就标明了版本

IMAGE ID :镜像唯一ID

因此可以通过两个方法确定某个唯一的镜像:

1、REPOSITORY:TAG :如docker.io/centos:6.6

2、IMAGE ID : 如12c9d795d85a

*注意:如果直接使用“REPOSITORY”,则默认“TAG”为“latest”,如镜像redis就标识“redis:latest”

镜像的名称“REPOSITORY:TAG ”可以用下面的命令重命名:

将同一IMAGE_ID的所有tag,合并为一个新的
# docker tag 195eb90b5349 seanlook/ubuntu:rm_test

新建一个tag,保留旧的那条记录
# docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag

5、将容器的修改提交到镜像

在上一步中,如果已经为镜像tag指定了仓库信息,这可以使用下面命令提交镜像到仓库中:

如下是提交已经镜像到一个私有仓库,私有仓库的搭建参考后文

# docker push  192.168.1.200:5000/centos:6.6

6、存出或载入镜像

保存镜像为tar文件:

如果要导出镜像到本地文件,可以使用docker save命令。

# docker save -o redis.tar redis

载入镜像:

可以使用docker load从导出的本地文件中再导入到本地镜像库,例如

# docker load --input redis.tar

# docker load < redis.tar

这将导入镜像以及其相关的元数据信息(包括标签等)。

*注:通过存出和载入镜像,可以在没有搭建私有仓库的情况下,快速在不同主机之间拷贝镜像。

7、删除镜像

如果要移除本地的镜像,可以使用docker rmi命令。

# docker rmi redis
Untagged: redis:latest
Deleted: c08dd1f8fad9ff2622a1b5d74650a8e494ee380b74030e21584fea05079c2818
Deleted: 1749db59d6f291dc5b9b76610f33a15421170b711a07e0e4a835edb43c2d52f1
Deleted: e1c16660ac6110b9defa97ec9883e85f680459a951bd3c9aa9a02a4aa81034e7
Deleted: 134e55bc9c437b5a822885b879d34dc7f0bb189406ff6bfe33889e56e75fd7ba
Deleted: 3968e93424409ba4c7ebfb73dc8ca8b20ac1c1f622ea0ce1753efe6e57f5bb5e
Deleted: 57f1a903e59a508e0690c226b8e3016a125d98c2e42f9fc03efe871b85e35052

*注意:

1)在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。

2)docker rm命令是移除容器。

8、镜像的原理

Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。

通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS 上构建的容器也是利用了类似的原理。

给我留言

留言无头像?


×