Docker 搭建私有镜像仓库

news2024/12/25 12:32:17

一、镜像仓库简介

Docker的镜像仓库是一个用于存储和管理Docker镜像的中央位置。镜像仓库的主要作用是提供一个集中的地方,让用户可以上传、下载、删除和共享Docker镜像。镜像仓库又可以分为公共镜像仓库和私有仓库镜像仓库:

  • 公共镜像仓库
    Docker Hub 是 Docker 官方提供的公共镜像仓库,也是最大的 Docker 镜像仓库之一。它提供了大量的公共镜像供用户使用。只不过Docker Hub 在国内访问速度较慢,一些国内的云服务商提供了类似于 Docker Hub 且更为稳定、快速的公共镜像仓库。例如,网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。

  • 私有镜像仓库
    在某些情况下,企业或个人可能需要在私有网络或受限制的环境中使用Docker镜像。这时就可以搭建自己的私有镜像仓库来存储和共享这些镜像,同时可以使用身份验证和授权来控制访问。Docker Registry 是 Docker 提供的官方仓库服务,将 Docker Registry 部署在自己的服务器上,并通过简单的配置来实现私有仓库的搭建。

二、搭建私有镜像仓库

搭建私有镜像仓库时,一般是拉取和运行 Docker 官方提供的 Registry 镜像来实现,只不过官网没有提供图形化界面,第三方提供了图形化界面的镜像可以拉取 docker-registry-ui 这个镜像。

2.1 通过 Registry 镜像搭建基础版的私有镜像仓库

(1)首先通过docker命令来拉取registry镜像:
docker pull registry

(2)再到服务器上创建一个数据存储卷挂载到容器中的/var/lib/registry 目录,推送到私有镜像仓库的镜像都是存储到这个目录的。
mkdir -p /Users/smile/Desktop/soft/registry

(3)最后通过registry镜像启动容器。
docker run -d -p 5005:5000 -v /Users/smile/Desktop/soft/registry:/var/lib/registry registry
在这里插入图片描述

(4)容器运行成功后就可以往当前的这个私人镜像仓库里面推送和拉取镜像了。通过访问http://你的IP地址:5005/v2/_catalog可以查看当前私有镜像服务中包含的镜像,只不过这样通过registry镜像启动容器只能算的上是一个基础版本的私人镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
在这里插入图片描述

2.2 搭建有图形化界面的私有镜像仓库

要搭建有图形化界面的私有镜像仓库,其实就是在已经通过registry镜像启动容器的前提下 ,再通过docker-registry-ui 这个镜像再启动一个图形化界面容器。存储以及管理镜像还是在registry镜像启动的容器中完成,docker-registry-ui 镜像启动的容器只负责从registry镜像启动的容器中查询存储的镜像信息然后展示在页面上,所以这里通过docker-compose来同时启动这两个镜像的容器。

(1)首先拉取joxit/docker-registry-ui镜像
docker pull joxit/docker-registry-ui

(2)再到服务器上创建一个registry-ui的安装目录
mkdir -p /Users/smile/Desktop/soft/registry-ui

(3)进入到registry-ui目录,然后创建并编辑 docker-compose.yml 文件

# 进入到registry-ui目录
cd registry-ui

# 创建并编辑 docker-compose.yml 文件
vim docker-compose.yml

# docker-compose.yml文件内容
version: '3.0'   ## Docker Compose文件使用的是3版本的语法和功能
services:		## 指定要启动的服务
  registry:		## 第一个启动的服务名
    image: registry	## 第一个启动的服务使用的镜像
    volumes:  ## 指定启动服务时挂载的目录
      - /Users/smile/Desktop/soft/registry:/var/lib/registry
      - /Users/smile/Desktop/soft/registry/config.yml:/etc/docker/registry/config.yml
	ports:	## 指定启动服务时主机端口的映射
      - 5005:5000
  registry-ui:   ## 第二个启动的服务
    image: joxit/docker-registry-ui   ## 第二个启动的服务使用的镜像
    ports:  ## 指定启动服务时主机端口的映射
      - 5006:80
    environment:
      - REGISTRY_TITLE=私有仓库  
      ## 由于registry-ui启动后的容器需要访问 registry 镜像运行的容器,以便获取registry仓库中存放的镜像列表信息。
      ## 所以127.0.0.1就是对应启动registry服务的主机ip,5005就是对应启动registry服务的主机映射到容器的端口。
      - REGISTRY_URL=http://127.0.0.1:5005
    depends_on:   ## 表明 registry-ui 依赖于 registry,这样就会先启动registry
      - registry

(4)在 registry-ui 目录下运行 docker-compose 命令来执行docker-compose.yml配置文件启动容器。
docker-compose up -d
在这里插入图片描述

(5)最后打开浏览器输入 http://你的IP地址:5006 访问搭建好的 docker 私有镜像仓库的图像化页面。这里虽然页面能正常显示,但是还有两个问题需要解决
在这里插入图片描述
(6)第一个问题:默认为https,不允许http方式推送镜像。解决方式如下:

  1. centos系统:修改docker配置文件 /etc/docker/daemon.json ,在里面添加下面配置
{
  ## 配置http方式,指定启动registry镜像的主机ip+主机映射端口
  "insecure-registries": ["http://127.0.0.1:5005"]
}

我是mac系统,使用的是Docker Desktop运行的,在设置里面找到Docker Engine,在里面加上上面的配置。

  1. 修改完后重载配置和重启docker服务。
sudo systemctl daemon-reload
sudo systemctl restart docker

(7)第二个问题:docker-registry-ui 镜像启动的容器调用registry镜像启动的容器获取存储的镜像时存在跨域问题。
在这里插入图片描述
解决方法:在registry镜像启动的容器中的config.yml配置文件中添加docker-registry-ui 镜像启动的容器访问地址,允许跨域访问,一般是在启动registry镜像启动的容器时,在主机上新建一个同样的config.yml配置文件,在主机上先改好,启动时再挂载到容器中。也可以启动后再进入到容器中去改,只不过稍微复杂点。

1.先到主机上创建文件并进行编辑:
vim config.yml

2. 输入下面内容:
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
    ## 这里配registry-ui服务的主机ip+主机映射端口
    Access-Control-Allow-Origin: ['http://127.0.0.1:5006']
    Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
    Access-Control-Allow-Headers: ['Authorization', 'Accept']
    Access-Control-Max-Age: [1728000]
    Access-Control-Allow-Credentials: [true]
    Access-Control-Expose-Headers: ['Docker-Content-Digest']
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

3. 启动容器的时将这个config.yml文件挂载到容器的/etc/docker/registry/config.yml,我上面docker-compose.yml文件中启动registry容器时已经添加上去了。

做好上面这些修改好,把之前启动有问题的容器删除,重新在执行下docker-compose up -d命令重新启动这两个服务的容器。
在这里插入图片描述

三、私有仓库镜像管理

(1)首先需要使用 tag 命令重新指定要推送的镜像的标签。因为要想将服务器上的 Docker 镜像推送到刚才搭建的私有镜像仓库中,必须指定该私有镜像的仓库的ip+端口。要想在使用push命令推送镜像时同时指定要推送的私有镜像的仓库的ip+端口,就只能重新将镜像打个标签,且标签中必须带有要推送的私有镜像仓库的ip+端口。
docker tag nginx:latest 127.0.0.1:5005/nginx:latest
在这里插入图片描述

(2)使用push命令推送这个新打的tag镜像到私有仓库:
docker push 127.0.0.1:5005/nginx:latest

(3)使用pull命令拉取私有镜像仓库中的镜像:
docker pull 127.0.0.1:5005/nginx:latest

(4)删除私有仓库上传的镜像:
docker exec aff70d955cf7 rm -rf /var/lib/registry/docker/registry/v2/repositories/nginx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZStack Cloud 5.0.0正式发布——Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强四大亮点简析

近日,ZStack Cloud 5.0.0正式发布,推出了包含Vhost主存储、隔离PVLAN网络、云平台报警优化、灰度升级增强在内的一系列重要功能。云主机管理、物理机运维、密评合规、灾备服务等诸多使用场景和功能模块均有更新,为您带来更完善的平台服务、更…

OJ 进制转换 判断进制【C】

进制转换 好久没写C,太生疏了,记一下我卡住的几个点 1.C没有字符串这种数据类型,要实现读入一个未知长度的字符串比较简单的方法 建立一个一定比这个字符串长的数组,而字符串在数组中的存储是会自动以\0结尾的,所以遍…

macOS制作C/C++ app

C/C制作macOS .app 一、 .app APP其实是一个文件夹结构,只不过mac的界面中让它看起来像一个单独的文件。 在shell终端或者右键查看包结构即可看到APP的目录结构。 通常的app目录结构如下: _CodeSignature, CodeResources 一般为Mac APP Store上架程序…

三极管结构难?——秒了

前边我们已经学完了PN结,二极管,在分析了二极管后,我们对这些东西有了一定深度的了解,但是只给我们一个二极管去研究,这玩意好像真的没啥大用,其实我们追求的是用半导体材料去代替电子管的放大作用&#xf…

51单片机入门_江协科技_21.2_74HC595 在Proteus中模拟8x8点阵屏环境搭建

1. 为了在proteus中模拟学习江协科技51单片机教程,需要在proteus中搭建74HC595驱动8x8点阵屏的仿真环境; 1.1. 因为连接单片机P0口作为点阵屏负极(行选),所以需要先在P0口上接上上拉电阻RESPACK 8,1k欧姆阻…

K8S哲学 - kubectl

Kubectl is the Kubernetes cli version of a swiss army knife, and can do many things. Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit k8s production-ready. 概念 kubectl 和 Kubernetes API 区别

【前端】学习路线

1、基础 1.1 HTML 菜鸟教程-主页:https://www.runoob.com/ 可以学习:HTML、CSS、Bootstrap等 1.2 CSS 《通用 CSS 笔记、建议与指导》 1.3 JavaScript 1)入门:JavaScript 的基本语法 2)进阶:现代 …

react-静态组件,动态组件

react09- 组件 静态组件 动态组件 静态组件: 函数组件,在第一次渲染完成后,组件中的内容,不会根据组件内的某些操作再次进行更新,页面并不会跟着改变 过程: 第一次渲染时,执行函数方法&#x…

二、Docker部署Jenckins(详细步骤)

Docker部署Jenckins、初始化(详细步骤) 一、拉取镜像二、启动Jenkins三、访问Jenkins四、安装插件1.配置源2.插件安装 一、拉取镜像 docker安装教程:https://qingsi.blog.csdn.net/article/details/131270071 - 查询镜像 docker search jen…

【配电网故障定位】基于二进制蝗虫优化算法的配电网故障定位 12节点配电系统故障定位【Matlab代码#75】

文章目录 【获取资源请见文章第5节:资源获取】1. 配电网故障定位2. 二进制蝗虫优化算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 配电网故障定位 配电系统故障定位,即在配电网络发生故障的时候&am…

python基础——python包【创建和导入,下载第三方包】

📝前言: 在上一篇文章python基础——模块中,我们讲解了有关python模块的相关知识,这篇文章我们进一步讲解用于储存多个模块文件的python包: 1,什么是python包 2,如何创建和导入python包 3&#…

Windows系统上运行appium连接iOS真机自动化测试

步骤: 1、windows安装tidevice工具 2、Mac系统打包安装WebDriverAgent(WDA)工具 3、安装Appium 4、连接iOS手机 iOS自动化的实现和执行都依赖Mac系统,因为需要通过Xcodebuild编译安装WDA (WebDriverAgent)到iOS设备中,通过WDA实现对被测应用进行操作。而Windows系统无…

【LAMMPS学习】八、基本知识的讨论(1.8)键的断裂

8. 基本知识的讨论 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和…

FreeRtos入门-10 裸机程序的不足

裸机的程序的框架 1) 经典单片机程序 // 经典单片机程序 void main() {while (1){任务1();任务2();} } 缺点:任务1和任务2之间的互相影响 2)前后台结构,前台:中断处理函数,后台main函数 void main()//后…

【oracle数据库安装篇一】Linux5.6基于LVM安装oracle10gR2单机

说明 本篇文章主要介绍了Linux5.6基于LVM安装oracle10gR2单机的配置过程,比较详细,基本上每一个配置部分的步骤都提供了完整的脚本,安装部分都提供了简单的说明和截图,帮助你100%安装成功oracle数据库。 安装过程有不明白的地方…

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA(Visual Basic for Applications) 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…

Input DropDown 拼接成 select组件(基于antd和react)

前言:为什么不直接用select,还要舍近求远搞inputdropdown这种缝合怪,是因为antd的select不支持选中项再编辑,效果如图 选中的closed文案变成了placeholder不能再编辑了 封装此组件虽然比较简单,但还是有弊端的&#x…

低代码ARM计算机在IIoT中的采集控制生产面板

工业4.0的大潮下工业物联网(IIoT)已成为推动制造业转型升级的重要动力。其中,低代码ARM嵌入式计算机凭借其出色的性能、灵活的配置以及高度集成化的特点,在工业设备远程监控、维护与诊断方面发挥着关键作用。 一、远程监控与维护 …

基于javassmJSP的教学质量评价系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

2024 抖音欢笑中国年(三):编辑器技巧与实践

前言 本次春节活动中,我们大部分场景使用内部的 SAR Creator互动方案来实现。 SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案,目前支持了Web和字节内部跨端框架平台,服务于字节内部的各种互动业务,包括但不限…