docker镜像操作详解
docker有三大核心概念:镜像,容器,仓库
镜像(image)在三大核心概念中最为重要,是docker容器运行的前提。每个容器在运行前都需要有一个与之对应的镜像。如果镜像没保存在本地,docker会尝试先从镜像仓库中下载。
镜像与容器的关系,类似于面向对象编程中的类与对象,一个类可以实例化多个对象,一个镜像也可以实例化多个容器。
获取镜像
镜像是运行容器的前提,官方的docker store提供了大量的镜像并开放下载
下载镜像
docker pull NAME[:TAG]
NAME是镜像仓库的名称,TAG是镜像的标签(用于表示版本信息)
示例:
获取一个ubuntu14.04的基础镜像
$ docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
a7344f52cb74: Pull complete
515c9bb51536: Pull complete
e1eabe0537eb: Pull complete
4701f1215c13: Pull complete
Digest: sha256:2f7c79927b346e436cc14c92bd4e5bd778c3bd7037f35bc639ac1589a7acfa90
Status: Downloaded newer image for ubuntu:14.04
查看镜像
- 查看本地存在的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一会,物理上占用的存储空间会小于各镜像的逻辑体积之和
如果不指定标签,默认会下载latest(最新版)的镜像。如docker pull ubuntu
将下载ubuntu:latest
镜像
从刚才下载的过程中,可看到ubuntu镜像不是作为一个独立的文件,而是由多个层(layer)组成的。
每个层都有一个惟一的id, 使用docker pull
下载时会获取并输出镜像的各层信息
分层的好处在于:当不同的镜像包括相同的层时,本地仅存储层的一份内容,可节省存储空间
下载镜像后,即可随时使用该镜像,如利用ubuntu:14.04
创建一个容器,并在该容器中执行ping localhost
命令
$ docker run -it ubuntu:14.04 bash
root@a8fed58340f6:/# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.032 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.034 ms
- 查看镜像详细信息
docker inspect
命令可获取镜像的详细信息,返回的是JSON格式数据,包括制作者、适应架构、各层的数据摘要等:
$ docker inspect ubuntu:14.04
如果只需要看其中一项的内容,可以用参数进行过滤:
$ docker inspect -f {{".Id"}} ubuntu:14.04
sha256:2c5e00d77a67934d5e39493477f262b878f127b9c01b491f06d8f06f78819578
- 查看镜像各个层的信息
镜像文件是由多个层组成,可以使用history
查看各个层的信息
$ docker history ubuntu:14.04
IMAGE CREATED CREATED BY SIZE COMMENT
2c5e00d77a67 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 7 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 7 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 7 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 195kB
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:1e01ab604c0cc3084… 188MB
使用tag命令添加镜像标签
使用docker tag
命令可以给本地镜像任意添加新的标签,如添加一个新的myubuntu:test
镜像标签
$ docker tag ubuntu:14.04 myubuntu:test
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
myubuntu test 2c5e00d77a67 7 weeks ago 188MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
添加新标签相当于多了一个镜像,但新增的镜像id与原镜像是一致的,实际上指向同一个镜像文件,只是别名不同。因此,docker tag
命令添加的标签实际上起到了类似链接的作用
搜索镜像
docker search
搜索镜像仓库中的相关镜像
$ docker search ubuntu
默认的输出结果按照星级评价倒序排列
删除镜像
- 使用标签删除镜像
$ docker rmi myubuntu:test
Untagged: myubuntu:test
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
当同一个镜像拥有多个标签时,以上命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件
但当镜像只剩下一个标签的时候就要小心了,此时就会彻底删除镜像
- 使用镜像ID删除镜像
$ docker rmi dc4491992653
指定镜像id,会先尝试删除所有指向该镜像的标签,然后再删除镜像文件本身
如果有基于该镜像的容器正在运行,docker会提示有容器正在运行,无法删除。此时应先将容器关闭,再删除镜像
创建镜像
创建镜像有三种方法:
-
基于已有镜像的容器创建
-
基于本地模板导入
-
基于Dockfile创建
基于已有镜像的容器创建
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项说明:
-
-a, --author="": 作者信息
-
-c, --change=[]: 提交时执行Dockerfile指令
-
-m, --message="": 提交消息
-
-p, --pause=true: 提交时暂停容器运行
接下来演示:创建一个容器,新增一个test文件,再将这个容器提交生成为一个新的镜像
➜ ~ docker run -it ubuntu:14.04 /bin/bash
root@5c257e5daa77:/# touch test
root@5c257e5daa77:/# exit
exit
5c257e5daa77 是容器id,下面需要用到
将容器 5c257e5daa77
封装成一个镜像
$ docker commit -m "新建一个test文件" -a "作者是我" 5c257e5daa77 test:0.1
sha256:c372ff7e49af57068826efba6be726207bee59d41e7552954346d503d3c0d7fe
查看新创建的镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 c372ff7e49af 6 seconds ago 188MB
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
基于本地模板导入
要直接导入一个镜像,可以从OpenVZ下载,然后用docker import
导入
假设下载了ubuntu-14.04-x86-minimal.tar.gz
压缩包,那么可用以下命令导入:
$ cat ubuntu-14.04-x86-minimal.tar.gz | docker import - ubuntu:14.04
导出和载入镜像
使用docker save
和docker load
命令导出和载入镜像
- 导出镜像
将ubuntu:14.04
镜像导出为ubuntu_14.04.tar
文件
$ docker save -o ubuntu_14.04.tar ubuntu:14.04
$ ls
ubuntu_14.04.tar
导出镜像是一个很有用的功能,可以作为本地备份,也可以分发给其他人使用
- 载入镜像
将导出的镜像再次导入:
$ docker load --input ubuntu_14.04.tar
Loaded image: ubuntu:14.04