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 选项,比如
[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会自动复用,无需重复登录
基本语法
docker login [OPTIONS] [SERVER]如果不指定SERVER,默认登录的是 Docker 官方公共仓库https://registry-1.docker.io/
常用选项
| 选项 | 说明 |
|---|---|
-u, --username | 指定用户名 |
-p, --password | 指定密码或访问令牌(不推荐在命令行明文使用) |
--password-stdin | 从标准输入读取密码,适合脚本或 CI/CD 环境 |
3.3 docker pull 指令
作用:用于从镜像仓库拉取镜像到本地
基本语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]不指定 TAG 时默认拉取 latest 标签;也可以用 @DIGEST 精确拉取某个内容哈希对应的镜像版本。
常用选项
| 选项 | 说明 |
|---|---|
-a, --all-tags | 拉取该仓库下所有标签的镜像 |
--platform | 指定平台架构,如linux/amd64、linux/arm64,多架构镜像时有用 |
-q, --quiet | 精简输出,只显示镜像 ID |
使用示例
# 拉取最新版 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:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba253.4 docker push 指令
作用:用于将本地镜像上传到镜像仓库
基本语法
docker push [OPTIONS] NAME[:TAG] #或者 docker image push [OPTIONS] NAME[:TAG]| 选项 | 说明 |
|---|---|
-a, --all-tags | 推送该仓库下所有标签的镜像 |
-q, --quiet | 精简输出,只显示镜像 ID |
--platform | 推送指定平台(如linux/amd64)的单一清单,多架构镜像慎用 |
推送前必须先将本地镜像“标记”为目标仓库的完整地址,否则docker push不知道往哪推。
# 格式:docker tag 本地镜像名 仓库地址/命名空间/仓库名:标签 docker tag my-app:latest yourusername/my-app:v1.03.5 docker search 指令
作用:用于在 Docker Hub 上按关键词搜索公开镜像,但是我们一般使用浏览器直接在 hub.docker.com 上找,不会使用命令行找。
基本语法
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 官方公共仓库。
基本语法
docker logout [SERVER]SERVER参数是可选的,可以填仓库的 URL 或主机名。
使用示例
# 退出 Docker Hub(默认行为) docker logout # 退出本地或私有仓库(例如 localhost:8080) docker logout localhost:8080执行成功后,通常会看到类似Removing login credentials for https://index.docker.io/v1/的提示,表示凭证已从本地配置中移除。
3.7 docker images 指令
作用:用于列出本地存储的 Docker 镜像
基本语法
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 | 按条件过滤,例如
before=镜像名 只看早于 镜像名 的镜像 |
使用示例
# 查看本地所有镜像 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 格式。
基本语法
docker image inspect [OPTIONS] IMAGE [IMAGE...]常用选项
| 选项 | 作用 |
|---|---|
-f, --format | 用 Go 模板自定义输出,提取特定字段,避免阅读大段 JSON |
--platform | 查看多平台镜像中指定平台(如linux/amd64)的详细配置(需 API 1.49+) |
使用示例
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 多了一个可引用的名称,常用于在推送前将镜像“标记”为目标仓库的完整地址。
基本语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]理解TARGET_IMAGE的组成很重要,因为它决定了镜像会被推送到哪里:
[HOST[:PORT]/]NAMESPACE/REPOSITORY[:TAG]| 组成部分 | 说明 | 默认值 |
|---|---|---|
| HOST | 仓库地址(如registry.cn-hangzhou.aliyuncs.com) | docker.io(Docker Hub) |
| NAMESPACE | 用户或组织名 | library(官方镜像命名空间) |
| REPOSITORY | 镜像仓库名 | 必填 |
| TAG | 版本标识 | latest |
常用示例
1. 为镜像 ID 打标签
docker tag 0e5574283393 fedora/httpd:version1.0将短 ID 为
0e5574283393的本地镜像标记为fedora/httpd:version1.0。2. 为已有名称的镜像打新标签
docker tag httpd:test fedora/httpd:version1.0.test源镜像指定了
httpd:test,目标标签为fedora/httpd:version1.0.test。3. 为推送到私有仓库做准备
docker tag my-app:latest myregistryhost:5000/fedora/httpd:version1.0目标名称包含了仓库主机名和端口,这样后续
docker push才会推送到私有仓库而非 Docker Hub。4. 准备推送到 Docker Hub
docker 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 最核心的命令,它将“创建容器”和“启动容器”两步合二为一:先从指定镜像创建一个可运行实例,然后立即启动它。
基本语法
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 操作系统
docker pull ubuntu:latest docker run -it ubuntu:latest cat /etc/*release* // 输入 exit 回到宿主机后台运行 Web 服务并映射端口
docker run -d --name my-nginx -p 8080:80 nginx在浏览器访问
http://localhost:8080即可看到 Nginx 默认页。交互式运行一次性容器
docker run --rm -it ubuntu /bin/bash进入一个临时的 Ubuntu shell,退出后容器自动删除。
带环境变量和资源限制运行数据库
docker 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 指令
作用:用于列出本地容器及其状态
基本语法
docker ps [OPTIONS]常见选项
| 选项 | 作用 |
|---|---|
-a, --all | 显示所有容器,包括已停止的 |
-q, --quiet | 只输出容器 ID,适合脚本处理 |
-f, --filter | 按条件过滤,如status=exited、name=web |
--format | 自定义输出,如--format "{{.Names}}\t{{.Status}}" |
-s, --size | 显示容器磁盘占用 |
-n, --last | 显示最近创建的 n 个容器(含停止的) |
使用示例
# 查看运行中的容器 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
# 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
systemctl start nginx #或者 nginx启动 nginx 后,使用浏览器输入云服务器的IP地址直接访问:
关闭 nginx
systemctl stop nginx #或者 kill -9 nginx的master进程的PIDnginx 的配置文件是 /etc/nginx/nginx.conf
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 文件,查看文件内容:
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 服务
#获取 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/# nginx5、综合运用:在 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
#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