zoukankan      html  css  js  c++  java
  • 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: 是否为自动构建
  • 相关阅读:
    js正则
    常用正则表达式
    JS
    Vue
    JS
    Cookie、Session和自定义分页
    ORM分组操作示例(与SQL语句的比较)以及基于对象和queryset的正反查询
    跨站请求伪造和csrf_token使用
    ORM之单表、多表操作
    Django中ORM介绍和字段及字段参数
  • 原文地址:https://www.cnblogs.com/resn/p/12425636.html
Copyright © 2011-2022 走看看