📑 目录
- [一、Docker Registry(镜像仓库)](#一、Docker Registry(镜像仓库))
- [1. 什么是镜像仓库](#1. 什么是镜像仓库)
- [2. 镜像仓库分类](#2. 镜像仓库分类)
- [3. 镜像仓库工作机制](#3. 镜像仓库工作机制)
- [4. 常用镜像仓库](#4. 常用镜像仓库)
- [5. 镜像仓库命令](#5. 镜像仓库命令)
- [二、Docker Image(镜像)](#二、Docker Image(镜像))
- [1. 镜像是什么](#1. 镜像是什么)
- [2. 为什么需要镜像](#2. 为什么需要镜像)
- [3. 镜像命令详解](#3. 镜像命令详解)
- 三、综合实战
- [实战一:搭建 nginx 服务](#实战一:搭建 nginx 服务)
- [实战二:Docker Hub 创建私有仓库](#实战二:Docker Hub 创建私有仓库)
- 实战三:腾讯云创建私有仓库
- 实战四:阿里云创建私有仓库
- 四、基础镜像选择建议
一、Docker Registry(镜像仓库)
1. 什么是镜像仓库
镜像仓库(Docker Registry)负责存储、管理和分发镜像,并且提供登录认证能力,建立仓库的索引。其整体结构为:
- 镜像仓库(Registry) :通过 DNS 或 IP 地址确定,如
hub.docker.com。一个 Registry 中可以存在多个 Repository。 - Repository(仓库):由某特定 Docker 镜像的所有迭代版本组成。可分为"顶层仓库"和"用户仓库",用户仓库名称格式为"用户名/仓库名"。
- 镜像名称 + 标签(Tag) :如
nginx:latest,每个标签对应一个镜像。
一个容器镜像包含两部分:元数据 (由 Dockerfile 构建出来的描述文件,记录镜像有多少层、每层内容及其 checksum、可执行文件位置等)和存储数据(一个一个的 blob,真正占用空间的就是这些 blob)。
生活类比:镜像仓库像一个超市,一个 Repository 就是一个货架,货架上放的产品打的不同标签就是对应的 Tag。
2. 镜像仓库分类
按是否对外开放划分):
| 类型 | 说明 |
|---|---|
| 公有仓库 | 像阿里云、Docker Hub 等放到公有网络上,不用登录就可以下载镜像 |
| 私有仓库 | 不对外开放,往往位于私有网络,只有公司内部人员可以使用 |
按供应商和面向群体划分:
| 类型 | 说明 |
|---|---|
| sponsor(赞助)registry | 第三方的 registry,供客户和 docker 社区版使用 |
| mirror(镜像)registry | 第三方的 registry,只让客户使用,如阿里云必须注册才能使用 |
| vendor(供应商)registry | 由发布 Docker 镜像的供应商提供,如 Google 和 Redhat |
| private registry | 通过没有防火墙和额外安全层的私有实体提供,仅供内部使用 |
3. 镜像仓库工作机制
使用流程:
- 通过
docker login登录仓库 - 通过
docker pull拉取需要的镜像 - 通过 Dockerfile 或
docker commit等方式制作镜像后,用docker push上传到仓库
实际研发中的使用:镜像通常由开发人员制作,推送至公共或私有 Registry 保存,供其他人员使用(如部署到生产环境)。涉及的环境概念:开发环境(开发人员使用)、测试环境(发布给测试人员测试)、预发布环境(模拟生产发布)、生产环境(面向客户)。
拉取机制:启动容器时,docker daemon 会试图从本地获取相关镜像;本地镜像不存在时,将从 Registry 中下载该镜像并保存到本地。
4. 常用镜像仓库
Docker Hub
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与团队共享。功能包括:个人可注册私有仓库发布自己的镜像;提供镜像检索能力;提供海量官方和认证组织镜像;从 GitHub 和 Bitbucket 自动构建容器镜像并推送到 Docker Hub;支持 webhook。
在 Docker Hub 上可以浏览:镜像搜索、镜像 Tag 查找、对应版本拉取命令、镜像的大小/ID/CPU 架构查看。
国内镜像源
国内从 Docker Hub 拉取镜像有时会遇到困难,可配置镜像加速器。国内云服务商提供的加速器如:阿里云加速器、网易云加速器(https://hub-mirror.c.163.com)、百度云加速器(https://mirror.baidubce.com)。在 /etc/docker/daemon.json 中配置 registry-mirrors 后重启 Docker 即可(配置方式详见第 2 篇)。
私有仓库工具
| 工具 | 说明 |
|---|---|
| Harbor | VMware 开源的企业级 Docker Registry 项目,以 Docker registry 为基础,提供管理 UI、基于角色的访问控制(RBAC)、AD/LDAP 集成、审计日志等功能,原生支持中文。各组件以 Docker 容器形式构建,使用 Docker Compose 部署 |
| Nexus | Sonatype 发布的仓库管理软件,常被用作 Maven 私服、Docker 私服 |
| Docker registry | Docker 官方提供的私服,类似 Docker Hub,用于保存公司内部上传的 Docker 镜像 |
5. 镜像仓库命令
| 命令 | 别名 | 功能 |
|---|---|---|
docker login |
登录仓库 | |
docker pull |
docker image pull |
拉取镜像 |
docker push |
docker image push |
推送镜像 |
docker search |
查找镜像 | |
docker logout |
登出仓库 |
命令语法与样例:
bash
# 登录(未指定地址默认为 Docker Hub)
docker login -u 用户名 -p 密码
# 拉取镜像(-a 拉取所有 tagged 镜像,--disable-content-trust 忽略校验默认开启)
docker pull nginx:1.23.3
# 推送镜像(需先登录)
docker push myapache:v1
# 查找镜像(-f stars=10 表示 star 数大于 10)
docker search -f stars=10 nginx
# 登出
docker logout
⚠️ 因 Docker 网站被封,
docker login、docker search、docker logout在国内无法直接实操 Docker Hub,可用阿里云或腾讯云的镜像仓库练习。
二、Docker Image(镜像)
1. 镜像是什么
Docker image 本质上是一个 read-only 只读文件 ,包含文件系统、源码、库文件、依赖、工具等运行 application 所必须的文件。可以把它理解成一个模板,通过这个模板实例化出很多容器。
image 里面是一层层文件系统------Union FS(联合文件系统) ,可以将几层目录挂载到一起,形成一个虚拟文件系统。每一层文件系统叫做一层 layer,联合文件系统可以对每一层设置只读(readonly)、读写(readwrite)和写出(whiteout-able)三种权限,但 Docker 镜像中每一层都是只读的。
构建镜像时,从最基本的操作系统开始,每个构建操作相当于做一层的修改,一层层往上叠加,上层的修改会覆盖底层该位置的可见性。使用时只会看到一个整体,不知道里面有几层。
生活类比:
- 镜像相当于 Java 或 C++ 中的类,是一个模板,可以构建出不同的对象。
- 镜像分层像地板铺设:开发商做好地暖是一层层添加的------钢筋水泥层、保温层、采暖管、水泥层,交付时家家户户都是水泥面(不可修改,相当于镜像只读层);用户再铺设木地板或地板砖,每家选择不同(相当于容器层)。
2. 为什么需要镜像
传统部署面临云端和本地环境一致性问题,用户为每个应用打包需要繁琐的配置。Docker 镜像解决了这个问题------它把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包跟本地和测试环境用的操作系统一模一样。
Docker 最大的贡献就是定义了容器镜像的分层的存储格式,基于联合文件系统(UnionFS),文件系统是分层的,既可以充分利用共享层,又可以减少存储空间占用。
3. 镜像命令详解
镜像命令清单 (完整参数见 Docker 镜像文档):
| 命令 | 别名 | 功能 |
|---|---|---|
docker images |
docker image ls / docker image list |
列出本地镜像 |
docker tag |
docker image tag |
给镜像打标签 |
docker pull |
docker image pull |
从镜像仓库拉取镜像 |
docker push |
docker image push |
推送镜像到仓库 |
docker rmi |
docker image rm / docker image remove |
删除本地镜像 |
docker build |
docker image build |
通过 Dockerfile 制作镜像 |
docker save |
docker image save |
将镜像保存成 tar 归档文件 |
docker load |
docker image load |
导入 docker save 导出的镜像 |
docker image inspect |
查看镜像详细信息 | |
docker history |
docker image history |
查看镜像历史 |
docker import |
docker image import |
从归档文件创建镜像 |
docker image prune |
删除不使用的镜像 |
各命令语法与关键参数:
bash
# 列出本地镜像(-a 含中间层,-q 只显示ID,--no-trunc 显示完整信息)
docker images
docker images ubuntu
# 打标签(给镜像起别名)
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 为推送镜像仓库做标签,格式必须带上远程仓库地址
docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04
# 删除镜像(-f 强制删除,--no-prune 不移除过程镜像)
docker rmi mybusybox:v0.1
# 保存镜像为 tar 文件(-o 输出到文件)
docker save -o mynginx_1.22.1.tar nginx:1.22.1
# 导入 tar 镜像(-i 指定文件,-q 精简输出)
docker load -i mynginx_1.22.1.tar
# 查看镜像详细信息(docker inspect 会自动检查是镜像还是容器)
docker image inspect nginx:1.23.3
# 查看镜像历史(-H 人可读格式,--no-trunc 显示全部,-q 只显示ID)
docker history nginx:1.21.1
# 从归档文件创建镜像(-c 导入镜像时执行 Dockerfile 指令,-m 提交说明)
docker import my_ubuntu_v3.tar maxhou/ubuntu:v4
# 删除不使用的镜像(-a 删除全部不使用镜像,-f 不提示)
docker image prune
# 通过 Dockerfile 制作镜像(-t 名称:标签,-f 指定 Dockerfile 路径,默认当前目录,--no-cache 不用缓存)
docker build -t mynginx:v1 .
三、综合实战
实战一:搭建 nginx 服务
基础知识
Web 服务器是驻留于互联网上某种类型计算机的程序,可以向浏览器等客户端提供文档,主要功能是提供网上信息浏览服务。
Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器,同时也是 IMAP/POP3/SMTP 代理服务器。Nginx 既可以作为 HTTP 服务器发布网站,也可以作为反向代理实现负载均衡。
📌 正向代理 vs 反向代理:
- 正向代理代理的是客户端。如借助 VPN 访问谷歌------客户端知道目标,目标不知道客户端是通过 VPN 访问的。
- 反向代理代理的是服务器端。如在外网访问百度时,请求会被转发代理到内网,这个过程对客户端是透明的。
传统方式安装 nginx
bash
# Ubuntu
apt install nginx -y
# 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
Docker 方式搭建 nginx
bash
# 1. 查找 nginx 镜像(docker search 只能看概览,看不到详细 tag)
docker search nginx
# 2. 拉取指定版本镜像
docker pull nginx:1.23.3
# 3. 以后台模式启动容器,映射 80 端口
docker run --name mynginx -p 80:80 -d nginx:1.23.3
# 4. 访问 http://宿主机IP+映射端口 即可看到 nginx 欢迎页
实战二:Docker Hub 创建私有仓库
以 busybox 镜像为例(BusyBox 集成了三百多个最常用 Linux 命令和工具,被称为"Linux 工具里的瑞士军刀",仅 1M 左右),演示从拉取到推送到自己的 Docker Hub 仓库的完整流程。
bash
# 1. 注册 Docker Hub 账号(https://hub.docker.com/),创建个人仓库
# 2. 拉取 busybox 镜像
docker pull busybox
# 3. 给镜像打标签(格式:用户名/仓库名:tag)
docker tag busybox:latest username/mybusybox:v0.1
# 4. 推送前需先登录(否则报 denied: requested access to the resource is denied)
docker login -u maxhou
# 5. 推送镜像到仓库
docker push username/mybusybox:v0.1
# 6. 登出
docker logout
实战三:腾讯云创建私有仓库
bash
# 1. 注册腾讯云,进入容器镜像服务,创建私有仓库
# 2. 登录腾讯云镜像仓库
docker login ccr.ccs.tencentyun.com --username=100014125284
# 3. 打标签并推送
docker tag busybox:latest ccr.ccs.tencentyun.com/maxhou/mybusybox:v0.2
docker push ccr.ccs.tencentyun.com/maxhou/mybusybox:v0.2
# 4. 登出
docker logout ccr.ccs.tencentyun.com
💡 共性规律 :不同的平台的私有仓库推送流程一致------登录 → 打标签(带上仓库地址前缀)→ 推送 → 登出 。标签格式都是
仓库地址/命名空间/仓库名:tag。
四、基础镜像选择建议
Q:入职公司后开发镜像,如何选择基础镜像?
A:一般大型公司有自己专门的镜像制作组织,会选取对应的系统版本作为基础镜像。例如华为某部门选取欧拉来制作基础镜像,腾讯选择自己的 TLinux 制作基础镜像,不会因 CentOS 不维护而无法使用,且这些镜像一般都经过严格的安全扫描,作为基础组件提供给各部门。一般的公司往往也会统一镜像的基础版本,所以这个选择个人一般不用太多纠结。