
目录一、Docker Registry镜像仓库1. 什么是镜像仓库2. 镜像仓库分类3. 镜像仓库工作机制4. 常用镜像仓库5. 镜像仓库命令二、Docker Image镜像1. 镜像是什么2. 为什么需要镜像3. 镜像命令详解三、综合实战实战一搭建 nginx 服务实战二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 和 Redhatprivate registry通过没有防火墙和额外安全层的私有实体提供仅供内部使用3. 镜像仓库工作机制使用流程通过docker login登录仓库通过docker pull拉取需要的镜像通过 Dockerfile 或docker commit等方式制作镜像后用docker push上传到仓库实际研发中的使用镜像通常由开发人员制作推送至公共或私有 Registry 保存供其他人员使用如部署到生产环境。涉及的环境概念开发环境开发人员使用、测试环境发布给测试人员测试、预发布环境模拟生产发布、生产环境面向客户。拉取机制启动容器时docker daemon 会试图从本地获取相关镜像本地镜像不存在时将从 Registry 中下载该镜像并保存到本地。4. 常用镜像仓库Docker HubDocker 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 篇。私有仓库工具工具说明HarborVMware 开源的企业级 Docker Registry 项目以 Docker registry 为基础提供管理 UI、基于角色的访问控制RBAC、AD/LDAP 集成、审计日志等功能原生支持中文。各组件以 Docker 容器形式构建使用 Docker Compose 部署NexusSonatype 发布的仓库管理软件常被用作 Maven 私服、Docker 私服Docker registryDocker 官方提供的私服类似 Docker Hub用于保存公司内部上传的 Docker 镜像5. 镜像仓库命令命令别名功能docker login登录仓库docker pulldocker image pull拉取镜像docker pushdocker image push推送镜像docker search查找镜像docker logout登出仓库命令语法与样例# 登录未指定地址默认为 Docker Hubdockerlogin-u用户名-p密码# 拉取镜像-a 拉取所有 tagged 镜像--disable-content-trust 忽略校验默认开启dockerpull nginx:1.23.3# 推送镜像需先登录dockerpush myapache:v1# 查找镜像-f stars10 表示 star 数大于 10dockersearch-fstars10nginx# 登出dockerlogout⚠️ 因 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 imagesdocker image ls/docker image list列出本地镜像docker tagdocker image tag给镜像打标签docker pulldocker image pull从镜像仓库拉取镜像docker pushdocker image push推送镜像到仓库docker rmidocker image rm/docker image remove删除本地镜像docker builddocker image build通过 Dockerfile 制作镜像docker savedocker image save将镜像保存成 tar 归档文件docker loaddocker image load导入 docker save 导出的镜像docker image inspect查看镜像详细信息docker historydocker image history查看镜像历史docker importdocker image import从归档文件创建镜像docker image prune删除不使用的镜像各命令语法与关键参数# 列出本地镜像-a 含中间层-q 只显示ID--no-trunc 显示完整信息dockerimagesdockerimages ubuntu# 打标签给镜像起别名dockertag SOURCE_IMAGE[:TAG]TARGET_IMAGE[:TAG]# 为推送镜像仓库做标签格式必须带上远程仓库地址dockertag ubuntu:22.04 myregistry.com/myubuntu:22.04# 删除镜像-f 强制删除--no-prune 不移除过程镜像dockerrmi mybusybox:v0.1# 保存镜像为 tar 文件-o 输出到文件dockersave-omynginx_1.22.1.tar nginx:1.22.1# 导入 tar 镜像-i 指定文件-q 精简输出dockerload-imynginx_1.22.1.tar# 查看镜像详细信息docker inspect 会自动检查是镜像还是容器dockerimage inspect nginx:1.23.3# 查看镜像历史-H 人可读格式--no-trunc 显示全部-q 只显示IDdockerhistorynginx:1.21.1# 从归档文件创建镜像-c 导入镜像时执行 Dockerfile 指令-m 提交说明dockerimportmy_ubuntu_v3.tar maxhou/ubuntu:v4# 删除不使用的镜像-a 删除全部不使用镜像-f 不提示dockerimage prune# 通过 Dockerfile 制作镜像-t 名称:标签-f 指定 Dockerfile 路径默认当前目录--no-cache 不用缓存dockerbuild-tmynginx:v1.三、综合实战实战一搭建 nginx 服务基础知识Web 服务器是驻留于互联网上某种类型计算机的程序可以向浏览器等客户端提供文档主要功能是提供网上信息浏览服务。Nginx是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器同时也是 IMAP/POP3/SMTP 代理服务器。Nginx 既可以作为 HTTP 服务器发布网站也可以作为反向代理实现负载均衡。正向代理 vs 反向代理正向代理代理的是客户端。如借助 VPN 访问谷歌——客户端知道目标目标不知道客户端是通过 VPN 访问的。反向代理代理的是服务器端。如在外网访问百度时请求会被转发代理到内网这个过程对客户端是透明的。传统方式安装 nginx# Ubuntuaptinstallnginx-y# CentOS配置 nginx 源后安装rpm-Uvhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm yuminstall-ynginxDocker 方式搭建 nginx# 1. 查找 nginx 镜像docker search 只能看概览看不到详细 tagdockersearch nginx# 2. 拉取指定版本镜像dockerpull nginx:1.23.3# 3. 以后台模式启动容器映射 80 端口dockerrun--namemynginx-p80:80-dnginx:1.23.3# 4. 访问 http://宿主机IP映射端口 即可看到 nginx 欢迎页实战二Docker Hub 创建私有仓库以 busybox 镜像为例BusyBox 集成了三百多个最常用 Linux 命令和工具被称为Linux 工具里的瑞士军刀仅 1M 左右演示从拉取到推送到自己的 Docker Hub 仓库的完整流程。# 1. 注册 Docker Hub 账号https://hub.docker.com/创建个人仓库# 2. 拉取 busybox 镜像dockerpull busybox# 3. 给镜像打标签格式用户名/仓库名:tagdockertag busybox:latest username/mybusybox:v0.1# 4. 推送前需先登录否则报 denied: requested access to the resource is denieddockerlogin-umaxhou# 5. 推送镜像到仓库dockerpush username/mybusybox:v0.1# 6. 登出dockerlogout实战三腾讯云创建私有仓库# 1. 注册腾讯云进入容器镜像服务创建私有仓库# 2. 登录腾讯云镜像仓库dockerlogin ccr.ccs.tencentyun.com--username100014125284# 3. 打标签并推送dockertag busybox:latest ccr.ccs.tencentyun.com/maxhou/mybusybox:v0.2dockerpush ccr.ccs.tencentyun.com/maxhou/mybusybox:v0.2# 4. 登出dockerlogoutccr.ccs.tencentyun.com共性规律不同的平台的私有仓库推送流程一致——登录 → 打标签带上仓库地址前缀→ 推送 → 登出。标签格式都是仓库地址/命名空间/仓库名:tag。四、基础镜像选择建议Q入职公司后开发镜像如何选择基础镜像A一般大型公司有自己专门的镜像制作组织会选取对应的系统版本作为基础镜像。例如华为某部门选取欧拉来制作基础镜像腾讯选择自己的 TLinux 制作基础镜像不会因 CentOS 不维护而无法使用且这些镜像一般都经过严格的安全扫描作为基础组件提供给各部门。一般的公司往往也会统一镜像的基础版本所以这个选择个人一般不用太多纠结。