Podman 部署私有镜像仓库
Podman 部署私有镜像仓库
tags: registry
文章目录
- 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.crtopenssl 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 \
-e REGISTRY_STORAGE_DELETE_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 清单提供向后兼容性。-e REGISTRY_STORAGE_DELETE_ENABLED=true
可以通过API 删除镜像-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仓库私搭并配置证书
Podman 部署私有镜像仓库相关推荐
- centos7-docker部署私有镜像仓库(docker-registry)
安装部署docker私有仓库 准备环境:安装docker 略略略略略略略略略略略略略略 搭建docker私有仓库 注:以下操作在docker镜像仓库所在服务器执行(192.168.252.18) 首先 ...
- 部署企业私有镜像仓库Harbor
私有镜像仓库有许多优点 1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可; 2)提供镜像资源利用,针对于公司内部使用的镜像, ...
- 阿里云部署Docker私有镜像仓库
一.访问阿里云容器镜像服务地址 地址:https://cr.console.aliyun.com/cn-beijing/instances 提示开通->设置密码(为Docker仓库密码) 二.选 ...
- 【Docker】registry部署docker私有镜像仓库
Docker Hub作为Docker默认官方公共镜像仓库,但是如果我们不想使用怎么办,第一我们可以替换默认镜像仓库为我们国内的一些镜像仓库,第二就是如我们自己搭建一个自己的私有镜像仓库,官方也提供do ...
- 华为云ECS-CentOS8.2部署(Harbor)Docker私有镜像仓库
华为云ECS-CentOS8.2部署(Harbor)Docker私有镜像仓库 1.背景 2.环境说明 3.在CentOs中安装所需要的软件包 4.部署Harbor 4.1.安装docker-compo ...
- pip install 镜像_pypi私有镜像仓库部署
一.pypi私有镜像仓库 pypi私有镜像仓库可由pypi-web镜像提供服务,该镜像一般运行两个容器: - pypi-web: 该容器运行web服务nginx负责为python包管理程序pip提供服 ...
- Nexus 搭建私有镜像仓库
Nexus 搭建私有镜像仓库 说明 国内网络环境下直接使用默认的 npm 下载资源过慢,所以很多文章中都建议将 npm 的 registry 切换为 淘宝的 npm 镜像,如下 npm config ...
- 一文搞定docker创建私有镜像仓库(配置启动http和https方式私有仓库服务,查询、删除私有仓库镜像)
docker除了使用公共镜像仓库之外,也可以创建私有镜像仓库.对于内部开发.测试.部署环境来说,是很有必要的. 如何创建私有镜像仓库服务呢?当然是以容器的方式啦! 1.拉取官方regis ...
- Harbor私有镜像仓库
Harbor简介 CA认证 https通过ssl的加密认证形式:要求http拥有加密认证证书才能转换成https. 私有镜像仓库需要启动https的模式 VMware的开源项目https://gith ...
最新文章
- “跟风离职后,找不到工作了!”:好多同事离职,这家公司还值不值得待?...
- nginx中的502错误
- NYOJ 215 Sum
- python如何改颜色_python和networkx:如何更改节点的颜色
- 00084_Map接口
- 如何在SAP Spartacus里捕捉感兴趣的事件
- iPhone UITableViewCell如何滚动到视图顶端。
- android studio导入eclipse项目各种问题,eclipse项目导入android studio 各类问题及解决方法...
- Javascript中Base64编码解码的使用实例
- 探索Windows Azure 监控和自动伸缩系列1 - 连接中国区Azure
- redis scala编程之创建连接
- Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
- 联想微型计算机改win7,联想win10改win7如何实现?联想电脑Win10改Win7方法详解
- 汽车电子ECU bootloader工作原理及开发要点
- matlab里mod函数什么意思,mod函数_excel中mod函数的使用方法
- Ubuntu Navicat 英文显示乱码解决方案
- 某宝滑块 x82y解决方法、x5sec
- 字符集问题的初步探讨
- 无内鬼,爬B站视频来一波
- 游戏设计/开发的出发点——追根溯源
热门文章
- HIT-ICS2022大作业(程序人生-Hello’s P2P)
- grep和egrep的区别
- 在设备上开启telnet服务
- 网络工程师教程(第一部:网络层面介绍)
- 网关、子网掩码、DNS的设置
- 过程计算机系统 pcs,科学网-对PCS(等离子体控制系统)软件基本结构的理解-章勇的博文...
- 计算机教研实训报告,2020计算机实训心得体会范文
- mysqldb mysql config_python 安装MySQLdb mysql_config not fount原因
- JSP四大作用域,九大内置对象
- jquery清空某个元素下的所有节点