Docker 搭建私有镜像仓库

一、镜像仓库简介

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240326-2-LightGBM面试题

LightGBM面试题 1. 简单介绍一下LightGBM? LightGBM是一个梯度 boosting 框架,使用基于学习算法的决策树。 它可以说是分布式的,高效的。 从 LightGBM 名字我们可以看出其是轻量级(Light)的梯度提升机(G…

从0到1实现RPC | 07a 更新pom依赖方式

当前工程目录进行编译时 mvn clean install,会报错。原因是 rpc-core和rpc-demo-api不是一个spring boot项目,没有启动类。 默认在根pom文件中引入了spring的parent,导致子模块都是web项目,所以需要更新pom文件。 在根目录的pom文…

直播系统的短视频直播源码,带有多功能后台系统的直播短视频平台 APP 源码。

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 此源码是一个直播系统,集直播、短视频等功能,根据市场趋势开发并推出思乐直播APP,APP功能丰富且可在后台管理系统进行配置,做到按需求来…

UE5、CesiumForUnreal实现建筑白模生长动画效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试3.参考资料1.实现目标 在上篇文章加载本地建筑轮廓GeoJson数据生成建筑白模的基础上,本文通过材质“顶点偏移”实现建筑白模生长效果,GIF动图如下所示: 2.实现过程 常用的实现建筑生长效果的方式有两种,…

随机潮流应对不确定性?计及分布式发电的配电系统随机潮流计算程序代码!

前言 随着分布式电源在电力系统中所占比例的不断扩大,研究分布式发电对系统稳态运行的影响势在必行。带分布式发电的潮流计算常常用来评估其并网后对系统的影响,同时它也是分析分布式发电对电网稳定性的影响等其他理论研究工作的基础。然而,许多分布式发…

Feature Pyramid Networks for object detection

FPN 总述1.引言2.相关工作3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 4. 应用用于 RPN用于 Fast R-CNN 核心代码复现FPN网络结构ResNet Bottleneck完整代码 总述 下图中,蓝色边框表示的是特征图,边框越粗表…

视频号带货真的能成为2024年赚钱的新风口吗?

随着互联网技术的飞速发展和消费者购物习惯的不断转变,视频号带货这一新兴商业模式逐渐走进大众视野。在短视频平台日益火爆的今天,很多人都在思考,视频号带货是否会成为2024年赚钱的新风口? 首先,视频号带货具备成为新风口的潜力…

【项目】棋海争锋

🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 项目介绍 WebSocket介绍 使用 项目创建 数据库设计 用户模块 登录接口 注册接口 获取用户信息接口 匹配模块 …

4.9学习总结

一.File类 (一).概述: File 类的对象代表操作系统的文件(文件、文件夹),File 类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功…

安卓四大组件——Service篇

1.作用 长时间位于后台(无界面)完成用户指定操作 1.1两类状态 (a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于sta…

7-15 计算圆周率

题目链接&#xff1a;7-15 计算圆周率 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <stdio.h>// 分子&#xff1a;阶乘 static unsigned long long int JieCheng (unsigned int n) {if (n 1) {return 1;} else {return n * JieCheng(n…

spring-cloud微服务负载均衡器ribbon

注意&#xff1a;2020年前SpringCloud是采用Ribbon作为负载均衡实现&#xff0c;但是在2020后采用了LoadBalancer替代&#xff0c;所以要查看springboot&#xff0c;springcloud&#xff0c;sprincloudalibaba的版本链接对应&#xff0c;Ribbon负载均衡都是在springboot版本2.4…

[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度

一、算法的时间和空间复杂度 文章目录 一、算法的时间和空间复杂度1、时间复杂度2、空间复杂度 二、Transformer的时间复杂度分析1、 self-attention 的时间复杂度2、 多头注意力机制的时间复杂度 三、transformer的空间复杂度 算法是指用来操作数据、解决程序问题的一组方法。…

前端二维码工具小程序使用说明书

一、产品概述 前端二维码工具小程序是一款便捷、高效、易用的二维码生成与识别工具。本产品支持根据用户输入的文本或链接生成二维码&#xff0c;同时提供扫一扫功能以识别二维码内容&#xff0c;并支持将识别到的内容复制到剪贴板。此外&#xff0c;产品还提供了美化功能&…

树状数组基础(未完结)

在学习树状数组之前&#xff0c;我们需要了解lowbit操作&#xff0c;这是一种位运算操作&#xff0c;用于计算出数学的二进制表达的最低位的1以及后面所有的0 写法&#xff1a; int lowbit(int x){return x&-x;} 这是利用了计算机存储整数的特征来写的&#xff0c;在计算…

第6章 6.1.2 格式化文本 compose函数(MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 在MATLAB中&#xff0c;存在两个不同版本的compose函数&#xf…

Spring Cloud微服务入门(五)

Sentinel的安装与使用 安装部署Sentinel 下载Sentinel&#xff1a; https://github.com/alibaba/Sentinel/releases Sentinel控制台 https://localhost:8080 用户和密码为sentinel 使用Sentinel 加依赖&#xff1a; 写配置&#xff1a; 输入&#xff1a; java -Dserver.po…

OpenHarmony南向开发实例:【智能甲醛检测机】

样例简介 本项目是基于BearPi套件开发的智能甲醛检测系统Demo&#xff0c;该设备硬件部分主要由小熊派单板套件和和甲醛检测传感器组成。智能甲醛检测系统可以通过云和手机建立连接&#xff0c;可以在手机上设置甲醛浓度阈值&#xff0c;传感器感知到的甲醛浓度超过阈值之后&a…

阿赵UE学习笔记——25、动画状态机播放

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。之前学习了用蓝图直接控制骨骼动画或者蒙太奇动画的播放。这次学习一下通过状态机来控制动画播放。如果熟悉Unity引擎使用的朋友&#xff0c;看到这个状态机应该会觉得很熟悉&#xff0c;因为…

全球变暖蓝桥杯2018省赛真题

全球变暖蓝桥杯2018省赛真题 DFS大法 全球变暖 #include <bits/stdc.h> using namespace std; #define int long long bool flag; char a[1010][1010]; int cnt,n,ans0,pre_ans0,d[4][2] {1,0,-1,0,0,1,0,-1}; void dfs(int x,int y){if(x>n||x<0||y>n||y<…