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

一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,镜像的最终内容存储 blob 里面,真正占有空间的就是这些 blob。
2、镜像仓库的分类
按开放程度划分
这是最直观的分类,主要区分谁能访问仓库里的镜像。
- 公有仓库 :面向公网开放,任何人通常都可以拉取镜像。最典型的是 Docker Hub,它托管了大量官方镜像和用户公开的镜像。国内云厂商(如阿里云、腾讯云)提供的公共镜像服务也属于此类,但往往需要注册账号才能使用。
- 私有仓库 :部署在私有网络或企业内部,不对外网开放,仅供组织内部使用。它用于存储内部应用镜像,是 CI/CD 流程中衔接构建与部署的关键环节。常见的搭建工具包括 Harbor、Nexus 以及 Docker 官方的 Registry 等。
按角色与用途划分
如果从仓库在镜像分发链路中扮演的角色来看,可以分得更细:
- 赞助/公共仓库:由第三方运营,同时服务于普通用户和社区,例如 Docker Hub 本身。
- 镜像/加速仓库:由第三方(通常是云厂商)提供,仅对其客户开放,主要用于加速公网镜像的拉取。例如阿里云的容器镜像服务(ACR)的加速器功能。
- 供应商仓库 :由发布镜像的软件供应商自己维护,用于分发其官方产品镜像,例如 Google 的
gcr.io或 Red Hat 的仓库。- 私有仓库:企业或组织在内部搭建,完全用于自身业务的镜像存储与分发。
3、Docker 基本指令
3.1 学习建议
不必死记硬背,熟悉即可,如果忘记就在指令后跟 --help 选项,比如
bash
[hxh@VM-16-12-centos ~]$ docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
或者在 Docker 的官网查找,URL:docker | Docker Docs
3.2 docker login 指令
作用:用于向镜像仓库(Registry)进行身份认证,以便后续拉取或推送私有镜像。认证成功后,凭证会保存在本地(Linux 下通常是 ~/.docker/config.json),后续的 docker pull 或 docker push 会自动复用,无需重复登录
基本语法
bash
docker login [OPTIONS] [SERVER]
如果不指定 SERVER,默认登录的是 Docker 官方公共仓库 https://registry-1.docker.io/
常用选项
| 选项 | 说明 |
|---|---|
-u, --username |
指定用户名 |
-p, --password |
指定密码或访问令牌(不推荐在命令行明文使用) |
--password-stdin |
从标准输入读取密码,适合脚本或 CI/CD 环境 |
3.3 docker pull 指令
作用:用于从镜像仓库拉取镜像到本地
基本语法
bash
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
不指定 TAG 时默认拉取 latest 标签;也可以用 @DIGEST 精确拉取某个内容哈希对应的镜像版本。

常用选项
| 选项 | 说明 |
|---|---|
-a, --all-tags |
拉取该仓库下所有标签的镜像 |
--platform |
指定平台架构,如 linux/amd64、linux/arm64,多架构镜像时有用 |
-q, --quiet |
精简输出,只显示镜像 ID |
使用示例
bash
# 拉取最新版
docker pull nginx
# 拉取指定标签
docker pull nginx:1.27-alpine
# 拉取指定架构(在 arm 机器上拉 amd64 镜像等场景)
docker pull --platform linux/amd64 nginx:latest
# 拉取某仓库所有标签(慎用,可能非常大)
docker pull -a myrepo/myimage
#用 @DIGEST 精确拉取
docker pull nginx@sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25
3.4 docker push 指令
作用:用于将本地镜像上传到镜像仓库
基本语法
bash
docker push [OPTIONS] NAME[:TAG]
#或者
docker image push [OPTIONS] NAME[:TAG]
| 选项 | 说明 |
|---|---|
-a, --all-tags |
推送该仓库下所有标签的镜像 |
-q, --quiet |
精简输出,只显示镜像 ID |
--platform |
推送指定平台(如 linux/amd64)的单一清单,多架构镜像慎用 |
推送前必须先将本地镜像"标记"为目标仓库的完整地址,否则 docker push 不知道往哪推。
bash
# 格式:docker tag 本地镜像名 仓库地址/命名空间/仓库名:标签
docker tag my-app:latest yourusername/my-app:v1.0
3.5 docker search 指令
作用:用于在 Docker Hub 上按关键词搜索公开镜像,但是我们一般使用浏览器直接在 hub.docker.com 上找,不会使用命令行找。
基本语法
bash
docker search [OPTIONS] TERM
执行后会返回一个表格,包含这几列:
NAME :镜像名。不带
/的是官方镜像,带/的是用户/组织镜像(如username/image)。DESCRIPTION:镜像描述(默认截断)。
STARS:收藏数,大致反映受欢迎程度。
OFFICIAL :显示
[OK]表示是 Docker 官方镜像。AUTOMATED:是否自动构建(此功能已标记弃用)。
常用选项
| 选项 | 说明 |
|---|---|
-f, --filter |
按条件过滤,支持 stars=N(星数≥N)、is-official=true(仅官方) |
--limit |
限制返回结果数量(默认通常为 25,最大 100) |
--no-trunc |
不截断描述信息,显示完整内容 |
--format |
使用 Go 模板自定义输出,如 --format "{``{.Name}}: {``{.StarCount}}" |
3.6 docker logout 指令
作用:用于退出已登录的镜像仓库,并清除本地保存的对应凭证。如果不指定仓库地址,默认退出 Docker 官方公共仓库。
基本语法
bash
docker logout [SERVER]
SERVER 参数是可选的,可以填仓库的 URL 或主机名。
使用示例
bash
# 退出 Docker Hub(默认行为)
docker logout
# 退出本地或私有仓库(例如 localhost:8080)
docker logout localhost:8080
执行成功后,通常会看到类似 Removing login credentials for https://index.docker.io/v1/ 的提示,表示凭证已从本地配置中移除。
3.7 docker images 指令
作用:用于列出本地存储的 Docker 镜像
基本语法
bash
docker images [OPTIONS] [REPOSITORY[:TAG]]
可以按仓库名和标签进行精确过滤。例如 docker images java 列出 java 仓库的所有镜像,docker images java:8 只列出标签为 8 的镜像。注意匹配必须是精确的,docker images jav 不会匹配到 java。
常用选项
| 选项 | 作用 |
|---|---|
-a, --all |
显示所有镜像,包括中间层镜像(默认会隐藏) |
-q, --quiet |
只显示镜像 ID,适合脚本处理 |
--no-trunc |
显示完整的镜像 ID,不截断 |
--digests |
额外显示镜像的摘要(digest) |
-f, --filter |
按条件过滤,例如 dangling=true 只看悬空镜像, before=镜像名 只看早于 镜像名 的镜像 |
使用示例
bash
# 查看本地所有镜像
docker images
# 只看镜像 ID(常用于批量删除等脚本)
docker images -q
# 查看悬空镜像(没有标签、不被任何容器引用的镜像)
docker images --filter "dangling=true"
# 查看 nginx 仓库的所有本地镜像
docker images nginx
默认输出包含 REPOSITORY(仓库名)、TAG(标签)、IMAGE ID(镜像 ID)、CREATED(创建时间)、SIZE(大小)。其中 IMAGE ID 默认截断显示,但通常前几位字符就足以在其他 Docker 命令中引用该镜像。
3.8 docker image inspect 指令
作用:用于查看一个或多个本地镜像的详细元数据,输出为 JSON 格式。
基本语法
bash
docker image inspect [OPTIONS] IMAGE [IMAGE...]
常用选项
| 选项 | 作用 |
|---|---|
-f, --format |
用 Go 模板自定义输出,提取特定字段,避免阅读大段 JSON |
--platform |
查看多平台镜像中指定平台(如 linux/amd64)的详细配置(需 API 1.49+) |
使用示例
bash
docker image inspect nginx:latest
输出中的关键字段
| 字段 | 含义 |
|---|---|
Id |
镜像的内容寻址 ID(SHA256) |
RepoTags |
指向该镜像的本地标签列表 |
RepoDigests |
从仓库拉取时记录的 manifest digest |
Architecture / Os |
镜像的目标平台 |
Config.Env / Config.Cmd |
默认环境变量与启动命令 |
RootFS.Layers |
组成镜像的每一层 digest |
Size |
镜像总大小(字节) |
3.9 docker tag 指令
作用:用于为本地镜像创建一个新的标签(别名)。它不会复制镜像数据,只是让同一个镜像 ID 多了一个可引用的名称,常用于在推送前将镜像"标记"为目标仓库的完整地址。
基本语法
bash
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
理解 TARGET_IMAGE 的组成很重要,因为它决定了镜像会被推送到哪里:
bash
[HOST[:PORT]/]NAMESPACE/REPOSITORY[:TAG]
| 组成部分 | 说明 | 默认值 |
|---|---|---|
| HOST | 仓库地址(如 registry.cn-hangzhou.aliyuncs.com) |
docker.io(Docker Hub) |
| NAMESPACE | 用户或组织名 | library(官方镜像命名空间) |
| REPOSITORY | 镜像仓库名 | 必填 |
| TAG | 版本标识 | latest |
常用示例
1. 为镜像 ID 打标签
bashdocker tag 0e5574283393 fedora/httpd:version1.0将短 ID 为
0e5574283393的本地镜像标记为fedora/httpd:version1.0。2. 为已有名称的镜像打新标签
bashdocker tag httpd:test fedora/httpd:version1.0.test源镜像指定了
httpd:test,目标标签为fedora/httpd:version1.0.test。3. 为推送到私有仓库做准备
bashdocker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0目标名称包含了仓库主机名和端口,这样后续
docker push才会推送到私有仓库而非 Docker Hub。4. 准备推送到 Docker Hub
bashdocker tag my-app yourusername/my-app:v1.0将本地
my-app标记为yourusername/my-app:v1.0,之后即可docker push yourusername/my-app:v1.0
3.10 docker run 指令
作用:是 Docker 最核心的命令,它将"创建容器"和"启动容器"两步合二为一:先从指定镜像创建一个可运行实例,然后立即启动它。
基本语法
bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
IMAGE 是必需的,指定用哪个镜像来创建容器。如果本地没有该镜像,Docker 会先自动拉取
常用选项
| 选项 | 作用 |
|---|---|
-d, --detach |
后台运行容器并打印容器 ID |
-it |
-i(保持标准输入打开)+ -t(分配伪终端),用于交互式操作 |
--name |
给容器指定一个名字,便于后续引用,如果不指定,随机生成 |
| -h | 指定容器的 hostname |
-p, --publish |
端口映射,格式 宿主机端口A:容器端口B,访问 A 端口自动转入 B 端口 |
| -P | 随机端口映射 |
-e, --env |
设置环境变量,如 -e POSTGRES_PASSWORD=secret |
--rm |
容器退出后自动删除,适合一次性任务 |
-v / --mount |
挂载数据卷或绑定宿主机目录,实现数据持久化 |
--network |
将容器接入指定网络,同一自定义网络内的容器可用名字互相访问 |
| --cpuset-cpus | 绑定容器到指定 CPU运行,如:--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2" |
| -m | 设置容器使用内存最大值 |
使用示例:
在 CentOS 宿主机上运行一个 ubuntu 操作系统
bashdocker pull ubuntu:latest docker run -it ubuntu:latest cat /etc/*release* // 输入 exit 回到宿主机后台运行 Web 服务并映射端口
bashdocker run -d --name my-nginx -p 8080:80 nginx在浏览器访问
http://localhost:8080即可看到 Nginx 默认页。交互式运行一次性容器
bashdocker run --rm -it ubuntu /bin/bash进入一个临时的 Ubuntu shell,退出后容器自动删除。
带环境变量和资源限制运行数据库
bashdocker run -d --name pg -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" -p 5432:5432 postgres启动一个限制为 512MB 内存、0.5 核 CPU 的 PostgreSQL 容器。
3.11 docker ps 指令
作用:用于列出本地容器及其状态
基本语法
bash
docker ps [OPTIONS]
常见选项
| 选项 | 作用 |
|---|---|
-a, --all |
显示所有容器,包括已停止的 |
-q, --quiet |
只输出容器 ID,适合脚本处理 |
-f, --filter |
按条件过滤,如 status=exited、name=web |
--format |
自定义输出,如 --format "{``{.Names}}\t{``{.Status}}" |
-s, --size |
显示容器磁盘占用 |
-n, --last |
显示最近创建的 n 个容器(含停止的) |
使用示例
bash
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 只看已退出的容器
docker ps -a --filter "status=exited"
# 只输出所有容器 ID(常用于批量操作)
docker ps -aq
# 自定义输出列
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
4、综合运用:搭建一个 Nginx 服务
4.1 正向代理与反向代理
正向代理和反向代理的核心区别在于代理服务器站在哪一方:正向代理站在客户端一边,代替客户端去访问外部;反向代理站在服务端一边,代替后端服务器接收外部请求。
正向代理
正向代理部署在客户端与目标服务器之间 ,客户端主动配置代理地址(VPN),请求先发给代理,再由代理转发给目标服务器。对目标服务器而言,它只知道请求来自代理,不知道真正的客户端是谁。
- 典型用途:突破网络访问限制、企业内网统一出口、缓存常用资源、隐藏客户端身份。
- 关键特征 :代理对象是客户端,客户端需要显式配置才能使用。
反向代理
反向代理部署在服务器端前面,客户端直接访问代理地址,代理再将请求分发给后端的真实服务器。对客户端而言,它以为自己在直接访问目标服务,不知道背后有多台服务器。
- 典型用途:负载均衡(把请求分发到多台后端)、SSL/TLS 终止(HTTPS 在代理层解密)、缓存静态内容、隐藏后端服务器拓扑、统一入口与安全防护。
- 关键特征 :代理对象是服务器,客户端无需任何配置,甚至感知不到代理的存在。
对比总结
| 维度 | 正向代理 | 反向代理 |
|---|---|---|
| 代理谁 | 代理客户端 | 代理服务器 |
| 部署位置 | 靠近客户端 | 靠近服务器端 |
| 客户端配置 | 需要显式配置代理地址 | 无需配置,直接访问代理地址 |
| 目标服务器感知 | 不知道真实客户端 | 不知道真实客户端(只知道代理) |
| 主要目的 | 访问控制、突破限制、隐藏客户端 | 负载均衡、安全防护、缓存、统一入口 |
| 典型例子 | 浏览器代理、VPN、企业上网代理 | Nginx 反向代理、Harbor 前置 Nginx、CDN |
4.2 nginx 介绍
Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,同时也能作为邮件代理和通用的 TCP/UDP 代理使用。它以占用内存少、并发处理能力强而闻名,是目前互联网上最主流的 Web 服务器之一。
核心角色与功能
结合之前了解的反向代理概念,Nginx 最常扮演的角色正是站在服务器端的那个代理。它的主要用途包括:
Web 服务器:直接处理并返回静态文件(如 HTML、图片、CSS),在这方面性能表现突出。
反向代理与负载均衡:作为统一入口接收客户端请求,再按照策略(如轮询)分发给后端的多台应用服务器,从而隐藏后端拓扑、分摊压力。
缓存:缓存后端响应,减少对应用服务器的重复请求,加快响应速度。
为什么性能好
Nginx 的高性能主要源于其架构设计。它采用事件驱动的异步非阻塞模型,而不是像传统服务器那样为每个连接创建一个线程或进程。这种设计让它能用很少的资源同时处理数万个并发连接。在运行方式上,它通常由一个 master 进程管理多个 worker 进程,worker 进程负责实际处理请求,master 进程负责读取配置和管理 worker。
4.3 宿主机安装和启动 nginx
安装 nginx
bash
# 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 makecache
#开始下载
yum install -y nginx
启动 nginx
bash
systemctl start nginx
#或者
nginx
启动 nginx 后,使用浏览器输入云服务器的IP地址直接访问:

关闭 nginx
bash
systemctl stop nginx
#或者
kill -9 nginx的master进程的PID
nginx 的配置文件是 /etc/nginx/nginx.conf
bash
cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
我们关注 include /etc/nginx/conf.d/*.conf; 查看 include /etc/nginx/conf.d/ 目录,发现有一个 default.conf 文件,查看文件内容:
bash
cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
/etc/nginx/conf.d/default.conf 是 Nginx 安装后自动生成的一个默认站点配置文件,它的核心作用是为 Nginx 提供一个开箱即用的基础配置,让你安装完成后就能通过服务器 IP 访问到一个默认页面。
它的具体作用与内容
这个文件本质上是一个被
nginx.conf主配置自动加载的"配置片段"。Nginx 的主配置文件/etc/nginx/nginx.conf中通常有一行include /etc/nginx/conf.d/*.conf;,这意味着conf.d目录下所有以.conf结尾的文件都会被自动纳入配置。
default.conf里通常定义了一个默认的server块(虚拟主机),包含以下基础设置:
监听端口:默认监听 80 端口。
服务器名称 :通常设置为
_或localhost,用于匹配未指定域名或直接通过 IP 访问的请求。网站根目录 :指定默认的网页文件存放路径(如
/usr/share/nginx/html)。默认首页 :指定
index.html等作为默认加载的文件。
使用时的注意事项
可以修改,但要注意更新覆盖 :你可以直接编辑这个文件来调整默认站点的行为(比如换根目录、加反向代理规则)。不过,部分安装方式生成的该文件可能带有注释,提示它由系统自动生成,手动修改的内容在软件包更新时可能会被覆盖。对于生产环境,更稳妥的做法是为你的具体站点新建独立的
.conf文件 放在conf.d目录下,而不是直接改动default.conf。它只是默认入口 :当你配置了其他带有具体
server_name的站点后,default.conf通常只负责承接那些没有匹配到任何具体域名的"兜底"请求,或者直接访问 IP 的请求。如果你不需要这个默认页面,可以将其删除或禁用(例如重命名为.conf.bak),但前提是你要确保有其他配置能处理发往本机 80 端口的请求。
4.4 Docker 搭建 Nginx 服务
bash
#获取 Nginx 镜像
docker pull nginx:1.24.0
#查看 nginx 镜像是否获取成功
docker images nginx
#查看镜像的详细信息
docker image inspect nginx:1.24.0
#启动镜像
docker run -p 8080:80 --name myweb1 -h myweb1.com -e myenv=test -d nginx:1.24.0
#查看镜像信息
docker ps
#上面的镜像是后台运行的,我们没有办法与它交互,也就无法修改首页,使用 -it 选项,并执行容器 bash 指令
docker run -p 8082:80 --name myweb3 -h myweb1.com -e myenv=test -it nginx:1.24.0 bash
root@myweb1:/#
#首页的html存储在/usr/share/nginx/html/index.html
root@myweb1:/# cd /usr/share/nginx/html/
root@myweb1:/usr/share/nginx/html/# echo "Hello World" > index.html
#手动启动 nginx
root@myweb1:/usr/share/nginx/html/# nginx
5、综合运用:在 Docker Hub 创建私有仓库
5.1 Busybox 介绍
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一 些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、find、mount 以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。 简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。busybox 是一个集成了一百多个最常用 linux 命令和 工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区1M左右的大小,拉取的速度快。
5.2 宿主机安装和使用 Busybox
bash
#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 ll
./busybox ping www.baidu.com