docker 004 镜像和仓库
Docker 004 镜像和仓库
docker 镜像是用来启动容器的构建基石。
docker 镜像是什么
我们先来看一张图:
如上图所示, docker镜像采用了分层构建机制:
- 第一层:最底层是一个引导文件系统 bootfs,类似于 Linux 的引导文件系统,用户几乎不会接触到这一层。容器启动完成后会被卸载,以节省内存空间
- 第二层:第二层是rootfs,表现为根文件系统,他是可以是一种或多种操作系统,如 ubuntu、centos 等。在传统模式中,系统启动时,内核挂载 rootfs 时,会首先挂载为只读模式,完成完整性自检后再重新挂载为读写模式;docker 中,rootfs 永远以只读方式挂载,之后利用“联合加载”技术在其上挂载其他镜像,最上层为一个可读写的文件系统。
- 第三层:这个文件系统用来加载 Emacs,
- 第四层:这个文件系统用来加载 Nginx
- 第五层:可读写的容器
注意: docker 将这样的文件系统成为镜像,一个镜像可以放在另一个镜像的顶部,位于下面的镜像成为父镜像,最底层的镜像被成为基础镜像。
联合加载指一次同时加载多个文件系统,但在外面来看只能看到一个文件系统,各层文件系统叠加在一起,最终的文件系统会包含所有底层的文件和目录。
docker 会在镜像的最顶层加载一个可读写文件系统,我们在 docker 中运行的程序就是在这一层执行的。docker 第一次启动一个容器时,初始的读写层是空的,文件系统发生的变化都会应用到这一层,比如修改A文件,A 文件首先会从读写层的只读层复制到读写层,A 文件的只读版本依旧存在,但已被读写层的 A 文件副本所隐藏。这种机制被称为写时复制,
列出镜像
# 列出镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ccc6e87d482b 5 days ago 64.2MB
.....
从以上命令的结果可以看出,列出的镜像来自于一个名为 ubuntu 的镜像仓库,前面我们在执行 docker run时,同时进行了镜像下载,前面的例子里我们使用我的就是 ubuntu 镜像。
镜像保存在仓库,而镜像仓库保存在 Registry 中,默认的 Registry 有 docker 公司运营,即docker hub: https://hub.docker.com/_/registry/。镜像仓库类似于 GitLab 中的代码仓库,它包括镜像、层以及关于镜像的元数据。
每个镜像仓库都可以存放很多镜像,例如,Ubuntu 仓库就包含了20.04、19.10、19.04、18.04、16.04 等多个版本的镜像。
为了区分同一个仓库中的不同镜像,docker 提供了tag 标签功能,每个镜像列出时都带一个标签,如 18.04。通过在仓库名后加一个冒号和 tag 可以指定仓库中的某一镜像。
# 搜索镜像
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10399 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 385 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 239 [OK]
......
# 拉取指定版本的镜像,不指定版本时默认拉取最新版本
$ docker pull ubuntu
$ docker pull ubuntu:18.04 #18.04 称为 tag 标签
# 查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 ccc6e87d482b 5 days ago 64.2MB
ubuntu latest ccc6e87d482b 5 days ago 64.2MB
hello-world latest fce289e99eb9 12 months ago 1.84kB
我们还可以看到,tag 为 18.04 和 latest 和镜像 ID 都是ccc6e87d482b,这是因为一个镜像可以有多个tag。
在构建容器时指定标签是个好习惯,这样可以准确的指定容器的来源,也方便我们的管理。
Docker Hub 中有两种类型的仓库,
- 用户仓库:有 docker 用户创建,命名由用户名和仓库名两部分来组成,形如:用户名/仓库名:nuagebec/ubuntu
- 顶层仓库:由 docker公司和选定的能提供优质基础镜像的厂商的人来管理,命名中只有仓库名,如 ubuntu 仓库。用户可基于此类镜像构建自己的镜像,同时,顶层仓库也代表厂商和docker 公司的一种承诺,即顶层仓库中的镜像是架构良好,安全且最新的。
拉取镜像
使用 docker run
命令从镜像启动一个容器时,如果本地没有改镜像,则会从 docker hub 下载该镜像,如未指定 tag,则会下载 latest 标签的镜像。
还有一个可以拉取镜像的命令是 docker pull
。该命令只是下载镜像,但不执行。
# 拉取 fedora:31
$ docker pull fedora:31
31: Pulling from library/fedora
d318c91bf2a8: Pull complete
Digest: sha256:d4f7df6b691d61af6cee7328f82f1d8afdef63bc38f58516858ae3045083924a
Status: Downloaded newer image for fedora:31
docker.io/library/fedora:31
# 拉取 fedora:30
$ docker pull fedora:30
# 查看所有fedora镜像
$ docker images fedora
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora 31 f0858ad3febd 2 months ago 194MB
fedora 30 89d6d6a7d521 2 months ago 248M
# 查看指定版本的fedora 镜像
$ docker images fedora:31
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora 31 f0858ad3febd 2 months ago 194MB
查找镜像
通过docker search
命令可以查找docker hub 上所有的公共可用镜像。
# 查找 nginx 镜像
docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12528 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1724 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 753 [OK]
............
以上命令在 docker hub 上查找了所有带 nginx 的镜像,命令返回的信息如下:
- NAME:仓库名称
- DESCRIPTION:描述信息
- STARS:评级,数字越大越受欢迎
- OFFICIAL:是否官方提供
- AUTOMATED: 是否为自动构建