1 镜像再探

docker镜像是由FileSystem叠加而成的。
和传统的linux一样,最底层是bootfs;之上是rootfs。

和linux不同的是,docker里的rootfs永远都是只读状态的。之所以你看起来像是修改了它(给它扩展新功能),是因为docker的联合加载技术(一次同时加载多个文件系统,并将各层文件系统的功能组合)。
有了联合加载技术,最终的文件系统就有了所有已经加载了的文件系统的功能。是不是感觉有点像面向对象的继承呢?

在实际使用中,一个docker镜像往往都是由另一个docker镜像扩展而来的。被扩展的那个镜像就称之为父镜像。最原始的那个父镜像被称为base image(基础镜像)。

看看这个经典的图吧:

image-layer

最上面那一层是可读写的。在容器第一次启动的时候,该层是空的。
当我们修改某个文件时,被修改的文件会从读写层下面的只读层复制到读写层。这样一来文件的只读版本还保留着,我们修改的只是一个副本,并将这个副本保留在了最上面的读写层,同时只读版本被读写层的文件隐藏了。

而这个正是docker的另一牛逼哄哄的特性写时复制
通过这种机制,每个只读层都是永远不会发生变化的了。当每次新建或扩展一个容器时,都会在容器栈的最顶层增加一个可写层。在可写层发生的变更隐藏掉底层的部分之后,各层在组合功能,从而扩展容器。

总感觉这东西真是和面向对象设计原则中的开闭原则不谋而合啊!!!
对修改关闭(除了第一层的可写层都是只读的),对扩展开放(在最顶层修改,扩展容器)。

2 基础命令

2.1 查看镜像

1
2
3
4
5
6
7
8
9
docker images
-a, --all=true|false
显示所有镜像。默认情况下,那些中间层的镜像不会被显示.The default is false.
--digests=true|false
Show image digests. The default is false.
--no-trunc=true|false
不会截断输出. The default is false.
-f, --filter=[]
带条件地列出镜像

镜像保存于仓库中,这里说的仓库有点类似于git的仓库。
一个仓库可以存储多个镜像,通过 TAG 来区分。
仓库存在于Registry中,默认情况下,Registry是DockerHub。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@h1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
csphere/centos 7.1 e3a35d3b1588 46 hours ago 591.4 MB
hub.c.163.com/library/nginx latest b1d6e5f8fe92 5 days ago 181.4 MB
daocloud.io/centos 6 eb24acd8692d 5 weeks ago 194.6 MB
centos latest 9baab0af79c4 5 weeks ago 196.7 MB
centos 6.8 80e46367f846 6 weeks ago 194.5 MB
centos centos7.1.1503 47a77536ad4c 6 weeks ago 212.1 MB
hello-world latest f0cb9bdcaa69 3 months ago 1.848 kB
<none> <none> 151b45d87d28 23 months ago 859.5 MB
[root@h1 ~]#
[root@h1 ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest 9baab0af79c4 5 weeks ago 196.7 MB
centos 6.8 80e46367f846 6 weeks ago 194.5 MB
centos centos7.1.1503 47a77536ad4c 6 weeks ago 212.1 MB

2.2 拉取镜像

docker pull 命令其实就是下载镜像用的。默认情况下是从DockerHub下载。

当我们使用run命令来从一个镜像启动容器时,如果镜像不在本地,docker就会从DockerHub去pull该镜像对应的最新版本,即TAG为latest的版本。

1
2
3
docker pull
-a, --all-tags=true|false
Download all tagged images in the repository. The default is false.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@h1 ~]# docker pull fedora
latest: Pulling from fedora
daf0c008c194: Pull complete
daf0c008c194: Pulling fs layer
Digest: sha256:3346e6e34f51fc00844fe87fd2cf3afe43d7e2f360fabedb56a7c81791958df1
Status: Downloaded newer image for fedora:latest
[root@h1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
csphere/centos 7.1 e3a35d3b1588 46 hours ago 591.4 MB
hub.c.163.com/library/nginx latest b1d6e5f8fe92 5 days ago 181.4 MB
daocloud.io/centos 6 eb24acd8692d 5 weeks ago 194.6 MB
centos latest 9baab0af79c4 5 weeks ago 196.7 MB
centos 6.8 80e46367f846 6 weeks ago 194.5 MB
centos centos7.1.1503 47a77536ad4c 6 weeks ago 212.1 MB
fedora latest daf0c008c194 8 weeks ago 204.4 MB
hello-world latest f0cb9bdcaa69 3 months ago 1.848 kB
<none> <none> 151b45d87d28 23 months ago 859.5 MB
[root@h1 ~]#
# 指定TAG
[root@h1 ~]# docker pull fedora:20
20: Pulling from fedora
a45be3b30145: Downloading [======>……
…………………………
…………………………

2.3 搜索镜像

这里指的搜索不是本地搜索,而是在远程的DockerHub上搜索。比如:

1
2
3
4
5
6
7
8
[root@h1 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 4345 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 827 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 286 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 76 [OK]
# ...............
[root@h1 ~]#

以上搜索结果的标题含义:

  • NAME:镜像所在仓库名,可以用它来pull镜像
  • DESCRIPTION:镜像描述
  • STARS:用户评价
  • OFFICIAL:是否是官方的
  • AUTOMATED:是否是使用自动构建流程创建的

2.4 删除镜像

1
2
3
4
5
6
7
docker rmi:删除指定镜像
# 删除fedora最新版的镜像
[root@h1 ~]# docker rmi -f fedora:latest
Untagged: fedora:latest
Deleted: daf0c008c194f2bae4f4bf36327d9166bc1dfa9fbbadb2ad585c1f11037fd787