什么是 Docker Registry
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。 镜像仓库管理多个 Repository,Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag) 来区分。 镜像仓库架构图如下:

Docker 镜像仓库负责存储、管理和分发镜像,提供登录认证及索引功能。主要分为公有仓库(如 Docker Hub)和私有仓库(如 Harbor)。工作流程包括登录、拉取、构建及推送镜像。常用命令涵盖 docker login/pull/push/search/logout 及容器管理指令。实战部分演示了 Nginx 服务搭建、在 Docker Hub 及云服务商(腾讯云、阿里云)创建私有仓库的具体步骤,并提供了基础镜像选择建议。

镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。 镜像仓库管理多个 Repository,Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag) 来区分。 镜像仓库架构图如下:

• 镜像仓库 (Registry): 要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如 hub.docker.com; 一个 Registry 中可以存在多个 Repository·Repository 可分为'顶层仓库'和'用户仓库';·用户仓库名称格式为'用户名/仓库名'·每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像
• Repository: ·由某特定的 docker 镜像的所有迭代版本组成的镜像仓库

这一个一个的就是所谓的 Repository
• 镜像名称(name)+ 标签 (tag): 如 nginx:latest

• 认证能力:提供用户注册,登录、登出能力

注册即认证能力
• 索引:提供镜像的索引信息,方便检索
一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的 checksum 这些信息都会记录下来,而实际镜像的数据就在存储数据里面,就是在一个一个的 blob 里面,真正占有空间的就是这些 blob。

用于描述镜像各种信息,即元数据
大家可以类比超市,一个 Repository 就是一个货架,白象就是组织者,货架上放的产品打的不同标签就是对应的 tag

按是否对外开放划分,也是研发人员常说的
(1)公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,供大家访问使用
(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。 按供应商和面向群体划分
(1)sponsor(赞助) registry:第三方的 registry,供客户和 docker 社区版使用
(2)mirror(镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才能使用
(3)vendor(供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像 Google 和 Redhat 提供了镜像仓库服务
(4)private registry:通过没有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用
• 通过 docker login 登录仓库 • Docker pull 拉取需要的镜像
• 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库
Docker Registry 中的镜像通常由开发人员制作,而后推送至'公共'或'私有'Registry 上保存,供其他人员使用,例如'部署'到生产环境;
实际开发我们从公共仓库中拉取需要的镜像加上我们自己的程序,制作不同的镜像,上传到公司的私有仓库,之后各个环境需要时,直接从私有仓库拉取对应的版本。

名词解释 开发环境:开发人员使用的一套环境 测试环境:需求开发完成后,发布到供测试人员进行测试的环境 预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布 生产环境:真正面向客户的环境
启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地;
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。 具有以下功能: (1)个人可以注册私有仓库,能够发布自己的镜像 (2)提供镜像检索能力 (3)提供海量官方和认证组织的镜像 (4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub (5)支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL。)




国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内镜像加速器服务,例如: 阿里云加速器 (点击管理控制台-> 登录账号 (淘宝账号) -> 右侧镜像工具-> 镜像加速器-> 复制加速器地址) 网易云加速器地址 https://hub-mirror.c.163.com 百度云加速器地址 "https://mirror.baidubce.com" 可以在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
添加完成后需要重新加载配置,重启 Docker:
# 加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
# 查看 docker 状态
sudo systemctl status docker
私有镜像仓库则是指部署在公司或组织内部,用于自身应用 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 镜像。
| 命令 | 别名 | 功能 | 备注 |
|---|---|---|---|
| docker login | 登录仓库 | 必须掌握 | |
| docker pull | docker image pull | 拉取镜像 | 必须掌握 |
| docker push | docker image push | 推送镜像 | 必须掌握 |
| docker search | 查找镜像 | ||
| docker logout | 登出仓库 | 必须掌握 |


•功能 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub,登录之前需要现在对应仓库网站注册一个账户,之后 docker login 登录输入的用户名和密码就是该账户的注册名和密码
因 docker 网站在外网不方便访问,该命令可以用阿里云或者腾讯云的练习,参考后面实战部分。 •语法
docker login [OPTIONS] [SERVER]
• 关键参数 • -u : 登陆的用户名 • -p : 登陆的密码 •样例
docker login -u 用户名 -p 密码


不推荐指定密码登录,不然容易泄漏密码
•功能 从镜像仓库中拉取或者更新指定镜像 •语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

TAG 和 DIGEST
•别名
docker image pull
•关键参数 • -a : 拉取所有 tagged 镜像 • --disable-content-trust : 忽略镜像的校验,默认开启 •样例
docker pull nginx:1.23.3

以上就是分别通过 TAG 和 DIGEST 进行下载演示,实际开发中 TAG 会用的多一点,TAG 就对应版本,方便选择和沟通。
•功能 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库 •语法
docker push [OPTIONS] NAME[:TAG]
•别名
docker image push
• 关键参数 • -a : 推送所有 tagged 镜像 • --disable-content-trust : 忽略镜像的校验,默认开启 • 样例



docker push 我们不能够像 pull,我们直接按照 NAME[:TAG] 是无法 push 的,我们需要在镜像网站创建对应仓库,按照提示,给我们要 push 的镜像打上镜像仓库 TAG,然后才可以将镜像 push 到对应的仓库中。
•功能 从 Docker Hub 查找镜像,因 docker 网站被封,该命令暂时国内无法实操,需要国外网络联系。 •语法
docker search [OPTIONS] TERM
•关键参数 ○--no-trunc : 显示完整的镜像描述; ○-f <过滤条件>:列出收藏数不小于指定值的镜像。 •样例
# 从 Docker Hub 查找所有镜像名包含 nginx,并且 star 数大于 10 的镜像
docker search -f stars=10 nginx


与官网的 GUI 界面查找相比,docker search 查找信息并不全,实际使用还是直接在官网中查找方便。
•功能 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub,因 docker 网站被封,该命令可以用阿里云或者腾讯云的镜像仓库练习,参考后面实战部分。 •语法
docker logout [SERVER]
•样例
docker logout

学习仓库前我们需要提前了解一部分的镜像命令,为后续的实战做准备。
•功能 列出本地镜像。 •语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
•别名
docker image ls, docker image list
•关键参数 • -a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层); • --digests : 显示镜像的摘要信息; • -f : 显示满足条件的镜像;


查看-f 支持哪些条件
• --format : 指定返回值的模板文件;


查看 format 支持的格式
• --no-trunc : 显示完整的镜像信息;

• -q : 只显示镜像 ID。

docker 命令也可以和 shell 指令配合使用 •样例
# 列出本地全部镜像
docker images
# 列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。
docker images ubuntu
•功能 查看镜像详细信息 •语法
docker image inspect [OPTIONS] IMAGE [IMAGE...]
选项主要就是上面的--format 选项,可以根据名字 TAG 或者 ID 查找
•样例


•功能 标记本地镜像,将其归入某一仓库,方便之后将本地镜像 push 对应仓库。 •语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
•别名
docker image tag
•样例
也可以通过 ID 打 TAG

学习仓库前我们需要提前了解一部分的容器命令,为后续的实战做准备。
•功能 创建一个新的容器并运行一个命令
•语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 可以让我们在宿主机上运行其他系统的镜像。如上图,虽然我们可以运行其他系统,但是由于我们并没有指定参数,这里进行没有收到长时运行的命令,所以很快就停止了,我们可以通过 docker ps 查看对应的镜像。
•别名
docker container run
• 关键参数 • -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 退出的时候自动删除容器
•样例
# 使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为 mynginx。
docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录
#/data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest


当我们的镜像是前台运行时,外部宿主机 ctrl+c 或者 shell 因为网络等原因都会让镜像的系统停止,而使用-d 将就可以后台运行,避免这些影响。

-i 和-t 指令常常组合在一起使用给镜像提供一个可以交互的终端,如上图我们给镜像 bash 参数运行后,搭配-it 就可以正常输入指令操作了。

只使用-i,我们虽然可以输入指令交互,但是没有终端。

而只使用-t,我们可以看到存在终端,但是终端无法与我们输入的指令交互。

镜像的端口是在容器内部的,因为隔离了,所以外部的服务器只能访问到宿主机的端口,无法访问容器内端口调用对应服务,所以我们需要将容器和宿主机的端口进行映射,打通之后,外部服务器才可以根据宿主机的端口访问容器内镜像。

将宿主机端口 8081 与容器端口 80 指定映射

-P 系统随机指定宿主机端口与容器端口映射。

--name="nginx-lb": 为容器指定一个名称,方便我们后续对容器进行各种操作

-h "mars": 指定容器的 hostname

-e username="ritchie": 设置环境变量;

--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;

-m : 设置容器使用内存最大值


--link=[]: 添加链接到另一个容器。上图中 mycentos2 可以 ping 通 mycentos1(mywebsite1 只是起的别名),但是反过来 mycentos1 不会自动 link mycentos2.
--rm :shell 退出的时候自动删除容器

•功能 列出容器 •语法
docker ps [OPTIONS]

•别名
docker container ls, docker container list, docker container ps
•关键参数 • -a : 显示所有的容器,包括未运行的。

• -f : 根据条件过滤显示的内容。

• --format : 指定返回值的模板文件。如 json 或者 table

• -l : 显示 latest 的容器。

• -n : 列出最近创建的 n 个容器。

• --no-trunc : 不截断输出。

• -q : 静默模式,只显示容器编号。

• -s : 显示总的文件大小。
•样例
docker ps -a
Web 服务器,一般是指'网站服务器',是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。 Web 服务器,也称为'WWW 服务器'( 英文全写:World Wide Web,翻译成中文:万维网或环球信息网),主要功能是'提供网上信息浏览服务'。WWW 是 Internet(互联网)的多媒体信息查询工具,是 Internet(互联网)上发展起来的服务,也是发展最快和目前使用最广泛的服务。正是因为有了 WWW 工具,才使得近十几年来互联网迅速繁荣发展,用户数量飞速飙升。据最新数据显示,目前全球人口数量达到 76.76 亿人,其中全球'网民'(互联网用户)达到惊人的 43.88 亿。 例如百度就是一个 web 服务器,提供搜索服务

Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器;Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。 可以理解 Nginx 是 web 服务器的一种实现。

Nginx 作为 Web 服务器可以向各种浏览器等客户端提供浏览服务,比如我们通过手机、电脑、平板可以访问百度来实现对 web 服务器的访问。

由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助 VPN 来实现,这就是一个简单的正向代理的例子,客户端的请求经过 VPN 服务到达服务端,这样服务端/运营商看到的 IP 就是 VPN 的 IP 可以绕过相关管制,也能起到保护客户端 IP 的作用。这里你能够发现,正向代理'代理'的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过 VPN 访问的。

当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理'代理'的是服务器端,而且这一个过程对于客户端而言是透明的。在这个过程中客户端的请求只知道一个服务器的 IP,所有的请求会被这个服务器通过反向代理派发给其他不同的服务器请求对应不同的资源,通过这种方式我们也就能进行流量控制、处理忙闲不均问题,对于一些微服务我们也能进行解耦,部署到不同的服务器上。 •安装
# ubuntu 安装 nginx
apt install nginx -y
# centos
# centos 配置 nginx 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx
•启动 nginx 作为一个网站
root@ubuntu1:/data# ps -ef |grep nginx
root 12920 1 0 12:29 ? 00:00:00 nginx: master process nginx
www-data 12921 12920 0 12:29 ? 00:00:00 nginx: worker process
www-data 12922 12920 0 12:29 ? 00:00:00 nginx: worker process
root 12951 2672 0 12:30 pts/0 00:00:00 grep --color=auto nginx
root@ubuntu1:/data#
# 查看版本
nginx -v
# 手动启动
nginx

# ubuntu 安装后首页的信息可能被调整了,需要确认下修改,注意 centos 7.9 默认的位置就
# 是/usr/share/nginx/html 无需修改,大家针对自己的系统可以检查后看是否需要调整配置
vi /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
include snippets/snakeoil.conf;
#调整 nginx 的默认页面
root /usr/share/nginx/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
root@ubuntu1:/data# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ubuntu1:/data# ps -ef |grep nginx
root 12920 1 0 12:29 ? 00:00:00 nginx: master process nginx
www-data 12921 12920 0 12:29 ? 00:00:00 nginx: worker process
www-data 12922 12920 0 12:29 ? 00:00:00 nginx: worker process
root 13047 2672 0 12:33 pts/0 00:00:00 grep --color=auto nginx
root@ubuntu1:/data#
kill 12920
Docker search 可以查找,但是 nginx 的详细的 tag 我们看不见


所以一般我们还是从网站上寻找认证无安全漏洞的镜像下载





Busybox BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。BusyBox 包含了一些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区 1M 左右的大小。因海外带宽较小,我们拉取该镜像推送到自己的仓库。 •安装
# Ubuntu 安装
apt install -y busybox
# CentOS 安装
wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificate
mv busybox-x86_64 busybox
chmod +x busybox
./busybox
•执行命令
busybox ls
busybox ifconfig
busybox ifconfig |busybox grep lo
•如果不使用后面可以卸载
# ubuntu 卸载
apt --purge autoremove busybox
# centos 卸载
# 清理对应目录就好

登录后点击仓库,我们创建一个个人仓库

如果提示需要进入,进入自己的邮箱完成激活

我们输入仓库信息,可见信息,点击创建完成

•拉取 busybox 镜像

•给镜像打标签
docker tag busybox:latest maxhou/mybusybox:v0.1
此时查看我们多了个镜像

•推送镜像到仓库,报错,因为没有登录

•登录 docker hub

•推送镜像成功

•在我们的 docker hub 仓库里面查看

退出
docker logout

登录后进入容器镜像服务

点击立即选购

点击左侧的镜像仓库

点击新建,我们创建个人的私有仓库,配置对应的参数

可以看到我们的仓库已经创建成功了

点击快捷指令,可以看到登录和推送的指令,我们首先登录

打标签,推送

在腾讯云上查看我们的仓库

登出
docker logout ccr.ccs.tencentyun.com

在产品上搜索容器镜像服务
点击管理控制台

点击创建个人实例

创建后,提示设置登录密码

完成登录密码的设置,这个密码就是我们的 docker login 的密码

点击创建镜像仓库,提示创建命名空间


配置仓库参数

设置仓库为本地仓库,完成创建

可以看到阿里云也提供了快捷指令

登录

给镜像打标签,推送到仓库

查看服务器镜像

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

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online