1 镜像再探
docker镜像是由FileSystem叠加而成的。
和传统的linux一样,最底层是bootfs;之上是rootfs。
和linux不同的是,docker里的rootfs永远都是只读状态的。之所以你看起来像是修改了它(给它扩展新功能),是因为docker的联合加载技术(一次同时加载多个文件系统,并将各层文件系统的功能组合)。
有了联合加载技术,最终的文件系统就有了所有已经加载了的文件系统的功能。是不是感觉有点像面向对象的继承呢?
在实际使用中,一个docker镜像往往都是由另一个docker镜像扩展而来的。被扩展的那个镜像就称之为父镜像。最原始的那个父镜像被称为base image(基础镜像)。
看看这个经典的图吧:
最上面那一层是可读写的。在容器第一次启动的时候,该层是空的。
当我们修改某个文件时,被修改的文件会从读写层下面的只读层复制到读写层。这样一来文件的只读版本还保留着,我们修改的只是一个副本,并将这个副本保留在了最上面的读写层,同时只读版本被读写层的文件隐藏了。
而这个正是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
|