1. 什么是Docker Registry


镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。

镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。

整体视图如下:

在这里插入图片描述

  • 镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如 hub.docker.com。一个 Registry 中可以存在多个Repository,Repository 可分为“顶层仓库”和“用户仓库”;用户仓库名称格式为“用户名/仓库名”每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像;
  • Repository:由某特定的 docker 镜像的所有迭代版本组成的镜像仓库;
  • 镜像名称(name)+标签(tag):如 nginx:latest
  • 认证能力:提供用户注册,登录、登出能力;
  • 索引:提供镜像的索引信息,方便检索;

一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的 checksum 这些信息都会记录下来,还有最终的可执行文件在哪就是在存储数据里面,就是在一个一个的 blob 里面,真正占有空间的就是这些 blob


2. 镜像仓库分类


1. 按是否对外开放划分,也是研发人员常说的:

  • 公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,供大家访问使用;
  • 私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。

2. 按供应商和面向群体划分:

  • sponsor(赞助) registry:第三方的 registry,供客户和 docker 社区版使用
  • mirror(镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才能使用
  • vendor(供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像
    Google 和 Redhat 提供了镜像仓库服务
  • private registry:通过没有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用

3. 镜像仓库工作机制


1. 镜像仓库使用流程

  • 通过 docker login 登录仓库
  • docker pull 拉取需要的镜像
  • 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库

2. 实际研发中镜像仓库如何使用

  • Docker Registry 中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry 上保存,供其他人员使用,例如“部署”到生产环境:

在这里插入图片描述

  • 名词解释:
    • 开发环境:开发人员使用的一套环境;
    • 测试环境:需求开发完成后,发布到供测试人员进行测试的环境;
    • 预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布;
    • 生产环境:真正面向客户的环境;

3. 镜像仓库的拉取机制

  • 启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地。

4. 常用的镜像仓库


1. DockerHub

  • Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。 具有以下功能:
    • (1)个人可以注册私有仓库,能够发布自己的镜像;
    • (2)提供镜像检索能力;
    • (3)提供海量官方和认证组织的镜像;
    • (4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub ;
    • (5)支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL。 )
  • Docker Hub 功能浏览:
    • 镜像搜索:
      在这里插入图片描述
    • 镜像 tag 查找:
      在这里插入图片描述
    • 对应版本拉取命令:
      在这里插入图片描述
    • 镜像的大小,id,cpu 架构查看:
      在这里插入图片描述

2. 国内镜像源

  • 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内镜像加速器服务,例如:
    • 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址)
    • 网易云加速器地址 https://hub-mirror.c.163.com
    • 百度云加速器地址 https://mirror.baidubce.com

3. 私有仓库

  • 私有镜像仓库则是指部署在公司或组织内部,用于自身应用 Docker 镜像存储、分发的镜像仓库。在构建公司内部使用的自动化发布系统的过程中,从安全的角度出发,应用的打包镜像一般情况下只会被存储在私有镜像仓库中,CI/CD 流程的衔接点也是通过向私有镜像仓库上传镜像和拉取镜像的操作来完成的。
  • 常见的私有仓库工具:
    • Harbor:Harbor 是 VMware 公司最近开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的registry 为基础,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。
    • Nexus:Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,目前常被用来作为 Maven 私服、Docker 私服。
    • Docker registry:由 docker 官方提供的私服,类似于 docker hub。用于保存公司内部上传的 Docker 镜像。

5. 镜像仓库命令


5.1 命令清单


命令 别名 功能 备注
docker login 登录仓库 必须掌握
docker pull docker image pull 拉取镜像 必须掌握
docker push docker image push 推送镜像 必须掌握
docker search 查找镜像
docker logout 登出仓库 必须掌握

5.2 docker login


1. 功能

  • 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub 。

2. 语法

docker login [OPTIONS] [SERVER] 

3. 关键参数

  • -u:登陆的用户名
  • -p:登陆的密码

4. 样例

docker login -u 用户名 -p 密码 

5.3 docker pull


1. 功能

  • 从镜像仓库中拉取或者更新指定镜像

2. 语法

docker pull [OPTIONS] NAME[:TAG|@DIGEST] 

3. 别名

docker image pull 

4. 参数

  • -a:拉取所有 tagged 镜像;
  • --disable-content-trust:忽略镜像的校验,默认开启

5. 样例

docker pull nginx:1.23.3 

5.4 docker push


1. 功能

  • 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

2. 语法

docker push [OPTIONS] NAME[:TAG] 

3. 别名

docker image push 

4. 关键参数

  • -a:推送所有 tagged 镜像;
  • --disable-content-trust:忽略镜像的校验,默认开启。

5. 样例

docker push myapache:v1 

5.5 docker search


1. 功能

  • 从 Docker Hub 查找镜像

2. 语法

docker search [OPTIONS] TERM 

3. 关键参数

  • --no-trunc:显示完整的镜像描述;
  • -f <过滤条件>:列出收藏数不小于指定值的镜像。

4. 样例

#从 Docker Hub 查找所有镜像名包含 nginx,并且 star 数大于 10 的镜像 
docker search -f stars=10 nginx 

5.6 docker logout


1. 功能

  • 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker
    Hub。

2. 语法

docker logout [SERVER] 

3. 样例

docker logout 

6. 镜像命令

学习仓库前我们需要提前了解一部分的镜像命令,为后续的实战做准备。


6.1 docker images


1. 功能

  • 列出本地镜像。

2. 语法

docker images [OPTIONS] [REPOSITORY[:TAG]] 

3. 别名

docker image ls, docker image list 

4. 关键参数

  • -a:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • --digests:显示镜像的摘要信息;
  • -f:显示满足条件的镜像;
  • --format:指定返回值的模板文件;
  • --no-trunc:显示完整的镜像信息;
  • -q:只显示镜像 ID。

5. 样例

#列出本地全部镜像 
docker images 
#列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。 
docker images ubuntu 

6.2 docker image inspect


1. 功能

查看镜像详细信息

2. 语法

docker image inspect [OPTIONS] IMAGE [IMAGE...] 

3. 样例

root@Ubuntu22:/home/ubuntu# docker image inspect nginx:1.23.4
[
    {
        "Id": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4",
        "RepoTags": [
            "nginx:1.23.4"
        ],
        "RepoDigests": [
            "nginx@sha256:f5747a42e3adcb3168049d63278d7251d91185bb5111d2563d58729a5c9179b0"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-05-23T08:51:38.011802405Z",
        "DockerVersion": "20.10.23",
        "Author": "",
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 142145851,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/data/var/lib/docker/overlay2/b18e90b4b0b688ebd2de7571dcb5e1e16879f677bae8aa258c373c4f79ea85ce/diff:/data/var/lib/docker/overlay2/b6092671e558fc1ff2a3750765a9437b1d850dd5d218e26fa48618b8e7c7ff02/diff:/data/var/lib/docker/overlay2/4aa296d9c2802feb6beb8e6d5313697e54ddb1f35ca6bd47a27614e50b2fd59f/diff:/data/var/lib/docker/overlay2/9453c35c5bf0ec6ceec0f65591abf1c0615933a99c377b75f2583497a0f640fa/diff:/data/var/lib/docker/overlay2/73802f8cca677b5b5fcf9dcdd5837bdc3a561676f56dca2c65fc322c6383ba0d/diff",
                "MergedDir": "/data/var/lib/docker/overlay2/4142f3712d3957a57fbf06e72609b2ad7b0aa031365fef007b87bd845b4bcdf2/merged",
                "UpperDir": "/data/var/lib/docker/overlay2/4142f3712d3957a57fbf06e72609b2ad7b0aa031365fef007b87bd845b4bcdf2/diff",
                "WorkDir": "/data/var/lib/docker/overlay2/4142f3712d3957a57fbf06e72609b2ad7b0aa031365fef007b87bd845b4bcdf2/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3",
                "sha256:5dd6bfd241b4f4d0bb0a784cd7cefe00829edce2fccb2fcad71244df6344abff",
                "sha256:043198f57be0cb6dd81abe9dd01531faa8dd2879239dc3b798870c0604e1bb3c",
                "sha256:2731b5cfb6163ee5f1fe6126edb946ef11660de5a949404cc76207bf8a9c0e6e",
                "sha256:6791458b394218a2c05b055f952309afa42ec238b74d5165cf1e2ebe9ffe6a33",
                "sha256:4d33db9fdf22934a1c6007dcfbf84184739d590324c998520553d7559a172cfb"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        },
        "Config": {
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.23.4",
                "NJS_VERSION=0.7.11",
                "PKG_RELEASE=1~bullseye"
            ],
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Labels": {
                "maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
            },
            "OnBuild": null,
            "StopSignal": "SIGQUIT",
            "User": "",
            "Volumes": null,
            "WorkingDir": ""
        }
    }
]

6.3 docker tag


1. 功能

  • 标记本地镜像,将其归入某一仓库。

2. 语法

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 

3. 别名

docker image tag 

4. 样例

# 将该镜像归为myregistry.com下的myubuntu仓库
docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04 

7. 容器命令


7.1 docker run


1. 功能

  • 创建一个新的容器并运行一个命令;

2. 语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 

3. 别名

docker container run 

4. 关键参数:

  • -d:后台运行容器,并返回容器 ID;
  • -i:以交互模式运行容器,通常与 -t 同时使用;
  • -P:随机端口映射,容器内部端口随机映射到主机的端口;
  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb":为容器指定一个名称;
  • -h "mars":指定容器的 hostname
  • -e username="ritchie":设置环境变量;
  • --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2":绑定容器到指定 CPU 运行;
  • -m:设置容器使用内存最大值;
  • --network="bridge":指定容器的网络连接类型(在网络部分详解);
  • --link=[]:添加链接到另一个容器;
  • --volume, -v:绑定一个卷(在容器存储券部分详解);
  • --rm:shell 退出的时候自动删除容器。

5. link样例操作

  • 先用docker pull centos:7拉一个centos的镜像下来:

在这里插入图片描述

  • 打开一个终端,启动centos:7容器,进入交互模式:

在这里插入图片描述

  • 在另一个终端中,启动另一个centos:7容器,link mycentos1,其中mywebsite1是给它起的别名。然后ping mycentos1,发现可以ping通,建立了网络连接:

在这里插入图片描述

  • 本质是在mycentos2中建立一个本地的DNS解析:

在这里插入图片描述

  • 注意,mycentos1ping不通mycentos2的。

6. rm讲解

  • 可以看到,正常退出一个容器的话,它是会保存下来的(图中都是已经退出,但仍然保存的容器):

在这里插入图片描述

  • 如果我们想让容器退出即销毁,可以在run时,带上--rm选项。

7.2 docker ps


1. 功能

  • 列出容器

2. 语法

docker ps [OPTIONS] 

3. 别名

docker container ls, docker container list, docker container ps 

4. 关键参数

  • -a:显示所有的容器,包括未运行的。
  • -f:根据条件过滤显示的内容。
  • --format:指定返回值的模板文件。如 json 或者 table
  • -l:显示最近的容器。
  • -n:列出最近创建的 n 个容器。
  • --no-trunc:不截断输出。
  • -q:静默模式,只显示容器编号。
  • -s:显示总的文件大小。

5. 样例

在这里插入图片描述


8. 镜像仓库实战


8.1 实战一、搭建nginx服务器


8.1.1 直接安装在本机


1. 卸载nginx

  • 先停掉所有nginx进程:

在这里插入图片描述

  • 检查一下nginx是不是通过apt安装的:

在这里插入图片描述

  • 如果检查出是通过apt卸载的,执行卸载命令apt --purge autoremove nginx,彻底卸载:

在这里插入图片描述

2. 安装(Ubuntu)

apt install nginx -y 

3. 查看nginx服务状态

  • 一般来说,安装完成都会自动启动,没有启动就在命令行输入nginx,手动启动:

在这里插入图片描述

4. 访问nginx首页

在这里插入图片描述

5. 修改首页内容

  • cat /etc/nginx/sites-available/default,找到有root的一行,这是网站默认的首页地址:

在这里插入图片描述

  • 首页文件是:

在这里插入图片描述

  • 将欢迎语改成hello world

在这里插入图片描述

  • systemctl restart nginx,重启之后再访问主页:
    • 欢迎语已被修改。

在这里插入图片描述


8.1.2 Docker镜像启动nginx


1. 在Dockerhub上查找需要的nginx镜像,以图中版本为例

在这里插入图片描述

2. docker pull拉取到本地,然后查看

在这里插入图片描述

3. 运行该镜像(需要用到端口转发)

  • docker run --name nginx1 --rm -it -p 8080:80 nginx:1.23.3 bash,访问宿主机8080端口的请求,转发到容器80端口:

在这里插入图片描述

  • 先进入到了nginx容器内部,还没有启动nginx,输入nginx启动:

在这里插入图片描述

  • 外部浏览器访问宿主机8080端口:

在这里插入图片描述

  • 修改主页面:

在这里插入图片描述

  • 再次访问主页面,内容已被修改:

在这里插入图片描述


8.2 实战二、Docker Hub上创建自己私有仓库


我们要把一个镜像,推送到我们自己的私有仓库中。

1. Busybox

  • 介绍:

    • BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。BusyBox 包含了一些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区 1M 左右的大小。因海外带宽较小,我们拉取该镜像推送到自己的仓库。
  • 卸载:apt --purge autoremove busybox

  • 安装:apt install busybox -y

2. 创建Docker Hub仓库

  • 首先你要创建一个Docker账号,记住用户名和密码。
  • 进入Docker Hub界面,创建镜像仓库。

在这里插入图片描述

3. 在Ubuntu上登入Docker账号

在这里插入图片描述

4. 在Docker Hub上找一个busybox镜像,拉下来

在这里插入图片描述

  • 查看一下:

在这里插入图片描述

5. 推送

在这里插入图片描述

  • 可以看到,已经推送成功了。

在这里插入图片描述


9. 实战经验


我入职了一个公司,开发一个镜像,我怎么选择用哪个作为基础镜像啊?

  • 一般大型公司有自己专门的镜像制作组织,他们会选取对应的系统版本作为基础镜像,例如华为某部门选取欧拉来制作基础镜像,腾讯选择自己的 TLinux 制作基础镜像,不会因为出现 CentOS 不维护了无法使用的情况,而且这些镜像一般都会经过严格的安全扫描,然后作为基础组件提供给各个部门。一般的公司往往也会同意镜像的基础版本,所以这个选择个人一般不用太多纠结。

更多推荐