Docker 使用入门
在学习使用 Docker 之前,深入理解 Docker 镜像仓库的概念至关重要。镜像仓库是 Docker 生态系统的核心组件,为镜像的存储、管理和分发提供了基础设施支持。
一、Docker Registry 架构解析
1.1 核心概念定义
镜像仓库 (Docker Registry) 是集中存储和分发 Docker 镜像的服务,它提供以下核心功能:
- 镜像的存储与管理
- 版本控制与标签管理
- 用户认证与权限控制
- 镜像检索与索引服务
1.2 层次化组织结构
镜像仓库采用分层化的组织结构:
Registry (镜像仓库) → Repository (仓库) → Image (镜像) → Tag (标签)
具体说明:
- Registry: 通过 DNS 或 IP 地址标识的镜像仓库服务(如
hub.docker.com) - Repository: 包含特定 Docker 镜像所有版本的集合,分为:
- 顶层仓库: 如
nginx,ubuntu - 用户仓库: 格式为
用户名/仓库名,如alpine/nginx
- 顶层仓库: 如
- Tag: 标识同一镜像的不同版本,如
nginx:latest,nginx:1.25
1.3 技术实现架构
每个容器镜像包含两个组成部分:
- 元数据 (Metadata): 描述镜像的层次结构、校验和、构建历史等信息
- 存储数据 (Blob): 实际的文件系统层内容,占用主要存储空间
镜像仓库的整体视图如下:

二、镜像仓库分类体系
2.1 按访问权限划分
(1)公有仓库 (Public Registry)
- 典型代表: Docker Hub, Quay.io
- 特点: 面向公众开放,通常无需认证即可下载镜像
- 适用场景: 开源项目、公共基础镜像分发
(2)私有仓库 (Private Registry)
- 部署位置: 私有网络环境
- 特点: 需要身份认证,提供更高的安全性和隐私保护
- 适用场景: 企业内部镜像管理、敏感应用部署
2.2 按服务提供商划分
(1)赞助仓库 (Sponsor Registry)
- 第三方提供商运营
- 面向 Docker 社区和客户使用
(2)镜像仓库 (Mirror Registry)
- 第三方提供的镜像代理服务
- 通常需要注册使用(如阿里云镜像服务)
(3)供应商仓库 (Vendor Registry)
- 由软件供应商直接提供
- 如 Google Container Registry, RedHat Quay
(4)私有仓库 (Private Registry)
- 企业自建的内部分发体系
- 提供完整的隔离和安全保障
三、镜像仓库工作流程
3.1 核心操作流程
Docker 镜像仓库的标准工作流程包含以下关键步骤:
- 身份认证:
docker login登录到目标仓库 - 镜像拉取:
docker pull从仓库下载所需镜像 - 镜像构建: 通过 Dockerfile 或 commit 制作新镜像
- 镜像推送:
docker push将镜像上传至仓库
注意: 拉取公共镜像通常无需登录,但推送镜像必须通过身份认证。
3.2 多环境分发流程
在现代软件开发流程中,镜像通过仓库在不同环境间流转:

环境角色说明:
- 开发环境: 开发人员构建和测试镜像的环境
- 测试环境: 质量保证团队进行功能验证的环境
- 预发布环境: 模拟生产环境进行最终验证
- 生产环境: 面向终端用户的正式运行环境
3.3 本地缓存机制
Docker Daemon 的智能缓存策略:
- 启动容器时优先检查本地镜像缓存
- 本地缺失时自动从配置的 Registry 下载
- 下载的镜像持久化存储在本地,加速后续使用
为了更好地理解镜像仓库的概念,我们可以用超市购物来类比:
- Registry = 整个超市(如沃尔玛、家乐福)
- Repository = 商品类别(饮料区、零食区、日用品区)
- Image = 具体商品(可乐、薯片、洗发水)
- Tag = 商品规格(330ml 罐装、500ml 瓶装、家庭装)
这种层次化的组织结构使得海量镜像的管理和检索变得高效而有序。
Docker 镜像仓库作为容器化生态的基石,提供了完整的镜像生命周期管理能力。通过理解其架构设计、分类体系和工作原理,开发者能够更好地利用 Docker 技术实现高效的应用构建、分发和部署。掌握镜像仓库的使用是 Docker 技术栈中不可或缺的核心技能。
四、常见镜像仓库
4.1 Docker Hub
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。具有以下功能:
(1)个人可以注册私有仓库,能够发布自己的镜像
(2)提供镜像检索能力
(3)提供海量官方和认证组织的镜像
(4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
(5)支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL。 )
Docker Hub 功能强大,下面列举几个非常常用的功能:
4.1.1 镜像搜索
用户可以通过关键字搜索功能,快速找到所需的镜像。

4.1.2 镜像 tag 查找
用户可以通过镜像的标签(tag)快速找到特定版本的镜像。

通过对应的 tag 可以直接获取对应的版本拉取指令,一键 CP,简单无脑

4.2 国内镜像源
直接访问 docker hub 通常是比较慢的,因此很多国内云服务商提供了镜像加速服务。常见的国内镜像源包括:
- 阿里云
https://<your-region>.mirror.aliyuncs.com
- 腾讯云
https://mirror.ccs.tencentyun.com
- 华为云
https://repo.huaweicloud.com
- DaoCloud
https://www.daocloud.io/mirror
使用这些国内镜像源可以显著提高镜像拉取速度,减少构建时间。
4.3 私有仓库
私有镜像仓库是指部署在企业或组织内部网络环境中,专门用于内部 Docker 镜像存储、管理和分发的镜像仓库服务。在企业级 DevOps 流程中,私有仓库发挥着至关重要的作用。
核心价值与定位
私有镜像仓库在企业环境中具有以下关键价值:
- 安全性保障:避免将敏感应用镜像暴露在公网环境中
- 网络优化:内网传输显著提升镜像拉取和推送速度
- 合规性要求:满足行业监管和数据本地化存储要求
- 自主可控:完全掌握镜像的生命周期管理权限
在自动化发布体系中,私有仓库作为 CI/CD 流程的核心枢纽,通常承担以下职责:
- 接收来自持续集成阶段构建的应用镜像
- 为持续部署阶段提供稳定可靠的镜像源
- 实现不同环境(开发、测试、生产)间的镜像版本控制
主流私有仓库解决方案
1. Harbor - 企业级 Registry 解决方案
产品背景:
- 由 VMware 公司开源的企业级 Docker Registry 项目
- 在 Docker 官方开源 registry 基础上增强而来
核心特性:
- 可视化管理系统:提供友好的 Web 管理界面
- 基于角色的访问控制(RBAC):精细化的权限管理体系
- 企业集成能力:支持 AD/LDAP 认证集成
- 安全审计功能:完整的操作日志记录和审计追踪
- 多语言支持:原生支持中文界面
- 高可用架构:支持多节点集群部署
技术架构:
- 采用微服务架构设计,各组件均以 Docker 容器形式运行
- 使用 Docker Compose 或 Kubernetes 进行统一部署和管理
2. Nexus Repository - 通用制品仓库平台
产品背景:
- 由 Sonatype 公司开发的通用制品仓库管理平台
- 最初作为 Maven 私服广泛应用,现已支持多种格式
核心特性:
- 多格式支持:同时支持 Maven、Docker、NPM、PyPI 等多种制品格式
- 统一管理:单一平台管理所有类型的开发制品
- 代理缓存:智能缓存公有仓库内容,减少外网依赖
- 空间优化:高效的存储空间管理和垃圾回收机制
- 扩展性强:丰富的插件生态系统和 API 接口
适用场景:
- 需要统一管理多种类型制品的异构技术栈环境
- 已有 Nexus 作为 Maven 私服,希望扩展 Docker 支持的企业
3. Docker Registry - 官方轻量级解决方案
产品背景:
- Docker 官方提供的开源镜像仓库实现
- 功能简洁,专注于核心的镜像存储和分发
核心特性:
- 轻量级设计:资源消耗低,部署简单快捷
- 标准兼容:完全遵循 Docker Registry API 规范
- 灵活存储:支持多种后端存储驱动(文件系统、S3、Azure Blob 等)
- TLS 加密:支持 HTTPS 安全传输
- 基础认证:提供基本的身份验证机制
适用场景:
- 小型团队或测试环境的快速搭建
- 作为其他复杂解决方案的底层基础
- 需要高度定制化开发的基础平台
技术选型建议
| 特性 | Harbor | Nexus | Docker Registry |
|---|---|---|---|
| 企业级功能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| 易用性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 多格式支持 | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
| 部署复杂度 | 中等 | 中等 | 简单 |
| 社区生态 | 活跃 | 成熟 | 基础 |
| 适合规模 | 中大型企业 | 混合技术栈企业 | 小型团队 |
部署实践建议
- 存储规划:预留充足的存储空间,并考虑备份策略
- 网络配置:合理规划网络访问策略和域名解析
- 监控告警:建立完整的监控体系,包括磁盘空间、服务状态等
- 备份恢复:制定完善的备份和灾难恢复方案
- 权限管理:根据团队结构设计合理的权限分配方案
私有镜像仓库的选择应该基于企业的具体需求、技术栈现状和团队规模进行综合考量。对于大多数企业而言,Harbor 提供了最完整的开箱即用体验,而 Nexus 则更适合需要统一管理多种类型制品的复杂环境。
五、镜像仓库命令
5.1 docker login
简介:用于登录到 Docker 镜像仓库(如 Docker Hub、阿里云容器镜像服务等私有仓库)。登录后,你才拥有推送镜像到仓库或拉取私有镜像的权限。
基本用法:
docker login [OPTIONS] [SERVER]
SERVER:镜像仓库地址(可选)。默认为 Docker Hub (https://index.docker.io/v1/)。如果使用私有仓库,需指定其地址,如registry.example.com:5000。OPTIONS:常用选项包括-u(用户名)和-p(密码),但不建议直接在命令中输入密码,以免泄露。
示例:
# 登录到 Docker Hub(交互式输入用户名和密码)
docker login
# 登录到私有仓库
docker login registry.example.com:5000
# 使用命令行参数登录(不推荐,因为密码会留在历史记录中)
docker login -u your_username -p your_password
注意事项:
登录凭证默认存储在
~/.docker/config.json文件中。出于安全考虑,更推荐使用
--password-stdin选项从标准输入读取密码:echo "your_password" | docker login -u "your_username" --password-stdin
5.2 docker pull
简介:从镜像仓库拉取(下载)镜像或仓库到本地。这是获取和运行容器的基础。
基本用法:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
NAME:镜像名称,格式通常为[仓库地址/]用户名/仓库名。TAG:镜像标签(版本)。如果省略,默认为latest。DIGEST:镜像的数字摘要,用于精确指定某个版本的镜像,比 TAG 更唯一、安全。
示例:
# 从 Docker Hub 拉取最新的 Ubuntu 镜像
docker pull ubuntu
# 拉取指定标签的 Nginx 镜像(版本为 1.25-alpine)
docker pull nginx:1.25-alpine
# 从私有仓库拉取镜像
docker pull myregistry.com:5000/myapp:v1.0
# 通过镜像摘要拉取,确保内容绝对一致
docker pull ubuntu@sha256:abc123...
注意事项:
- 总是明确指定标签(如
:alpine,:v1.0)而非依赖默认的latest,以确保环境的一致性,通过官网中的tag复制对应仓库对应版本的镜像拉取命令是一个好习惯。
5.3 docker push
简介:将本地的镜像标签推送到镜像仓库。这是分享和部署自定义镜像的关键步骤。
基本用法:
docker push [OPTIONS] NAME[:TAG]
- 推送前,必须先用
docker tag命令将本地镜像命名为符合目标仓库规范的名称(仓库地址/用户名/仓库名:标签)。
示例:
# 1. 首先,为本地镜像打上符合仓库规范的标签
docker tag my_local_image:latest your_username/your_repo:v1.0
# 2. 然后,推送到仓库
docker push your_username/your_repo:v1.0
# 推送到私有仓库
docker push myregistry.com:5000/your_repo:v1.0
注意事项:
- 推送前必须确保已通过
docker login登录且有相应权限。 - 镜像推送是分层的操作的,如果仓库中已存在相同的层,则不会重复上传,节省时间和带宽。
5.4 docker search
简介:在 Docker Hub 或其它配置的仓库中搜索镜像。用于发现官方或社区的可用镜像。
基本用法:
docker search [OPTIONS] TERM
TERM:要搜索的关键词。OPTIONS:常用选项包括--limit(限制返回结果数量)和--filter(过滤条件,如is-official=true)。
示例:
# 搜索与 "nginx" 相关的镜像
docker search nginx
# 只显示官方镜像
docker search --filter "is-official=true" nginx
# 只显示自动化构建的镜像
docker search --filter "is-automated=true" python
# 限制返回 5 个结果
docker search --limit 5 redis
注意事项:
- 搜索结果中的
OFFICIAL标记表示是官方维护的镜像,通常更可靠。 STARS数类似于 GitHub 的点赞数,可以作为流行度和社区认可度的参考。
5.5 docker logout
简介:从指定的 Docker 镜像仓库注销,清除本地存储的登录凭证。
基本用法:
docker logout [SERVER]
SERVER:镜像仓库地址(可选)。默认为 Docker Hub。
示例:
# 从 Docker Hub 注销
docker logout
# 从私有仓库注销
docker logout registry.example.com:5000
注意事项:
- 注销操作只会删除
~/.docker/config.json文件中的对应凭证,不会影响已运行的容器。 - 在多用户系统或公共机器上操作后,及时注销是一个好习惯。
这五个命令构成了与 Docker 镜像仓库交互的核心工作流:
- 登录 (
login) → 获取权限 - 搜索 (
search) → 发现镜像 - 拉取 (
pull) → 获取镜像 - 推送 (
push) → 分享镜像 - 注销 (
logout) → 退出登录
六、镜像命令
6.1 docker images
功能
列出本地存储的 Docker 镜像。语法
docker images [OPTIONS] [REPOSITORY[:TAG]]别名
docker image ls docker image list关键参数
-a, --all:显示所有镜像(包括中间镜像层,默认情况下会过滤掉中间镜像层)--digests:显示镜像的摘要信息-f, --filter:根据条件过滤显示结果--format:使用 Go 模板格式化输出内容--no-trunc:显示完整的镜像信息(不截断输出)-q, --quiet:只显示镜像 ID
使用示例
# 列出本地所有镜像 docker images # 列出特定的镜像(ubuntu 仓库的所有版本) docker images ubuntu # 显示所有镜像(包括中间层) docker images -a # 只显示镜像ID docker images -q # 显示完整的镜像信息(不截断) docker images --no-trunc # 使用过滤器显示特定标签的镜像 docker images -f "reference=nginx:*"
6.2 docker image inspect
功能
显示镜像的详细信息,包括元数据、配置信息、层信息等。语法
docker image inspect [OPTIONS] IMAGE [IMAGE...]关键参数
-f, --format:使用给定的 Go 模板格式化输出
使用示例
# 查看指定镜像的详细信息 docker image inspect nginx:1.23.3 # 查看多个镜像的信息 docker image inspect ubuntu:22.04 alpine:latest # 使用格式输出只查看镜像的架构信息 docker image inspect -f '{{.Architecture}}' nginx:1.23.3 # 查看镜像的创建时间 docker image inspect -f '{{.Created}}' nginx:1.23.3 # 查看镜像的所有层(Layer) docker image inspect -f '{{.RootFS.Layers}}' nginx:1.23.3
6.3 docker tag
功能
为本地镜像创建新的标签,通常用于为镜像添加仓库地址前缀,为推送镜像到仓库做准备。语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]别名
docker image tag使用示例
# 为本地镜像添加新的标签 docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04 # 为镜像添加版本标签 docker tag nginx nginx:1.23.3 # 为镜像添加多个标签 docker tag myapp:latest myregistry.com/myapp:v1.0 docker tag myapp:latest myregistry.com/myapp:latest # 推送到私有仓库前的标签准备 docker tag local-image:tag your-private-registry.com/username/repository:tag注意事项
docker tag并不会创建新的镜像,只是为现有镜像添加了一个新的引用名称- 同一个镜像可以有多个标签,它们共享相同的镜像 ID
- 删除一个标签不会删除镜像本身,只有当所有标签都被删除时,镜像才会被真正删除
- 在推送镜像到仓库前,必须使用
docker tag为镜像添加包含仓库地址的完整名称
七、容器命令
7.3 docker run
功能
创建一个新的容器并运行一个命令。这是 Docker 中最常用且最重要的命令之一,用于从镜像启动容器实例。
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
别名
docker container run
关键参数详解
运行模式控制
-d, --detach:后台运行容器,并返回容器 ID。docker run -d nginx:alpine-i, --interactive:以交互模式运行容器,保持 STDIN 打开。-t, --tty:为容器分配一个伪终端。# 通常 -i 和 -t 一起使用,实现交互式终端 docker run -it ubuntu:22.04 bash
容器标识
--name:为容器指定一个名称。docker run --name my-nginx nginx:alpine-h, --hostname:指定容器的 hostname。docker run -h myhost ubuntu:22.04 # 查看容器内的 hostname root@myhost:/# hostname myhost
端口映射
-P, --publish-all:将容器暴露的所有端口随机映射到主机端口。docker run -P nginx # 映射到随机主机端口-p, --publish:指定端口映射,格式:主机端口:容器端口。docker run -p 8080:80 nginx # 主机8080 → 容器80 docker run -p 80:80 nginx # 主机80 → 容器80 docker run -p 127.0.0.1:8080:80 nginx # 仅本地访问
资源限制
--cpuset-cpus:绑定容器到指定 CPU 运行。docker run --cpuset-cpus="0-2" ubuntu # 使用0-2号CPU docker run --cpuset-cpus="0,1" ubuntu # 使用0和1号CPU-m, --memory:设置容器使用内存最大值。┌─[root@VM-16-15-debian] - [/home/ljx/docker_test/namespace_test/test_dir2] - [1590] └─[$] docker run -d -m 512m nginx:stable-alpine3.21-perl # 限制512MB内存 844e981eb908a6208d2531732444da829408f718349c27ca57c25c2eac987d85 # 查看容器资源使用情况 ┌─[root@VM-16-15-debian] - [/home/ljx/docker_test/namespace_test/test_dir2] - [1590] └─[$] docker stats 844e981eb908a6208d2531732444da829408f718349c27ca57c25c2eac987d85 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 844e981eb908 boring_mirzakhani 0.00% 2.957MiB / 512MiB 0.58% 876B / 126B 0B / 12.3kB 3
环境变量
-e, --env:设置环境变量。docker run -e MY_VAR=value ubuntu docker run -e DATABASE_URL=postgres://user:pass@host/db app
容器链接
--link:添加链接到另一个容器(已逐渐被网络功能替代)。docker run --link redis-container:redis app
容器生命周期
--rm:容器退出时自动删除容器文件系统。# 临时测试用,退出后自动清理 docker run --rm -it ubuntu:22.04 /bin/bash
使用示例
# 后台运行nginx容器,命名为web,映射端口80
docker run -d --name web -p 80:80 nginx:alpine
# 交互式运行ubuntu容器,退出后自动删除
docker run --rm -it ubuntu:22.04 /bin/bash
# 运行容器并设置环境变量
docker run -e ENV=production -e DEBUG=false myapp:latest
# 限制容器资源使用
docker run -m 512m --cpuset-cpus="0-1" resource-limited-app
# 指定主机名和端口映射
docker run -h myapp -p 8080:3000 myapp:latest
注意事项
- 如果没有指定
COMMAND,容器将运行镜像中定义的默认命令 - 使用
-d后台运行时,可以使用docker logs查看输出 --rm选项适合临时测试,生产环境通常需要持久化容器- 端口映射时确保主机端口没有被其他进程占用
- 资源限制参数有助于防止单个容器消耗过多主机资源
7.4 docker ps
功能
列出容器。这是 Docker 中最常用的监控和管理命令之一,用于查看当前容器运行状态。
语法
docker ps [OPTIONS]
别名
docker container ls
docker container list
docker container ps
关键参数详解
显示范围控制
-a, --all:显示所有容器,包括停止的容器。docker ps -a-f, --filter:根据条件过滤显示结果。docker ps -f "name=web" docker ps -f "status=running"-n, --last:显示最近创建的 n 个容器(包括所有状态)。docker ps -n 3
显示格式控制
-q, --quiet:只显示容器 ID。docker ps -q--no-trunc:显示完整信息,不截断输出。docker ps --no-trunc--format:使用 Go 模板格式化输出。docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"-s, --size:显示容器文件大小。docker ps -s
时间显示
-l, --latest:显示最近创建的容器(包括所有状态)。docker ps -l
输出列说明
执行 docker ps 后显示的表格包含以下重要列:
| 列名 | 说明 |
|---|---|
| CONTAINER ID | 容器的唯一标识符(通常显示前 12 位) |
| IMAGE | 创建容器所使用的镜像名称 |
| COMMAND | 容器启动时运行的命令 |
| CREATED | 容器创建时间 |
| STATUS | 容器状态(Up 表示运行中,Exited 表示已退出) |
| PORTS | 端口映射信息 |
| NAMES | 容器名称 |
过滤器常用用法
过滤器是 docker ps 的强大功能,支持多种过滤条件:
# 按名称过滤
docker ps -f "name=web"
# 按状态过滤
docker ps -f "status=running" # 运行中的容器
docker ps -f "status=exited" # 已停止的容器
docker ps -f "status=created" # 已创建但未运行的容器
# 按镜像过滤
docker ps -f "ancestor=nginx" # 使用nginx镜像的容器
# 按退出代码过滤
docker ps -a -f "exited=0" # 正常退出的容器
docker ps -a -f "exited=1" # 异常退出的容器
# 按标签过滤
docker ps -f "label=environment=production"
# 组合多个过滤器
docker ps -f "name=db" -f "status=running"
格式化输出示例
使用 --format 参数可以自定义输出格式:
# 只显示ID和名称
docker ps --format "table {{.ID}}\t{{.Names}}"
# 显示ID、名称、状态和端口
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
# 以JSON格式输出
docker ps --format "{{json .}}"
# 自定义表格标题
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" --format "ID\tNAME\tSTATUS"
使用示例
# 查看所有运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看最近创建的2个容器
docker ps -n 2
# 只显示运行中容器的ID
docker ps -q
# 查看名称包含"web"的容器
docker ps -f "name=web"
# 查看所有异常退出的容器
docker ps -a -f "exited=1"
# 显示容器大小信息
docker ps -s
# 自定义格式输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
实际应用场景
快速查看容器状态
# 日常监控 docker ps查找特定容器
# 查找MySQL容器 docker ps -f "name=mysql"批量操作容器
# 停止所有运行中的容器 docker stop $(docker ps -q) # 删除所有已停止的容器 docker rm $(docker ps -a -q -f "status=exited")故障排查
# 查看异常退出的容器 docker ps -a -f "exited=1"资源监控
# 查看容器占用空间 docker ps -s
注意事项
- 默认情况下
docker ps只显示运行中的容器 - 使用
-a参数可以查看所有状态的容器 - 过滤器功能非常强大,可以组合多个条件进行精确查询
- 格式化输出适合编写脚本和自动化工具
- 容器 ID 的前几个字符通常就足够唯一标识一个容器
docker ps 是 Docker 日常管理中最基础且重要的命令,熟练掌握其各种参数和用法能够极大提高容器管理效率。