【Docker 镜像仓库】

发布时间:2026/8/28 13:02:47
【Docker 镜像仓库】 Docker 镜像仓库管理指南核心概念镜像仓库是存放Docker镜像的服务器类似手机应用商店核心作用是解决镜像的共享与版本管理问题。分为两种类型公共仓库如Docker Hub存放公开镜像私有仓库企业自建存放内部镜像存储结构仓库Repository同一类镜像的集合例如nginx仓库包含不同版本的nginx镜像。标签Tag用于区分同一仓库中的不同镜像版本例如nginx:1.23、nginx:latest。镜像 ID镜像的唯一标识采用 64 位哈希值通常显示前 12 位同一标签可能在不同时间指向不同 ID 的镜像。工作流程推送push本地镜像通过docker push上传到仓库仓库会验证用户权限并存储镜像的分层数据。拉取pull通过docker pull从仓库下载镜像Docker 会根据镜像 ID 和分层结构进行增量拉取仅下载本地缺失的层。缓存机制本地 Docker 引擎会缓存拉取的镜像避免重复下载提高效率。Docker 安装、环境准备RHEL9先检查旧版本有冲突就卸载旧 docker⚠️RHEL9 系统自带podman容器工具podman 和 docker 会发生冲突必须先卸载 podman否则 docker 装不上步骤 1检查系统自带 podmanrpm -qa | grep podman从截图查到有两个包podman-4.9.4-0.1.el9.x86_64cockpit-podman-84.1-1.el9.noarch步骤 2卸载冲突的 podman必做dnf remove -y podman cockpit-podman再查一次确认删除步骤 3切换到 yum 仓库目录cd /etc/yum.repos.d/ls目录下现有redhat.repo 、rhel9.repo步骤 4更新镜像仓库新建 docker 阿里源文件vim rhel9.repo粘贴下面内容保存退出esc →输入:wq回车步骤 5清理缓存刷新仓库yum clean allyum makecache步骤 6搜索 dockerdnf search docker注意我们需要的版本复制下来步骤 7安装 docker‑ce先给docker创建一个目录作为专属存放位置cd 回到家目录进入目录开始安装刚刚搜索到的docker版本安装后久能看到包里的东西了步骤 8启动 docker开机自启systemctl start dockersystemctl enable docker提示docker 后台跑 web 服务默认不需要额外配置防火墙放行容器端口端口映射后宿主机端口对外修改 docker 启动配置、启动服务yum install -y docker-ce#这个是安装docker可以省略因为我们前面安装了 #编辑docker服务配置默认使用iptables vim /usr/lib/systemd/system/docker.service #修改ExecStart增加--iptablestrue ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock --iptablestrue #重启使生效 systemctl daemon‑reload systemctl enable --now docker docker info开启内核路由功能保障容器网络。docker 容器做端口映射后不需要额外配置防火墙即可访问 web 页面截图 nginx 欢迎页一些检查基本环境配置完成尝试一些基本操作看是否成功使用镜像这里我创建目录复制粘贴了一个文件包packages进来也称之为镜像包是别人构建好的后续需要的一些镜像都从这里抽取#查看本地镜像[rootDocker-node1 ~]# docker images本地原来虽然没有game2048.tar.gz镜像但是packages有game2048.tar.gz镜像这个包我们可以导入过来保存后直接使用查到所需镜像后保存镜像到仓库先开启docker服务再创建服务成功。docker ps查看正在运行容器看到0.0.0.0:1234-8080/tcp端口映射生效。如果本地没有镜像的·话我们也可以直接搜索——下载称之为拉取。拉取镜像有两种情况一个是在线拉取一个是离线拉取命令方式数据源条件docker pull在线拉取Docker 远程镜像仓库互联网虚拟机必须能联网网络不通就失败docker load -i xxx.tar.gz离线导入本地磁盘上 tar 压缩包别人导出好拷贝过来不需要互联网只要本地有 tar 文件1.在线镜像拉取 nginx 容器演示docker pull 镜像名​ #搜索镜像 [rootDocker-node1 ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. 20094 [OK] ​ #从镜像仓库中拉取镜像 [rootDocker-node1 ~]# docker pull busybox [rootDocker-node1 ~]# docker pull nginx:1.26-alpine docker run -d -p 80:80 nginx查看本地的镜像查看镜像信息2.离线镜像导入docker load加载离线 tar 包docker load -i mario.tar.gz- -i指定导入的镜像压缩文件- 输出 Loaded image: timinglee/mario:latest → **镜像导入成功镜像名:标签 timinglee/mario:latestdocker 读取 tar 包内部记录直接还原镜像名 timinglee/mario:latest这个名字是打包这个 tar.gz 镜像的人提前写死在 tar 包内部的docker load 只是把它读出来自动恢复。因此文件名 ≠ 镜像名磁盘文件叫 mario.tar.gz但导入后的镜像名是 timinglee/mario:latest。timinglee/mario:latest├── 仓库地址Docker Hub (docker.io)├── 命名空间tminglee用户/组织└── 镜像名marlo└── 标签latest默认3.运行容器使用镜像创建并运行容器docker run -d --name marlo -p 1234:8080 tminglee/marlo参数含义docker run创建并启动一个新容器-ddetach模式容器在后台运行不占用当前终端--name marlo给容器命名为marlo方便后续管理-p 1234:8080端口映射宿主机1234端口 → 容器8080端口tminglee/marlo指定使用的镜像名称来自Docker Hub运行后如图使用docker ps命令查看容器是否成功运行映射端口访问本地IP端口 192.168.1.200:1234打开超级马里奥网页游戏容器基本情况镜像是把容器永久保存之后的状态删除容器相关命令[rootDocker-node1 ~]# docker rm centos7 #删除停止的容器[rootDocker-node1 ~]# docker rm -f busybox #删除运行的容器[rootDocker-node1 ~]# docker container prune -f #删除所有停止的容器系统中的文件和容器中的文件传输[rootDocker-node1 ~]# docker cp test2:/leefile /mnt #把容器中的文件复制到本机 Successfully copied 1.54kB to /mnt [rootDocker-node1 ~]# docker cp /etc/fstab test2:/fstab #把本机文件复制到容器中运行容器docker run -it --name test busybox容器未创建运行前用--name指定名字为testbusybos是要使用的镜像名称再次开启由于这个容器的镜像是一个游戏程序所以此时显示已在运行再开一个窗口可以看到该容器已运行不同容器运行该命令表现不一样两张图中容器运行反应不同的核心原因在于所使用的 Docker 镜像不同镜像中包含的应用程序以及启动逻辑的差异导致了交互方式和运行表现的不同。busybox 镜像侧重于提供基础的命令行交互环境而 timinglee/mario:latest 镜像则侧重于运行特定的应用程序这里是一个 Web 服务---------------------------------------------------------------------------------------------------------------------------------容器创建后临时退出想再进去时可用该命令再次进入终端会话docker exec -it test sh原理docker exec命令用于在运行中的 Docker 容器内执行命令。-it选项是-i保持标准输入打开和-t分配一个伪终端的组合这样可以提供一个交互式的终端会话。test是容器的名称sh是要在容器内执行的命令这里是启动一个 Shell。作用通过这个命令可以进入正在运行的test容器内部并且获得一个可以交互操作的 Shell 环境方便在容器内进行各种操作比如查看文件、执行脚本等。ctrl pq原理这是一个快捷键组合在使用 docker exec -it 进入容器的交互式会话后按下 Ctrl p 然后再按下 Ctrl q可以实现退出容器但不停止容器的效果。容器会继续在后台运行。docker load -i busybox-latest.tar.gz原理docker load 命令用于从一个 tar 归档文件中加载 Docker 镜像。-i 选项用于指定输入文件这里是 busybox-latest.tar.gz。当执行这个命令时Docker 会读取这个 tar 包中的镜像数据并将其导入到本地的 Docker 镜像仓库中。作用将打包好的 Docker 镜像busybox加载到本地 Docker 环境中使其可以被用来创建和运行容器。如果需要直接删除正在运行的容器可以使用 -fforce参数强制删除docker rm -f mario1.如何把容器保存为镜像2.如何构建镜像建立构建目录编写构建文件注意拷贝的文件这里是写的相对路径要么把文件复制到该目录下要么写它的相对路径通过dockerfile生成镜像测试镜像可用性本地存在名为 lee 标签为 v1 的镜像 。之前执行 docker run -d --name checkimage lee 报错找不到 lee:latest 镜像是因为 Docker 默认找 latest 标签镜像而你本地镜像标签是 v1可以使用带有 v1 标签的镜像名来运行容器-d模式启动交互式命令sh时因缺少-it参数导致进程立即退出只能在docker ps -a中看到。如果执行命令时提示容器未运行需要先启动容器测试成功删除容器避免影响其他实验通过centos容器配置yum源在容器内部配置不影响本地仓库测试能否下载服务一键配置nginx服务先配置yum源再配置nginx[centos7]name centos7baseurl https://mirrors.aliyun.com/centos/7/os/x86_64/gpgcheck 0删除前面配置的多余的文件Ps正常情况下这些rpm包安装后会自动删除我这里没有自动删除不影响运行容器进入容器内部容器名 创建的镜像名Yum源已导入删除原有的包否则会冲突测试yum源是否成功生效退出容器实验1公共仓库操作练习目标掌握Docker Hub的镜像推送、拉取和版本管理ps公共仓库需要加速器所以我们这里就简单了解一下主要做私有仓库注册Docker Hub账号并完成本地登录docker login基于centos:7构建自定义镜像例如安装curl标记格式为用户名/custom-centos:v1FROM centos:7 RUN yum install -y curl推送镜像到Docker Hubdocker push 用户名/custom-centos:v1在另一台机器拉取镜像并验证功能docker pull 用户名/custom-centos:v1 docker run --rm 用户名/custom-centos:v1 curl --version更新镜像例如增加wget并标记为v2FROM centos:7 RUN yum install -y curl wget推送v2版本并观察仓库标签变化实验2私有仓库搭建与权限测试目标搭建Registry并测试私有镜像的隔离性在服务器A启动Registry容器启用insecure访问docker run -d -p 5000:5000 \ -v /opt/registry:/var/lib/registry \ --restartalways \ --name registry \ registry:2推送私有镜像到本地仓库docker tag centos:7 192.168.1.100:5000/secret-app:v1 docker push 192.168.1.100:5000/secret-app:v1在未配置insecure的服务器B尝试拉取预期失败docker pull 192.168.1.100:5000/secret-app:v1配置服务器B的/etc/docker/daemon.json{ insecure-registries: [192.168.1.100:5000] }重启Docker服务后重新拉取验证实验3镜像仓库迁移与备份目标理解镜像仓库的数据持久化与迁移方法停止Registry容器并备份数据目录docker stop registry tar czvf registry-backup.tar.gz /opt/registry在新服务器恢复数据mkdir -p /opt/registry tar xzvf registry-backup.tar.gz -C / docker run -d -v /opt/registry:/var/lib/registry registry:2对比迁移方式差异使用docker save导出单镜像docker save centos:7 centos7.tar docker load centos7.tar仓库迁移保留全部镜像及层changshichangshi其他知识补充Add和copy的区别案例创建四个文件并压缩COPY什么都不做原原本本的复制而ADD会帮助解压如果要在启动容器的同时自动运行指令或者是启动后而该指令与变量有关我们就要先制定变量构建的时候会显示它正在做什么CMD和ENTRYPOINT的区别案例PsCMD启动容器的同时执行命令如图启动容器成功后会输出名字lee但是如果在启动容器的同时执行另一条ls命令那么echo lee的命令会被覆盖容器此时已经启动、如果运行时不加别的命令就会输出CMD指令如果加了别的指令cmd就会被覆盖ENTRYPOINT与之相反启动容器的同时执行另一条ls命令那么echo lee的命令正常输出不会被覆盖一键删除要先删除容器进程才能删除镜像否则会报错不过其他的会删除不影响操作把未删除的删除实验出现的一些报错容器内的第一个进程必须一直处于运行的状态否则这个容器就会处于退出状态