docker 004 镜像和仓库

Docker 004 镜像和仓库

docker 镜像是用来启动容器的构建基石。

docker 镜像是什么

我们先来看一张图:

docker 004 镜像和仓库

如上图所示, 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: 是否为自动构建

相关推荐