【Docker】Docker 镜像仓库
时间:2024-04-04 08:45:52 来源:网络cs 作者:康由 栏目:防关联工具 阅读:
💫3.4 仓库 Registry
3.4.1 基本概念
是什么?
镜像仓库:用于管理 Docker 的镜像
为什么需要?
快速交付:当应用开发完成后,直接打包为一个镜像,将镜像上传到仓库后,可以在任何装有 Docker 的机器上下载该镜像,并运行为一个容器便于镜像的重复利用能干什么?
实现快速交付,可以更方便在其他机器上下载镜像运行容器可以存储公司内部私有镜像,避免暴露到外网提升镜像下载速度3.4.2 常见的仓库
3.4.2.1 Docker Hub
官方站点:https://hub.docker.com
3.4.2.2 Aliyun
阿里云镜像仓库
3.4.2.2.1 本地镜像发布到阿里云流程
3.4.2.2.2 镜像的生成方法
基于当前容器创建一个新的镜像,新功能增强$ docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
使用 Dockerfile 文件 3.4.2.2.3 将本地镜像推送到阿里云
本地镜像素材原型$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmyubuntu v1.0 a8375a7783cc 9 hours ago 174MB
阿里云开发者平台 https://promotion.aliyun.com/ntms/act/kubernetes.html
创建仓库镜像 选择控制台,进入容器镜像服务选择个人实例命名空间仓库名称进入管理界面获取脚本 将镜像推送到阿里云 将继续推送到阿里云 registry
管理界面脚本 脚本实例# 1. 登录阿里云Docker Registry$ docker login --username=kubedragonzw registry.cn-shenzhen.aliyuncs.com用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码# 3. 将镜像推送到Registry$ docker login --username=kubedragonzw registry.cn-shenzhen.aliyuncs.com$ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:[镜像版本号]$ docker push registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:[镜像版本号]# docker tag myubuntu:v1.0 registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/myubuntu:v1.0# docker push registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/myubuntu:v1.0请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
3.4.2.2.4 将阿里云上的镜像下载到本地
# 3. 从Registry中拉取镜像$ docker pull registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/ubuntu:[镜像版本号]~ docker pull registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/ubuntu:1.0~ docker history registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/ubuntu:1.0IMAGE CREATED CREATED BY SIZE COMMENTe3587595bab1 44 minutes ago /bin/bash 105MB 添加VIM软件<missing> 9 months ago /bin/sh -c #(nop) CMD ["bash"] 0B<missing> 9 months ago /bin/sh -c #(nop) ADD file:5d68d27cc15a80653… 72.8MB~ docker run -itd --name au1 registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/ubuntu:1.0 /bin/bash~ docker exec -it au1 /bin/bashroot@10dc9cc87e81:/# vim --versionVIM - Vi IMproved 8.1 (2018 May 18, compiled Feb 01 2022 09:16:32)# docker pull docker push registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:[镜像版本号]# 拉取镜像$ docker pull registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:v2.0# 查看镜像的历史记录$ docker history registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:v2.0IMAGE CREATED CREATED BY SIZE COMMENT7e52ca924574 3 hours ago nginx -g daemon off; 1.23kB nginx container<missing> 16 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B<missing> 16 months ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B<missing> 16 months ago /bin/sh -c #(nop) EXPOSE 80 0B<missing> 16 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B<missing> 16 months ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB<missing> 16 months ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB<missing> 16 months ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB<missing> 16 months ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB<missing> 16 months ago /bin/sh -c set -x && addgroup --system -… 61.1MB<missing> 16 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B<missing> 16 months ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.1 0B<missing> 16 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.5 0B<missing> 16 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B<missing> 16 months ago /bin/sh -c #(nop) CMD ["bash"] 0B<missing> 16 months ago /bin/sh -c #(nop) ADD file:09675d11695f65c55… 80.4MB# 将镜像运行成容器$ docker run -it --name nginx-demo -d -P registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:v2.0$ docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESaf6fcf5626c1 registry.cn-shenzhen.aliyuncs.com/dragonzw_personal_images/nginx:v2.0 "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:32770->80/tcp nginx-demo$ curl 127.0.0.1:32770<h1>Welcome to My Nginx ...</h1>
🌈3.4.2.3 自主搭建(私服仓库)
💫3.4.2.3.1 Nexus 的简介和搭建
Nexus
Nexus 是一个强大的 Maven 仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用 Nexus 你可以只在一个地方就能够完全控制访问 和部署在你所维护仓库中的每个 Artifact。Nexus 是一套 “开箱即用” 的系统不需要数据库,它使用文件系统加 Lucene 来组织数据。Nexus 使用 ExtJS 来开发界面,利用 Restlet 来提供完整的 REST APIs,通过 m2eclipse 与 Eclipse 集成使用。Nexus 支持 WebDAV 与 LDAP 安全身份认证。
# 创建持久化目录$ mkdir -p /opt/docker/nexus# 开放权限$ chmod 777 -R /opt/docker# 启动 nexus 容器# 5000 数据上传容器内的端口 5001 是进行仓库拉取镜像的端口$ docker run -d --restart=always \ -p 10880:8081 -p 5000:5000 -p 5001:5001 \ --name nexus \ -v /opt/docker/nexus:/nexus-data \ sonatype/nexus3# nexus 第一次启动会比较慢,需要一定时间进行初始化过程$ docker logs -f -n 200 nexus# 查看默认密码$ docker exec -it nexus cat /nexus-data/admin.passwordd775567d-c1b5-492b-a481-96f011d80415
右上角点击"Sign in"进行登录。用户名:admin/密码:d775567d-c1b5-492b-a481-96f011d80415[需要查看文件得到]
根据向导进行配置即可。 maven-pulibc 是一个分组,所有的访问都可以从 maven-pulibc 进行访问maven-release 是发布后的 jar 包(即测试通过后的 jar 包)maven-snapshots 是测试代码存放的位置maven-central 是一个只读的位置,是一个代理,可以将请求发送到配置阿里云镜像仓库 Type 类型:
hosted 会把代码数据提交上来并保存在私服仓库的本地proxy 是连接远程的 Maven 仓库,访问远程的代理group 是将创建的 Repository 仓库进行聚合在一起创建存储器
创建 Docker 仓库
创建 docker(hosted) 仓库 创建 docker(proxy) 代理仓库[ 配置好代理地址即可创建主机 ] 创建 docker(group) 分组💫3.4.2.3.2 Nexus 的使用
修改Docker 配置文件
# 在Docker机制中,默认除Docker认证服务以外的其他非https协议直接禁用# 5000 数据上传容器内的端口 5001 是进行仓库拉取镜像的端口$ vim /etc/docker/daemon.json{ "registry-mirrors": ["https://po13h3y1.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","http://f1361db2.m.daocloud.io"], "insecure-registries": ["http://10.0.0.30:5000","http://10.0.0.30:5001"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2"}# 重启 Docker 服务$ systemctl daemon-reload && systemctl restart docker# 查看 Nexus 容器的状态$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2decf8b528ae sonatype/nexus3 "sh -c ${SONATYPE_DI…" 41 minutes ago Up 11 seconds 0.0.0.0:5000-5001->5000-5001/tcp, 0.0.0.0:10880->8081/tcp nexus# 查看容器的日志$ docker logs nexus# 使用 Nexus 账号和密码进行登录$ docker login --username admin --password Admin@h3c 10.0.0.30:5000WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
Nexus 完成镜像管理命令
推送镜像
$ docker pull alpine:latest# 拉取镜像并推送镜像到Nexus的仓库$ docker tag alpine:latest 10.0.0.30:5000/alpine:v1.0.0$ docker push 10.0.0.30:5000/alpine:v1.0.0The push refers to repository [10.0.0.30:5000/alpine]8d3ac3489996: Pushedv1.0.0: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528
拉取镜像
$ docker pull 10.0.0.30:5000/alpine:v1.0.0v1.0.0: Pulling from alpineDigest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3Status: Downloaded newer image for 10.0.0.30:5000/alpine:v1.0.010.0.0.30:5000/alpine:v1.0.0$ docker login --username admin --password Admin@h3c 10.0.0.30:5001WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded$ docker pull 10.0.0.30:5001/alpine:v1.0.0v1.0.0: Pulling from alpineDigest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3Status: Downloaded newer image for 10.0.0.30:5000/alpine:v1.0.010.0.0.30:5001/alpine:v1.0.0
注意:
Nexus 中的 5000 是代表docker-snapshots
的仓库,现在下载的镜像刚好是docker-snapshots
的仓库的镜像,故可以正常下载;
但是如果下载的镜像不在docker-snapshots
的仓库中,是真正的 Nginx / Tomcat 的镜像,那么就无法在docker-snapshots
的仓库中进行下载,就需要在docker-central
的仓库中下载,docker-central
的仓库并没有配置访问路径,只配置了docker-public
分组,docker-public
是配置5001
端口。
所以要实现找到本地仓库镜像就下载,找不到就去远程DockerHub等进行下载,就需要登录到 5001 的下载。
Nexus 将上传和下载分成了两个不同的端口,上传镜像就使用 5000 端口,为了方便下载则使用 5001 端口
💫3.4.2.3.3 Harbor 的简介和搭建
Harbor
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,可以用来构建企业内部的Docker镜像仓库。
它在Docker的开源项目 Distribution的基础上,添加了一些企业需要的功能特性,如镜像同步复制、漏洞扫描和权限管理等。
Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
Harbor 是由 VMware 公司中国团队为企业用户设计的 Registry server 开源项目,包括了权限管理 (RBAC)、LDAP、审计、管理界面、自我注册、HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。
作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
基于角色的访问控制 - 用户与 Docker 镜像仓库通过 “项目” 进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。镜像复制 - 镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。图形化用户界面 - 用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。AD/LDAP 支持 - Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。审计管理 - 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。国际化 - 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。RESTful API - RESTful API 提供给管理员对于 Harbor 更多的操控,使得与其它管理软件集成变得更容易。部署简单 - 提供在线和离线两种安装工具, 也可以安装到 vSphere 平台 (OVA 方式) 虚拟设备。# 除了 Docker Hub 以外最早的一个比较受欢迎的 Docker 企业级 Registry 服务器。# 使用 Harbor 必须要先安装 docker 以及 docker-compose
Docker Compose
Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 安装
sudo curl -L "http://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose --version
🌈注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
安装 Harbor$ wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.0.tgz$ tar -zxvf harbor-offline-installer-v2.8.0.tgz$ cd harbor/# 编辑harbor.yml$ cp -av harbor.yml.tmpl harbor.yml$ vim harbor.ymlhostname: 10.0.0.30# http related confighttp: # port for http, default is 80. If https enabled, this port will redirect to https port port: 20880# HTTPS协议进行注释# 进行安装Harbor应用(进行预编译)$ bash prepare# 进行Harbor的安装$ bash install.sh
$ docker-compose ps Name Command State Ports---------------------------------------------------------------------------------------------harbor-core /harbor/entrypoint.sh Up (healthy)harbor-db /docker-entrypoint.sh 13 Up (healthy)harbor-jobservice /harbor/entrypoint.sh Up (healthy)harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcpharbor-portal nginx -g daemon off; Up (healthy)nginx nginx -g daemon off; Up (healthy) 0.0.0.0:20880->8080/tcpredis redis-server /etc/redis.conf Up (healthy)registry /home/harbor/entrypoint.sh Up (healthy)registryctl /home/harbor/start.sh Up (healthy)
Harbor WebUI 用户名:admin
Harbor WebUI 密码:Harbor12345
💫3.4.2.3.3 Harbor 的使用
创建用户[ 后续用户可以登录到 Harbor 仓库中 ] 创建项目[ 在Harbor中的"项目"选择"新建项目" ] 项目中可以添加相应的成员信息修改Docker 配置文件
# 在Docker机制中,默认除Docker认证服务以外的其他非https协议直接禁用# 5000 数据上传容器内的端口 5001 是进行仓库拉取镜像的端口$ vim /etc/docker/daemon.json{ "registry-mirrors": ["https://po13h3y1.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","http://f1361db2.m.daocloud.io"], "insecure-registries": ["http://10.0.0.30:20880"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2"}# 重启 Docker 服务$ systemctl daemon-reload && systemctl restart docker# 查看 Docker 受信任的仓库地址$ docker info | grep -A 4 "Insecure Registries" Insecure Registries: 10.0.0.30:20880 10.0.0.30:5000 10.0.0.30:5001 127.0.0.0/8# 查看 Harbor 容器的状态$ docker ps974f2e26ae4c goharbor/harbor-jobservice:v2.8.0 "/harbor/entrypoint.…" 20 minutes ago Restarting (2) Less than a second ago harbor-jobserviced83ad739e189 goharbor/nginx-photon:v2.8.0 "nginx -g 'daemon of…" 20 minutes ago Exited (128) 43 seconds ago 0.0.0.0:20880->8080/tcp nginxf10f8e72f4fe goharbor/harbor-core:v2.8.0 "/harbor/entrypoint.…" 20 minutes ago Exited (128) 43 seconds ago harbor-core2021486d3b04 goharbor/redis-photon:v2.8.0 "redis-server /etc/r…" 20 minutes ago Up 28 seconds (health: starting) redise6794c64cd5b goharbor/registry-photon:v2.8.0 "/home/harbor/entryp…" 20 minutes ago Up 29 seconds (health: starting) registry651c0103f8fb goharbor/harbor-db:v2.8.0 "/docker-entrypoint.…" 20 minutes ago Up 28 seconds (health: starting) harbor-dbc051eca3ae33 goharbor/harbor-registryctl:v2.8.0 "/home/harbor/start.…" 20 minutes ago Exited (137) 33 seconds ago registryctladcece30aac6 goharbor/harbor-portal:v2.8.0 "nginx -g 'daemon of…" 20 minutes ago Up 28 seconds (health: starting) harbor-portal6c5ed1f7f802 goharbor/harbor-log:v2.8.0 "/bin/sh -c /usr/loc…" 20 minutes ago Up 29 seconds (health: starting) 127.0.0.1:1514->10514/tcp harbor-log# 直接重新部署 Harbor(进入到harbor根目录)$ docker-compose down && docker-compose up -d$ docker-compose ps Name Command State Ports------------------------------------------------------------------------------------------------------harbor-core /harbor/entrypoint.sh Up (health: starting)harbor-db /docker-entrypoint.sh 13 Up (health: starting)harbor-jobservice /harbor/entrypoint.sh Up (health: starting)harbor-log /bin/sh -c /usr/local/bin/ ... Up (health: starting) 127.0.0.1:1514->10514/tcpharbor-portal nginx -g daemon off; Up (health: starting)nginx nginx -g daemon off; Up (health: starting) 0.0.0.0:20880->8080/tcpredis redis-server /etc/redis.conf Up (health: starting)registry /home/harbor/entrypoint.sh Up (health: starting)registryctl /home/harbor/start.sh Up (health: starting)# 使用 Harbor 账号和密码进行登录$ docker login --username admin --password Harbor12345 10.0.0.30:20880WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
Harbor 完成镜像管理命令
推送镜像
$ docker pull alpine:latest$ docker tag alpine:latest 10.0.0.30:20880/web_cloud/alpine:v1.0.0$ docker push 10.0.0.30:20880/web_cloud/alpine:v1.0.0The push refers to repository [10.0.0.30:20880/web_cloud/alpine]8d3ac3489996: Pushedv1.0.0: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528
拉取镜像
# 可以使用WebUI提示的拉取命令# 别的机器执行会报错$ docker pull 10.0.0.30:20880/web_cloud/alpine@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3Error response from daemon: Get https://10.0.0.30:20880/v2/: http: server gave HTTP response to HTTPS client# 因为并没有在别的机器daemon.json文件里面配置安全访问的仓库地址$ vim /etc/docker/daemon.json{ "registry-mirrors": ["https://po13h3y1.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","http://f1361db2.m.daocloud.io"], "insecure-registries": ["http://10.0.0.30:20880"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2"}# 重启 Docker 服务$ systemctl daemon-reload && systemctl restart docker# 建议使用可读性较好的标签命令进行下载(因为是私库所以需要使用用户名和密码进行登录)$ docker login --username admin --password Harbor12345 10.0.0.30:20880WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded# 拉取镜像$ docker pull 10.0.0.30:20880/web_cloud/alpine:v1.0.0$ docker pull 10.0.0.30:20880/web_cloud/alpine@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3: Pulling from web_cloud/alpineDigest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3Status: Image is up to date for 10.0.0.30:20880/web_cloud/alpine@sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3
3.4.3 仓库的使用
3.4.3.1 配置
在 /etc/docker/damon.json
文件中加入 *insecure*-registries: ["仓库访问地址"]
3.4.3.2 认证
docker login -u 用户名 仓库地址
3.4.3.3 推送镜像到仓库
第一步:基于镜像打标签
阿里云:
docker tag <image id> registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:版本
私服仓库:
docker tag <image id> 仓库路径/镜像名称:版本
第二步:推送
docker push <tagName>[:版本]
3.4.3.4 从仓库拉取镜像
登录:
docker login -u用户名 仓库地址docker pull 仓库路径/镜像名称:版本
本文链接:https://www.kjpai.cn/news/2024-04-04/153698.html,文章来源:网络cs,作者:康由,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!