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的情况下,我们下载或发布我们的容器镜像。它是一个基于云的在线存储库,存储两种类型的存储库,即公共存储库和私有存储库。公共存储库对所有人都可访问,但私有存储库对存储库的有关所有者可访问,并且如果我们存储的存储库超过一定数量的私有存储库,则会产生费用。

2. 有什么功能?
2.1 镜像存储库
我们可以在这里找到一些公共的容器镜像。例如,我们最开始接触到的hello-world:

这是 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的开发环境,执行以下命令:
docker login [OPTIONS] [SERVER]登陆到一个Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。
参数说明:
SERVER: Docker 注册表的服务器地址(默认是 Docker Hub)。
OPTIONS:
-u, --username: 登录用户名。-p, --password: 登录密码(不推荐在命令行使用,因为这样密码会以明文形式暴露在命令历史记录中)。--password-stdin: 从标准输入读取密码。
2.2 使用示例
- (1)登录到Docker Hub
docker login【例】
➜ /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(指定用户名)
docker login --username myusername- (3)登录到自定义注册表
docker login myregistry.com3. 退出账号
docker logout [SERVER]三、基本应用
1. 创建存储库
我们来创建我们的第一个存储库,我们先打开 Repositories页面:

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

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

最后点击创建:

就会得到一个空的镜像仓库了。
2. 浏览镜像
有两种方法可以从Docker Hub搜索公共仓库和镜像,即我们可以从Docker Hub网站搜索,或者我们可以使用命令行工具运行以下命令。假设我们要搜索 ubuntu 仓库镜像。
docker search <Image Name>【例】
➜ /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
# 基础镜像使用最新版本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-theme3.2 构建镜像
上面已经编写好了Dockerfile,我们用下面的命令构建:
docker build -t <your-username>/<your-repo-name>:<tag> .例如,我的的Docker Hub用户名是 sumumm,仓库名是 docker-demo,标签是 1.0.0,命令如下:
docker build -t sumumm/docker-demo:1.0.0 .然后就会得到这样一个镜像:
➜ /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镜像,可以使用以下命令:
docker tag <local-image>:<tag> <your-username>/<your-repo-name>:<tag>【例】
docker tag mylocalimage:latest sumumm/docker-demo:1.0.04. 推送到Docker Hub
我们使用下面的命令推送:
docker push <username>/<repo-name>:<tag>【例】
➜ /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的镜像:

5. 从Docker Hub拉取
我们先删除刚才的镜像:
docker images
docker rmi <IMAGE ID1> <IMAGE ID2> ...然后执行docker pull命令:
docker pull sumumm/docker-demo:1.0.0或者直接执行下面的命令直接启动容器来验证(会自动拉取)
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能正常拉取和启动就没问题了:

参考资料: