Skip to content
60.Docker»60.CNB下的Docker应用»LV020-docker仓库.md

LV020-docker仓库

仓库(Repository)是集中存放镜像的地方。前面直接用的cnb的云原生开发环境来学习docker,它直接在仓库提供了一个制品库,我们可以吧镜像上传到制品库,这一节我们了解一下另一个docker仓库:Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。

一、Docker Hub

1. Docker Hub是什么?

Docker Hub是由 Docker Inc 提供的存储库注册服务。官网是:Docker Hub Container Image Library | App Containerization,直接点击就可以打开。

Tips:这个和Github一样,有时候需要点方法才能正常访问。

它允许我们从Docker Hub获取和推送docker镜像。我们可以将其视为GitHub,在GitHub中,我们获取和推送我们的源代码,但在Docker Hub的情况下,我们下载或发布我们的容器镜像。它是一个基于云的在线存储库,存储两种类型的存储库,即公共存储库和私有存储库。公共存储库对所有人都可访问,但私有存储库对存储库的有关所有者可访问,并且如果我们存储的存储库超过一定数量的私有存储库,则会产生费用。

img

2. 有什么功能?

2.1 镜像存储库

我们可以在这里找到一些公共的容器镜像。例如,我们最开始接触到的hello-world

image-20251013231115952

  • 这是 Docker Hub 中存储镜像的基本单元。每个仓库可以包含同一个镜像的不同版本,通过 标签 (Tag) 来区分。

  • 仓库通常以 [用户或组织名]/[仓库名] 的形式命名,例如 ubuntu (官方镜像,省略了组织名),library/ubuntu (完整的官方库路径), myuser/mywebapp

  • 公共仓库 (Public Repositories): 任何人都可以搜索、查看和拉取这些仓库中的镜像。

  • 私有仓库 (Private Repositories): 只有仓库的创建者、所属组织的成员或被授权的用户才能拉取这些镜像。私有仓库对于存储企业内部应用、包含敏感数据的镜像或处于开发阶段的镜像至关重要。免费用户通常有一个或少数几个私有仓库的限制,付费计划则提供更多。

Tips:在镜像存储库中我们还会看到标签:

  • 标签用于标识同一仓库中不同版本的镜像。例如,ubuntu:latest, ubuntu:20.04, ubuntu:22.04 分别代表 Ubuntu 镜像的不同版本。
  • latest 是一个特殊的默认标签,通常指向最新构建或最新稳定版本的镜像。然而,在生产环境中,强烈推荐使用具体的版本标签,而不是依赖 latest,以确保部署的可重复性和稳定性。
  • 创建镜像时,你可以使用 docker tag 命令为镜像打上多个标签,并在推送时指定标签。

2.2 团队和组织

我们还可以创建工作组并将存储库作为私有存储库推送,仅在我们的组织内可用。这样,我们可以对我们的容器镜像的私有存储库进行管理访问。

  • 对于企业或团队用户,Docker Hub 提供了组织功能。一个组织可以拥有多个仓库。
  • 在组织内部,可以创建团队,并为不同的团队分配对组织内仓库的不同访问权限(如只读、读写、管理员)。
  • 这方便了团队成员之间的协作,集中管理镜像资源,并提供了权限控制,尤其对于私有仓库的管理非常重要。

2.3 GitHub和Bitbucket集成

还可以和源代码存储库(如GitHub和BitBucket)进行集成。

2.4 自动构建

如果源代码存储库中有任何更改已被推送到源代码存储库,它会自动检测并从GitHub或BitBucket构建容器镜像,并将其推送到Docker Hub。

  • 用户指定代码仓库中的一个 Dockerfile(或其他构建源,如 buildpack)。
  • 当指定分支或标签发生代码提交时,Docker Hub 会自动从 Git 仓库拉取最新的代码,并在其构建环境中执行 Dockerfile 指令来构建镜像。
  • 构建成功后,Docker Hub 会自动将新生成的镜像推送到对应的 Docker Hub 仓库中,并根据配置打上相应的标签。

自动构建可以确保构建过程的一致性、自动化更新镜像、提高透明度(Dockerfile 是公开的)、简化 CI/CD 流程。也支持配置不同的构建规则,例如监听特定分支(如 main/master 分支自动构建并打 latest 标签),或监听特定的 Git 标签(如 v1.0 标签触发构建并打 v1.0 标签)。

2.5 Webhooks

一旦我们成功推送了镜像,借助Webhook的帮助,它会触发与其他服务集成的动作。Webhooks 允许我们在 Docker Hub 仓库发生特定事件(例如,自动化构建完成或新镜像被推送到仓库)时,触发外部服务的动作。

例如,我们可以设置一个 Webhook,当新的应用镜像推送到 Docker Hub 后,自动触发一个部署服务(如 Kubernetes, Swarm, Jenkins 等)来拉取最新镜像并更新运行中的应用。这进一步增强了 Docker Hub 在 CI/CD 流程中的自动化能力。

2.6 官方和发布商镜像

由dockers提供的高质量镜像被认为是官方镜像,可以被获取和使用。同样,由外部供应商提供的高质量镜像被称为发布商镜像,也称为认证镜像,它提供了与Docker企业的支持和兼容性保证。

二、注册与登录

1. 注册账号

访问 Docker Hub 网站 (Signup | Docker) 并注册一个免费账户。这里就不详细说了,就是填写邮箱和密码以及用户名,然后会收到一个验证邮件,点击验证即可。

2. 登录账号

2.1 docker login

我们想要上传镜像到Docker Hub的话,还需要本地登录,我们这里还是使用cnb的开发环境,执行以下命令:

shell
docker login [OPTIONS] [SERVER]

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

参数说明

  • SERVER: Docker 注册表的服务器地址(默认是 Docker Hub)。

OPTIONS

  • -u, --username: 登录用户名。
  • -p, --password: 登录密码(不推荐在命令行使用,因为这样密码会以明文形式暴露在命令历史记录中)。
  • --password-stdin: 从标准输入读取密码。

2.2 使用示例

  • (1)登录到Docker Hub
shell
docker login

【例】

shell
  /workspace git:(main) docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/

Username: sumumm
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

然后输入自己的账户名和密码,就可以正常登陆了,登录成功后,我们的凭据通常会被存储在本地配置文件中(例如 ~/.docker/config.json),以便后续操作。

  • (2)登录到 Docker Hub(指定用户名)
shell
docker login --username myusername
  • (3)登录到自定义注册表
shell
docker login myregistry.com

3. 退出账号

shell
docker logout [SERVER]

三、基本应用

1. 创建存储库

我们来创建我们的第一个存储库,我们先打开 Repositories页面:

image-20251013233403377

然后就会看到创建仓库的选项:

image-20251013233235466

接着我们输入仓库名称,选择可见性,Docker Hub为我们提供了一个免费的私有存储库。虽然,如果我们需要更多的私有存储库,我们可以升级我们的帐户到付费计划。

image-20251013233542841

最后点击创建:

image-20251013233645348

就会得到一个空的镜像仓库了。

2. 浏览镜像

有两种方法可以从Docker Hub搜索公共仓库和镜像,即我们可以从Docker Hub网站搜索,或者我们可以使用命令行工具运行以下命令。假设我们要搜索 ubuntu 仓库镜像。

shell
docker search <Image Name>

【例】

shell
  /workspace git:(main) docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   17705     [OK]
ubuntu/squid                     Squid is a caching proxy for the Web. Long-t…   119
ubuntu/nginx                     Nginx, a high-performance reverse proxy & we…   133
# ...

3. 构建镜像

前面我们已经学习过了,这里我们直接编写Dockerfile进行构建。

3.1 Dockerfile

dockerfile
# 基础镜像使用最新版本ubuntu
FROM ubuntu:latest

# 更新软件包
RUN apt-get update
# 安装基本工具
RUN apt-get install -y curl wget unzip git

# 安装code-server
RUN curl -fsSL https://code-server.dev/install.sh | sh
RUN code-server --install-extension zhuangtongfa.material-theme &&\
    code-server --install-extension PKief.material-icon-theme

3.2 构建镜像

上面已经编写好了Dockerfile,我们用下面的命令构建:

shell
docker build -t <your-username>/<your-repo-name>:<tag> .

例如,我的的Docker Hub用户名是 sumumm,仓库名是 docker-demo,标签是 1.0.0,命令如下:

shell
docker build -t sumumm/docker-demo:1.0.0 .

然后就会得到这样一个镜像:

shell
  /workspace git:(main)  docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
sumumm/docker-demo   1.0.0     d96276054c08   2 minutes ago   802MB
ubuntu               latest    97bed23a3497   12 days ago     78.1MB

我们使用的基础镜像是78.1M,但是由于我安装了一些东西,这里就变成802M了。

3.3 标记镜像

如果我们已经有了一个本地镜像,并且需要将其标记为我们的Docker Hub镜像,可以使用以下命令:

shell
docker tag <local-image>:<tag> <your-username>/<your-repo-name>:<tag>

【例】

shell
docker tag mylocalimage:latest sumumm/docker-demo:1.0.0

4. 推送到Docker Hub

我们使用下面的命令推送:

shell
docker push <username>/<repo-name>:<tag>

【例】

shell
  /workspace git:(main)  docker push sumumm/docker-demo:1.0.0
The push refers to repository [docker.io/sumumm/docker-demo]
0a669ec0329c: Pushed
7f108d4e22bb: Pushed
a4d9f12a35fd: Pushed
9ca36b9f258a: Pushed
073ec47a8c22: Mounted from library/ubuntu
1.0.0: digest: sha256:cf6bf76e7b3f579db991b444b20d6800e63b153c6b4148754c6ec9cf404ea73c size: 1377

然后我们来到仓库 sumumm/docker-demo general | Docker Hub,就会发现这里已经出现了我们刚才push的镜像:

image-20251013235206111

5. 从Docker Hub拉取

我们先删除刚才的镜像:

shell
docker images
docker rmi <IMAGE ID1> <IMAGE ID2> ...

然后执行docker pull命令:

shell
docker pull sumumm/docker-demo:1.0.0

或者直接执行下面的命令直接启动容器来验证(会自动拉取)

shell
docker run -it -p 8000:8000 --entrypoint "code-server" -d sumumm/docker-demo:1.0.0 --bind-addr=0.0.0.0:8000 --auth=none

能正常拉取和启动就没问题了:

image-20251013235840741

参考资料:

关于Docker Hub的一切你应该知道的 - 姚伟斌

莫道桑榆晚 为霞尚满天.