Podman 部署私有镜像仓库

news2025/1/17 5:53:25

Podman 部署私有镜像仓库

文章目录

  • Podman 部署私有镜像仓库
    • 1. 安装 Podman 和 httpd-tools
    • 2. 配置仓库存储位置
    • 3. 生成访问仓库的凭据
      • 3.1 htpasswd 用户名和密码
      • 3.2 TLS 密钥对
    • 4. 启动容器
    • 5. 测试
      • 5.1 登陆
      • 5.2 API访问
      • 5.3 镜像入库
      • 5.4 查询镜像信息

Podman是一个无守护进程的开源 Linux 原生工具,旨在使用开放容器倡议 ( OCI )容器和容器映像轻松查找、运行、构建、共享和部署应用程序。主要是由RedHat推动改进。

关于了解 Podman 更多内容:

  • Podman 下一代 Linux 容器工具
  • Podman 入门指南

1. 安装 Podman 和 httpd-tools

yum install -y podman httpd-tools

2. 配置仓库存储位置

存储目录为 /opt/registry/

mkdir -p /opt/registry/{auth,certs,data}
  • Auth子目录存储htpasswd用于身份验证的文件。
  • Certs子目录存储仓库使用的证书验证。
  • Data目录存储存储在仓库中的实际镜像。

如果你想单独挂载一块盘来存储数据可以利用parted命令

sudo parted -s -a optimal -- /dev/sdb mklabel gpt
sudo parted -s -a optimal -- /dev/sdb  mkpart primary 0% 100%
sudo parted -s -- /dev/sdb  align-check optimal 1
sudo pvcreate /dev/sdb1
sudo vgcreate vg0 /dev/sdb1
sudo lvcreate -n registry -l +100%FREE vg0
sudo mkfs.xfs /dev/vg0/registry
echo "/dev/vg0/registry /opt/registry/data xfs defaults 0 0" | sudo tee -a /etc/fstab

挂载验证

$ sudo mount -a
$ df -hT  /opt/registry/data
Filesystem             Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg0-registry xfs   200G  1.5G  199G   1% /opt/registry/data

3. 生成访问仓库的凭据

3.1 htpasswd 用户名和密码

身份验证由一个简单的htpasswd文件和一个 SSL 密钥对提供

htpasswd将在该/opt/registry/auth/目录中创建一个名为 Bcrypt Htpasswd 的文件

htpasswd -bBc /opt/registry/auth/htpasswd registryuser  registryuserpassword
  • b通过命令提供密码。
  • B使用 Bcrypt 加密存储密码。
  • c创建文件。
  • 用户名为 registryuser。
  • 密码是 registryuserpassword。

查看文件

$ tac /opt/registry/auth/htpasswd
registryuser:$2y$05$XciI1wfzkUETe7XazJfc/uftBnMQfYOV1jOnbV/QOXw/SXhmLsApK

3.2 TLS 密钥对

通过使用由可信机构(内部或外部)签名的密钥和证书或简单的自签名证书,仓库通过 TLS 得到保护。要使用自签名证书:

cat << EOF > ssl.conf
[ req ]
prompt             = no
distinguished_name = req_subj
x509_extensions    = x509_ext

[ req_subj ]
CN = Localhost

[ x509_ext ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:true
subjectAltName         = @alternate_names

[ alternate_names ]
DNS.1 = localhost
IP.1  = 192.168.10.80
EOF

openssl req -config ssl.conf -new -x509 -nodes -sha256 -days 365 -newkey rsa:4096 -keyout /opt/registry/certs/domain.key -out /opt/registry/certs/domain.crt

openssl x509 -inform PEM -in /opt/registry/certs/domain.crt -out /opt/registry/certs/domain.cert
  • req OpenSSL 生成和处理证书请求。
  • -newkey OpenSSL 创建一个新的私钥和匹配的证书请求。
  • rsa:4096 OpenSSL 生成一个 4096 位的 RSA 密钥。
  • -nodes OpenSSL 私钥没有密码要求。私钥不会被加密。
  • -sha256 OpenSSL 使用 sha256 来签署请求。
  • -keyout OpenSSL 存储新密钥的名称和位置。
  • -x509 OpenSSL 生成一个自签名证书。
  • -days OpenSSL 密钥对有效的天数。
  • -out OpenSSL 在哪里存储证书。

输入证书的相应选项。CN=值是您的主机的主机名。主机的主机名应该可由 DNS 或/etc/hosts文件解析。

$ ll /opt/registry/certs/
total 12
-rw-r--r-- 1 root root 1842 Nov 21 20:01 domain.cert
-rw-r--r-- 1 root root 1842 Nov 21 20:01 domain.crt
-rw------- 1 root root 3272 Nov 21 20:01 domain.key

将服务器证书、密钥和 CA 文件复制到 podman证书文件夹中。您必须首先创建适当的文件夹

mkdir -p /etc/containers/certs.d/192.168.10.80\:5000/
cp -r /opt/registry/certs/* /etc/containers/certs.d/192.168.10.80\:5000/

注意:如果仓库未使用 TLS 保护,则/etc/containers/registries.conf可能必须为仓库配置文件中的不安全设置。

该证书还必须得到您的主机和客户端的信任:

cp /opt/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
trust list | grep -i "<hostname>"

4. 启动容器

$ podman images
REPOSITORY                  TAG         IMAGE ID      CREATED     SIZE
docker.io/library/registry  latest      81c944c2288b  9 days ago  24.7 MB


podman run --name myregistry \
-p 5000:5000 \
-v /opt/registry/data:/var/lib/registry:z \
-v /opt/registry/auth:/auth:z \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v /opt/registry/certs:/certs:z \
-e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt" \
-e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key" \
-e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true \
-d \
docker.io/library/registry:latest

选项的详细信息是:

  • --name myregistry将容器命名为myregistry
  • -p 5000:5000将容器中的端口 5000 公开为主机上的端口 5000。
  • -v /opt/registry/data:/var/lib/registry:z像 在具有正确 SELinux 上下文的容器中一样安装/opt/registry/data 在主机/var/lib/registry
  • -v /opt/registry/auth:/auth:z/opt/registry/auth在主机上安装,就像/auth 在具有正确 SELinux 上下文的容器中一样。
  • -v opt/registry/certs:/certs:z像 在具有正确 SELinux 上下文的容器中一样安装/opt/registry/certs 在主机上 。/certs
  • -e "REGISTRY_AUTH=htpasswd" 使用bcrypt加密htpasswd文件进行身份验证。由容器的 REGISTRY_AUTH_HTPASSWD_PATH 环境变量设置的文件位置。
  • -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 指定用于htpasswd.
  • -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd使用容器中的 bcrypt 加密/auth/htpasswd 文件。
  • -e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt"设置证书文件的路径。
  • -e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key"设置私钥路径。
  • -e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true为 schema1 清单提供向后兼容性。
  • -d docker.io/library/registry:latest是一个允许存储和分发镜像的仓库应用程序。

注意:如果防火墙在主机上运行,​​则需要允许暴露的端口 (5000)。

firewall-cmd --add-port=5000/tcp --zone=internal --permanent
firewall-cmd --add-port=5000/tcp --zone=public --permanent
firewall-cmd --reload

或者直接关闭

systemctl stop firewalld && systemctl disable firewalld
setenforce 0

5. 测试

5.1 登陆

docker login -u registryuser -p registryuserpassword 192.168.10.80:5000
Login Succeeded!

5.2 API访问

$ curl  -k -u "registryuser:registryuserpassword" https://192.168.10.80:5000/v2/_catalog
{"repositories":[]}
  • 更多API 访问策略请参考这里

5.3 镜像入库

从公共拉取alpine:latest镜像

$ podman pull alpine:latest
Resolved "alpine" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob ca7dd9ec2225 [--------------------------------------] 0.0b / 0.0b
Copying config bfe296a525 done
Writing manifest to image destination
Storing signatures
bfe296a525011f7eb76075d688c681ca4feaad5afe3b142b36e30f1a171dc99a

打标签

podman tag alpine:latest 192.168.10.80:5000/alpine:latest

推送入库

podman push 192.168.10.80:5000/alpine:latest

5.4 查询镜像信息

查询是否入库

$ curl  -k -u "registryuser:registryuserpassword" https://192.168.10.80:5000/v2/_catalog
{"repositories":["alpine"]}

查看镜像标签

$  curl  -k -u "registryuser:registryuserpassword" https://192.168.10.80:5000/v2/alpine/tags/list
{"name":"alpine","tags":["latest"]}

查看镜像 manifests

$ curl  -k -u "registryuser:registryuserpassword"https://192.168.10.80:5000/v2/alpine/manifests/latest
{
   "schemaVersion": 1,
   "name": "alpine",
   "tag": "latest",
   "architecture": "amd64",
   "fsLayers": [
      {
         "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
      },
      {
         "blobSum": "sha256:60f8044dac9f779802600470f375c7ca7a8f7ad50e05b0ceb9e3b336fa5e7ad3"
      }
   ],
   "history": [
      {
         "v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\"],\"Image\":\"sha256:18f412e359de0426344f4fe1151796e2d9dc121b01d737e953f043a10464d0b7\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"container\":\"3cd2ce612b9119be9673860022420eee020f0a6d44e9072ca25196f4f0a4613d\",\"container_config\":{\"Hostname\":\"3cd2ce612b91\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) \",\"CMD [\\\"/bin/sh\\\"]\"],\"Image\":\"sha256:18f412e359de0426344f4fe1151796e2d9dc121b01d737e953f043a10464d0b7\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"created\":\"2022-11-12T04:19:23.199716539Z\",\"docker_version\":\"20.10.12\",\"id\":\"260323e12fa2abcb1ff61576931037c6f8538afeb5ff82fa256670a20b384b6b\",\"os\":\"linux\",\"parent\":\"faa2cddd53c99ad978614b839a2a20a47f143a4d6ecb86bda576dfb3124c0cad\",\"throwaway\":true}"
      },
      {
         "v1Compatibility": "{\"id\":\"faa2cddd53c99ad978614b839a2a20a47f143a4d6ecb86bda576dfb3124c0cad\",\"created\":\"2022-11-12T04:19:23.05154209Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:ceeb6e8632fafc657116cbf3afbd522185a16963230b57881073dad22eb0e1a3 in / \"]}}"
      }
   ],
   "signatures": [
      {
         "header": {
            "jwk": {
               "crv": "P-256",
               "kid": "5BQE:5CXW:TWNN:OFV7:ZPNY:ARAG:ZJ7K:Z5GI:ZVQ3:SZYQ:2M3J:D7YG",
               "kty": "EC",
               "x": "-JvBdARI6NPMx8g6d1zyPzmSkkZ8rKIcxdz2BEonpzU",
               "y": "4OlY36zLCvLHXzMrb4w8W2TZSJdVc5ijM0Y9DieEkWY"
            },
            "alg": "ES256"
         },
         "signature": "ZL0HFyuq9G9cYsBzZZqMlwGK3aQMJHFKeQ2Dh8XByzGKtfoJCJ5kQY0W3yynzb3Mj9WYrzeabZwey-dZIHt_7Q",
         "protected": "eyJmb3JtYXRMZW5ndGgiOjIwODgsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMi0xMS0yMVQxMjoyNjowM1oifQ"
      }
   ]
}

参考:

  • How to implement a simple personal/private Linux container image registry for internal use
  • docker registry仓库私搭并配置证书

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

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

相关文章

JavaScript基础(14)_in、hasOwnProperty、instanceof的用法、垃圾回收

in 用法&#xff1a;检查对象和原型对象是否含有该属性。 语法&#xff1a;"属性名" in 对象名 hasOwnProperty 用法&#xff1a;检查对象自身是否含有该属性。 语法&#xff1a;对象名.hasOwnProperty("属性名") instanceof 用法&#xff1a;检查一个对…

在裸机上输出Hello,world! [rCore-lab1]

引言 非常简单的“Hello, world”应用程序,实际上有着多层硬件和软件工具和支撑环境隐藏在它背后&#xff0c;才让我们不必付出那么多努力就能够创造出功能强大的应用程序。生成应用程序二进制执行代码所依赖的是以 编译器 为主的开发环境&#xff1b;运行应用程序执行码所依赖…

寻找更好的分类模型loss

寻找更好的loss1.CE loss并不完美2.可能更好的loss函数2.1 CC-LOSS2.2 Center-LOSS参考文献1.CE loss并不完美 最常用于深度学习分类模型的损失函数可以说就是CE(交叉熵) loss了。正如CC-LOSS paper中所述&#xff0c;该loss更关注各类是否separated&#xff0c;而非不同类之间…

Zookeeper:实现“通知协调”的 Demo

应用配置集中到节点上&#xff0c;应用启动时主动获取&#xff0c;并在节点上注册一个 watcher&#xff0c;每次配置更新都会通知到应用。数据发布/订阅&#xff08;Publish/Subscribe&#xff09;系统&#xff0c;即所谓的配置中心&#xff0c;顾名思义就是发布者将数据发布到…

[机器翻译]——pivot-based zero-shot translation based on fairseq

文章目录前言翻译到en生成"伪"的、到英语的数据文件把每一个zs语言对翻译到en从fairseq-generate生成的文件中&#xff0c;抽取纯en文件把en数据和所有zs语言对的tgt数据形成平行语料&#xff0c;然后做预处理形成en到tgt的平行语料预处理在en到tgt语言的"伪&qu…

IMC附录A

目录 A.1 恒等式与不等式 THEOREM A.1 (Binomial expansion theorem) PROPOSITION A.2 PROPOSITION A.3 PROPOSITION A.4 A.2 渐进符号 DEFINITION A.5 A.3 概率论基础 PROPOSITION A.7 (Union Bound) THEOREM A.8 (Bayes’ Theorem) PROPOSITION A.9 PROPOSITI…

图扑 Web SCADA 零代码组态水泥生产工艺流程 HMI

水泥是建筑工业三大基本材料之一&#xff0c;素有“建筑工业的粮食”之称。2022 年 1-9 月水泥产量为 15.63 亿吨&#xff0c;生产方法包括新型干法、立窑、湿窑、干法中空窑和立波尔窑等。 水泥生产线链条长、关键环节多的特性要求执行严密的流程监控。图扑软件大屏组态、UI 组…

国内家具行业数据浅析

大家好&#xff0c;这里是小安说网控。 家具是国民消费必需品之一&#xff0c;受疫情影响&#xff0c;近期销量数据不佳。2022年上半年&#xff0c;规模以上家具制造业企业营业收入3604亿元&#xff0c;同比下降4%&#xff1b;实现利润总额174.8亿元&#xff0c;同比增长2.6%。…

数据结构排序算法之冒泡排序

一 相关概念 稳定排序&#xff1a;如果原数据中a在b之前&#xff0c;而且ab&#xff0c;排序后a任然在b之前 不稳定排序&#xff1a;如果原数据中a在b之前&#xff0c;而且ab&#xff0c;排序后a在b之后 时间复杂度&#xff1a;对排序数据的总的操作次数&#xff0c;反映当n变…

安装Ruby和安装Rails详细步骤详解

rbenv安装Ruby rbenv可以管理多个版本的ruby。可以分为3种范围(或者说不同生效作用域)的版本&#xff1a; local版&#xff1a;本地&#xff0c;针对各项目范围(只在某个目录下有效) global版&#xff1a;全局&#xff0c;没有shell和local版时使用global版 shell版&#xf…

[MySQL]-删库后恢复

[MySQL]-删库后恢复 sen格 | 2022年11月 本文旨在记录个人在数据库的删库恢复演练过程中的一些总结&#xff0c;如有不足&#xff0c;欢迎指正。 一、恢复场景 1&#xff09;假设生产实例MySQL端口为&#xff1a;3306 2&#xff09;本地实例MySQL端口为&#xff1a;3307 在这…

pytorch快速入门

文章目录一、Tensorstensors的初始化(四种):tensors的属性和numpy的联系二、数据集的数据加载器加载数据集标号和可视化自己创建数据集用DataLoaders准备数据用于训练Transforms三、神经网络准备训练设备定义网络的类模型的layersnn.Flattennn.Linearnn.ReLUnn.Sequentialnn.So…

Python之基本扩展模块

一、datetime模块 1.1 主要的模块 datetime.date() #处理日期&#xff08;年、月、日&#xff09; datetime.time() #处理时间&#xff08;时、分、秒和毫秒&#xff09; datetime.datetime() #处理日期时间 datetime.timedelta() #处理时段&#xff08;时间间隔…

基于Java+springboot+SSM的医疗报销系统的设计与实现

项目开发工具: IDEA, MYSQL, JDK1.8 项目使用技术: SpringBoot, SSM, H-UI, JSP, JQUERY, HTML 医疗报销系统【功能列表】 【前台用户】登录,注册,首页新闻轮播图,首页新闻按分类展示列表,栏目分类模块,报销流程模块,修改密码,个人信息展示,新增家庭成员, 家庭成品列表展示,…

Spring框架教程

Spring框架教程Spring框架教程1. 前言2. Spring框架概述2.1 什么是spring?2.2 Spring有哪些优点&#xff1f;2.3 Spring 有两个核心部分&#xff1a;IoC 和AOP2.4 Spring 特点2.5 Spring架构图&#xff0c;Spring由哪些模块组成&#xff1f;3. IOC容器3.1 IOC底层原理3.2 什么…

three.js初时基础

第一步&#xff1a;找到Three.js – JavaScript 3D Library (threejs.org) 第二步 第三步: 第四步&#xff1a; 安装依赖 第五步&#xff1a;新建一个项目文件&#xff0c;在文件中npm init 进行初始化出现一个package.json 第六步&#xff1a;配置安装&#x1f680; 快速开…

QtAV环境配置

本文章主要是使用MSVC编译器&#xff0c;因为QtAV是依赖FFmpeg的&#xff0c;所以需要下载QtAV源码和QtAV-depends-windows-x86x64&#xff1b; 官网地址&#xff1a;http://www.qtav.org/ Github 地址&#xff1a;https://github.com/wang-bin/QtAV 1&#xff0c;解压 将文件…

产品生命周期(PLM)发展历程及技术核心分析指导

产品生命周期管理(Product Lifecycle Management&#xff0c;简称PLM)&#xff0c;是一种为企业产品全生命周期提供服务的软件解决方案&#xff0c;可以应用于在单一地点或分散在多个地点的企业内部&#xff0c;以及在产品研发领域&#xff0c;具有协作关系的企业之间&#xff…

windows 锁屏时执行某个程序

目录 前言 1 打开锁屏事件 2 创建任务计划程序 3 测试 前言 以windows10为例&#xff0c;这个功能的核心是使用windows自带的“任务计划程序”&#xff0c;可以帮助您实现触发器操作。 1 打开锁屏事件 默认情况下&#xff0c;锁屏事件并不会被系统记录&#xff0c;需要手动打…

vue3项目的创建、入口文件、全局方法、生命周期函数、setup中的生命周期函数使用、data的函数方式

文章目录1. 创建vue3项目1.1 基于webpack的工程创建1.2 通过vite来创建vue3项目vue3插件推荐1.3 通过npm init vue3创建项目2. vue3入口文件3. vue3中的全局方法修改4. vue3中封装全局方法5. vue3生命周期函数6. setup中生命周期使用7. data函数方式1. 创建vue3项目 1.1 基于w…