Podman容器
一、容器出现是解决了什么问题
容器核心概念:容器、容器镜像、容器镜像仓库
容器核心技术:cgroup、chroot、namespace
二、容器解决的问题
现在很多企业都是把业务运行在容器中。为什么不允许在虚拟机里面呢?为什么不运行物理机呢?


容器的出现是为了解决业务的环境一致性问题,解决了虚拟机臃肿的问题
容器你可以理解为一个包装箱,包装箱是用来转物品的。使用包装箱装了这个物品,物品装之前是什么样的,你拆开了这个包装箱之后就是什么样的
三、容器三大核心概念
容器属于轻量级别的虚拟化,所以一台物理服务器上是可以同时运行多个容器的
container(容器):运行的实例,基于容器镜像来运行的。一个容器就是一个进程
image(容器镜像):是一个模板,这个模板包含了精简版本的操作系统和运行程序必备的环境(其他的都没有所以容器镜像特别的小)
registry(容器镜像仓库):容器镜像保存的位置;私有镜像仓库/公有镜像仓库

用户先从容器镜像仓库将容器镜像拉取到本机上,然后基于容器镜像运行一个容器实例
容器实例里面的服务、操作系统、数据都是来自于容器镜像这个模板的
四、容器和虚拟机之间的对比

从隔离性上对比:
虚拟机拥有单独的完整的操作系统,每个虚拟机都有自己的内核
容器复用宿主机的内核,每个容器不管是基于什么容器镜像运行的,全部都是使用宿主机的内核(看到的是一个进程)
从占用空间上对比:
虚拟机拥有完整的操作系统,默认情况下什么都不安装,一个操作系统安装好就要占据几个GB的空间,所以虚拟机是GB级别的
容器没有完整的操作系统,容器中只运行软件和软件必备的环境,所以比较精简,所以容器一般都是MB级别的
从镜像格式上对比:
容器的镜像格式只有一种,具备一个统一的容器镜像格式标准,OCI推动的
所有的容器镜像格式标准都是遵循docker的容器镜像标准
虚拟机的镜像格式非常的多,比如有ISO镜像格式、qcow2镜像格式、vmdk镜像格式、vhd镜像格式
ISO镜像格式:一般是来安装系统的
qcow2镜像格式:KVM虚拟机磁盘文件格式
vmdk镜像格式:vmware虚拟机磁盘文件格式
vhd镜像格式:windows的hyper-v虚拟机磁盘文件格式
也拥有一个统一的镜像格式:ovf/ova
因为虚拟化技术就多,所以导致虚拟化磁盘文件格式也多,几乎没有一个统一的标准
从创建速度和启动速度上对比:
容器要远远超过虚拟机,无论是创建还是启动远远超过虚拟机
从颗粒度上对比:
一台物理服务器支持创建多少个实例
容器的颗粒度远远拉开虚拟机
五、podman和docker的区别
主要是架构上的区别

docker容器是有守护进程的,就是必须要启动一个dockerd的服务,我们才能使用docker的命令
podman容器是没有守护进程的,它不需要启动什么服务,直接管理
podman是一个模块化管理,比如管理容器镜像使用skopeo工具,构建镜像buildah工具等...但实际上,一个podman工具就可以管理这些
docker管理所有的对象都是docker命令
docker必须是管理员才能去执行
podman支持无根容器,所谓的无根容器指的就是普通用户也可以管理容器
它们的命令其实都是一样的:
docker ps
podman ps
docker run
podman run
....
六、podman的安装
从RHEL8版本开始,默认已经安装了podman工具,所以直接使用即可
[root@rhel9 ~]#yum install -y podman-4.6.1-5.el9.x86_64
[root@rhel9 ~]# yum search container-tools
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:3:01:10 前,执行于 2026年04月11日 星期六 13时56分44秒。
============================================= 名称 精准匹配:container-tools ==============================================
container-tools.noarch : A meta-package witch container tools such as podman, buildah, skopeo, etc.
七、实现容器的三大核心技术
容器技术并不是一个新的技术,而是新瓶装旧酒
实现容器技术的核心在于Linux的内核
三大核心技术:
- namespace:命名空间。做资源隔离的,不同的命名空间无法互相访问
- chroot:切换根文件系统。每个容器都有自己的根文件系统,A容器的根文件系统故障是不影响B容器的
- cgroup:控制组。限制进程的使用资源的,容器就是进程
所以windows主机不可以运行容器—>那为什么有windows服务器在跑docker。这是因为windows主机上开启了wsl功能,这个wsl就是运行在windows上的一个Linux子系统
八、容器、容器镜像、容器镜像仓库
(一)容器镜像
容器镜像:一个模板,包含了操作系统以及软件运行的环境
第一步学习的是如何从容器仓库中拉取镜像到本机上
podman pull 容器镜像地址
podman pull uhub.service.ucloud.cn/library/httpd:2.4.10
##容器镜像组成:容器镜像仓库地址/仓库名/镜像名:tag
第二步列出系统上存在的容器镜像
podman images
搜索镜像
podman search 关键字
从私有仓库拉取容器镜像,私有仓库比共有仓库拉取镜像就多了一步登录仓库的操作
#登录远程镜像仓库
[root@rhel9 ~]# podman login uhub.service.ucloud.cn
Username:
Password:
Login Succeeded!
#退出登录的镜像仓库
[root@rhel9 ~]# podman logout uhub.service.ucloud.cn
Removed login credentials for uhub.service.ucloud.cn
(二)跨主机传输镜像

跨主机传输容器镜像的俩种方案:
- 将镜像打包为一个文件,传输给其他主机,其他主机基于文件导入镜像到系统中
- 将镜像推送到到容器镜像仓库中,其他主机直接podman pull xxx 拉取镜像即可
(1)先通过第二种方式,基于容器镜像仓库来传输
podman push推送镜像到远程仓库的时候是不能指定镜像仓库的,那么它怎么知道推到哪个仓库中呢?是根据容器镜像名字来决定的
#修改镜像的tag,重新命名
##格式 podman tag 镜像 修改名的镜像
[root@rhel9 ~]# podman tag uhub.service.ucloud.cn/library/busybox:1.31.1 uhub.service.ucloud.cn/rhel9-20260412/busybox:v1
#推送镜像到远程仓库中
[root@rhel9 ~]# podman login uhub.service.ucloud.cn ##先登录指定的远程仓库
Username:
Password:
Login Succeeded!
[root@rhel9 ~]# podman push uhub.service.ucloud.cn/rhel9-20260412/busybox:v1
##格式 podman push 镜像
(2)针对于容器镜像打包为一个文件,实现镜像的导出和导入
#导出为文件
[root@rhel9 ~]# podman save -o busybox.tar uhub.service.ucloud.cn/rhel9-20260412/busybox:v1
#导入为镜像
root@localhost:~# podman load -i busybox.tar
(3)删除容器镜像
前提:这个镜像一定不能正在使用,也就是说如果已经存在使用镜像的容器,你没有删除容器的话这个镜像是删除不了的
[root@rhel9 ~]# podman rmi uhub.service.ucloud.cn/rhel9-20260412/busybox:v1
(4)查看镜像的详细信息
后续自己制作自定义容器镜像的时候,和它写的其实是一样的,只不过官网人员写的镜像更加的标准,人家还写了一些注释,还写了作者是谁
[root@rhel9 ~]# podman inspect uhub.service.ucloud.cn/ucloud/nginx:1.28.2
(三)容器
容器是基于镜像运行的一个实例。我们无法直接访问容器镜像中的数据内容,必须要先运行容器,才能访问里面的服务和数据文件
访问的时候也是访问容器的业务,没有容器的话,则无法承载容器镜像中的服务和数据文件
(1)列出运行的容器
#列出正在运行的容器
[root@rhel9 ~]# podman ps
#列出所有状态的容器
[root@rhel9 ~]# podman ps -a
#列出所有容器的ID
[root@rhel9 ~]# podman ps -aq
(2)查看容器的详细信息
查看容器来自于哪个镜像
查看容器的IP地址和网关地址,使用的是容器的哪一个网络
查看容器的创建的命令
查看容器的环境变量...
[root@rhel9 ~]# podman inspect ecstatic_hopper
(3)观察下面的容器状态
[root@rhel9 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b38577e7001 /library/alpine:latest /bin/sh About a minute ago Exited (0) About a minute ago keen_shirley
ddc3ccf1f410 cloud/nginx:1.28.2 nginx -g daemon o... 6 seconds ago Up 7 seconds ecstatic_hopper
##一个容器是up 一个容器是exited
##这是因为容器是为了服务而生,如果容器中的服务结束了,那么容器的生命周期也结束了,容器就会退出
注意看COMMAND,指的是容器运行的时候执行的命令是什么
alpine镜像运行的容器执行的命令是/bin/sh
nginx镜像运行的容器执行的命令是nginx -g daemon off;
这条命令执行之后,nginx服务会一直在前端持续运行
总结:前端持续运行的(容器是不会退出的),后端运行的(容器是会退出的)
(4)运行容器
#只适合于镜像运行的容器执行的命令是/bin/sh或者/bin/bash,这条命令可以让这些容器持续运行
[root@rhel9 ~]# podman run -it uhub.service.ucloud.cn/library/centos:6.7
[root@791b2aed7c94 /]#
-i 和 -t 选项一般都是联合使用
-i 表示交互式
-t 表示分配终端
默认情况下,podman run 会进入容器中
#-d放入后台运行(不是把容器中的服务放到容器里面的后台运行,这里是说把宿主机的容器放到宿主机的后台运行,这样就不会一运行就直接进入容器了)
[root@rhel9 ~]# podman run -d uhub.service.ucloud.cn/ucloud/nginx:1.28.2
634a2217b4457ddae6219aca724c04bb8845e56d858e064c7771f3ce4c450712
#--name给容器命名,--hostname给容器里面的主机名命名
[root@rhel9 ~]# podman run -d --name nginx01 uhub.service.ucloud.cn/ucloud/nginx:1.28.2
#--rm,这是一个临时容器,退出容器就会删除这个容器
(5)进入容器
#通过exex进入容器(通用的)
podman exec -it angry_ride /bin/bash
podman exec -it b9d57b4dd57b159 /bin/sh
#通过attach进入容器,正常使用exit命令退出会导致容器变成退出状态。使用ctrl p 配合ctrl q 就可以退出,这种方式的退出不会导致容器变成exited状态
只能进入command是/bin/sh或者/bin/bash的容器,如果容器运行的时候执行的命令不是这些,那么就无法进入
(6)删除容器
podman rm 容器ID/容器名称
podman rm -f 容器ID/容器名称
#正常情况下,需要先停止容器,然后再删除
podman stop 容器ID/容器名称
podman rm 容器ID/容器名称
#删除指定状态的容器
podman rm `podman ps --filter status=exited -q`
#删除所有的容器
podman rm -f `podman ps -aq`
(四)容器镜像仓库
容器镜像仓库存在配置文件/etc/containers/registries.conf
作用是:当用户搜索容器镜像的时候如果没有指定镜像仓库地址,则默认使用文件中定义的仓库,去仓库中搜索。当用户拉取镜像的时候没有指定仓库仓库地址,默认也会从文件中定义的仓库去拉取
[root@rhel9 containers]# grep -v ^# /etc/containers/registries.conf
unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
##上面是搜索镜像的时候默认会去哪些镜像仓库搜索
registry.access.redhat.com:红帽的开放的公有镜像仓库
registry.redhat.io:红帽的私有镜像仓库,需要你登录红帽账户
docker.io:docker官网镜像仓库 dockerhub
建议使用国内的一些公有的仓库
华为云
腾讯云
ucloud
...
[[registry]] ## 针对于一个指定镜像仓库的配置
prefix = "example.com/foo" #匹配的镜像前缀
insecure = false #是否忽略安全性,是否支持http 基于https拉取的
blocked = false #是否禁用当前镜像仓库
location = "demo.com/abc" #实际上镜像的前缀
podman pull example.com/foo/nginx:v1 --》 podman pull demo.com/abc/nginx:v1
走的是https 走的是http
九、容器的储存
默认情况下,容器的存储是临时的,容器的根会挂载到宿主机上,当删除容器的时候,这个宿主机上的目录也会随之删除,所以数据是临时的
为了实现容器的持久化存储,通过容器卷的方式来实现容器数据持久化存储
所谓的容器卷,这个卷其实就是宿主机的某个目录,我们需要将容器卷挂载给容器的某个目录,当容器将文件保存到这个挂载的目录的时候,实际上是将文件存储到了宿主机的某个目录,这个目录是不会随着容器的删除而删除的,它会随着容器卷的删除而删除
(一)查看容器卷的详细信息
[root@rhel9 ~]# podman volume inspect d972c57978f4e3f4c240b5b18468846a8aebef99e13ce230da12035fcd870021
[
{
"Name": "d972c57978f4e3f4c240b5b18468846a8aebef99e13ce230da12035fcd870021",
"Driver": "local",
"Mountpoint": "/var/lib/containers/storage/volumes/d972c57978f4e3f4c240b5b18468846a8aebef99e13ce230da12035fcd870021/_data", ---》这个就是宿主机的目录
"CreatedAt": "2026-04-12T10:19:34.744273988+08:00",
"Labels": {},
"Scope": "local",
"Options": {},
"Anonymous": true,
"MountCount": 0,
"NeedsCopyUp": true,
"LockNumber": 5
}
]
(二)创建和挂载容器卷,让容器数据持久化
##记住记住!容器卷是不能直接挂载给容器的根目录的!!! 只能挂载给容器的其他的某个目录
(1)创建容器卷和查看详细信息
[root@rhel9 ~]# podman volume create volume01
[root@rhel9 ~]# podman volume inspect volume01
[
{
"Name": "volume01",
"Driver": "local",
"Mountpoint": "/var/lib/containers/storage/volumes/volume01/_data",
"CreatedAt": "2026-04-12T11:51:25.912493136+08:00",
"Labels": {},
"Scope": "local",
"Options": {},
"MountCount": 0,
"NeedsCopyUp": true,
"NeedsChown": true,
"LockNumber": 0
}
]
(2)挂载容器卷
##挂载需要在运行容器时,进行挂载
##格式: -v 容器卷:容器里面需要挂载的目录
[root@rhel9 ~]# podman run -d --name web01 -v volume01:/usr/share/nginx/html uhub.service.ucloud.cn/ucloud/nginx:1.28.2
(三)删除容器卷
##删除容器卷操作,一定保证没有容器正在使用这个容器卷
[root@rhel9 ~]# podman volume rm volume01

(四)除了通过容器卷实现数据持久化,我们在运行容器的时候可以直接将宿主机的某个目录映射挂载给容器的目录
[root@rhel9 ~]# podman run -d --name web02 -v /mnt:/usr/share/nginx/html uhub.service.ucloud.cn/ucloud/nginx:1.28.2
d2ec37ce80420b82bb46d61cd35d05cb1f2cdcabb0c21b1533c10cfd653827e6
## -v 宿主机目录:容器目录
[root@rhel9 ~]# podman exec -it web02 /bin/bash
root@d2ec37ce8042:/# cd /usr/share/nginx/html/
root@d2ec37ce8042:/usr/share/nginx/html# ls
ls: cannot open directory '.': Permission denied
##出现权限拒绝,是因为SELinux的问题。只有目录的标签类型是container_file_t,容器才能正常访问
解决方法:如果出现了SELInux的问题,我们只需要在运行容器挂载目录的时候,在后面加上一个Z或者一个z
##考点,记住必须要加上Z
-v /demo:/usr/share/nginx/html:Z
-v /demo:/usr/share/nginx/html:z
大Z表示这个目录,只能够给一个容器使用,其他的容器不能使用,如果使用了则会报错,后来者居上,前面已经使用这个目录的容器就不能访问的
小z表示这个目录可以同时给多个容器使用
十、容器的网络
(一)容器的网络有三种模式:
- Bridge:默认模式,这种模式下,容器有自己的网络,可以出去访问外部网络,但是外部网络无法访问容器网络
- Host:主机模式,这种模式下,容器是复用宿主机的网络的
如果多个容器对外暴露的服务端口是一样的,那么这些容器就不要使用host模式了,因为会造成端口冲突
- None:无网络模式,容器没有网卡 只有一个lo网卡
(二)修改容器网络的模式
[root@RHEl9 ~]# podman run -d --name web01 --network host uhub.service.ucloud.cn/ucloud/nginx:1.28.2
(三)使用Host模式,如果端口冲突(nginx、httpd都是80端口)需要使用“端口映射” ##在宿主机上开放一个端口这个端口的流量和容器的端口做映射

[root@rhel9 ~]# podman run -d --name nginx -p 8880:80 uhub.service.ucloud.cn/ucloud/nginx:1.28.2
7849fdda516b7e232132f669ff00d5fab7d3d85056a7d32a32e49ae5003de2cf
[root@rhel9 ~]# podman run -d --name httpd -p 8881:80 uhub.service.ucloud.cn/ucloud/httpd
4f12d7f7c2a9eec64a5ce6274acae44d045d350a3d41c15cdf93faf56c48d49f
##-p 宿主机端口:容器端口
将宿主机的某个端口映射到容器的某个端口,实现端口映射,让外部网络可以访问容器的业务
十一、无根容器rootless
考试会考的,无根容器没有什么特殊的,就是使用一个普通用户来创建和管理容器
docker以前不支持无根容器必须使用root来创建和管理容器
podman天生就支持无根容器,而且什么都不需要配置,直接切换到普通用户,就可以使用podman命令管理了
一定记住:不能通过su - 切换到普通用户。
必须使用ssh登录
(一)如果使用su -切换则会出现的错误
[user@rhel9 ~]$ podman images
WARN[0000] The cgroupv2 manager is set to systemd but there is no systemd user session available
WARN[0000] For using systemd, you may need to log in using a user session
WARN[0000] Alternatively, you can enable lingering with: `loginctl enable-linger 1001` (possibly as root)
WARN[0000] Falling back to --cgroup-manager=cgroupfs
REPOSITORY TAG IMAGE ID CREATED SIZE
WARN[0000] Failed to add pause process to systemd sandbox cgroup: Process org.freedesktop.systemd1 exited with status 1
##虽然有这个warning警告,但是不影响普通用户创建和管理容器
普通用户也可以让容器和systemd集成,但是如果出现了上面的warning的话,是无法将容器做称systemd服务的
cgroup驱动采用的是systemd,通过systemd来实现cgroup功能的。还有一个驱动就是cgroupfs
su - 切换用户是无法获得到完整的systemd环境,只有SSH登录才能获取到完整的systemd环境
十二、容器和systemd集成
容器管理的时候,我们都是通过podman工具来实现管理容器
容器和systemd集成:就是将运行中的容器制作为systemd服务单元配置文件(/usr/lib/systemd/systemd/xxxx.service)
systemctl start/stop/restart/enable/disable/status xxxx.service
如果容器是通过服务的方式来管理,那么对容器的管理就不要使用podman工具了,要使用systemctl工具
查看man手册 podman-generate-systemd
(一)集成root用户容器的systemd
podman generate systemd 容器ID
选项
--files:将输出的信息保存为一个文件;文件名字命名格式:container-容器ID.service
--name:将容器的名字作为服务名字
--new:不是对原来的容器进行启动和停止操作,而是创建新的容器和删除这个容器
(1)集成systemd的步骤
[root@RHEl9 /]# podman run -d --name nginx uhub.service.ucloud.cn/ucloud/nginx:1.28.2
##先创建一个容器
[root@rhel9 system]# cd /usr/lib/systemd/system ##来到这个目录下
[root@rhel9 system]# podman generate systemd --files --name --new nginx
/usr/lib/systemd/system/container-nginx.service
[root@rhel9 system]# systemctl daemon-reload
#删除刚刚podman手动创建的容器,再启动服务,防止冲突
[root@rhel9 system]# systemctl enable container-nginx.service
[root@rhel9 system]# systemctl start container-nginx.service
(2)删除集成systemd
[root@rhel9 system]# systemctl stop container-nginx.service
[root@rhel9 system]# systemctl disable container-nginx.service
[root@rhel9 system]# rm -rf /usr/lib/systemd/system/container-nginx.service
[root@rhel9 system]# systemctl daemon-reload
(二)集成普通用户zhangsan容器的systemd
(1)使用man查看普通用户集成的服务放在什么地方
Installation of generated systemd unit files.
Podman-generated unit files include an [Install] section, which carries installation information for the
unit. It is used by the enable and disable commands of systemctl(1) during installation.
Once the systemd unit file is generated, install it to /etc/systemd/system to be run by the root user or
to $HOME/.config/systemd/user for installing it as a non-root user. Enable the copied unit file or files
using systemctl enable.
(2)制作普通用户容器集成的systemd步骤
[zhangsan@rhel9 user]$ pwd
/home/zhangsan/.config/systemd/user
##一定要来到这个目录下,是没有systemd/user目录的,所以需要自己创建
[zhangsan@RHEl9 user]$ podman run -d --name web01 uhub.service.ucloud.cn/ucloud/nginx
E04151c3d6f4dd587acd0e6338aa52716592e5581aec71dbe796c6eedbfcaf9a
##需要提前创建出需要集成systemd的容器
[zhangsan@rhel9 user]$ podman generate systemd --files --name --new web01
/home/zhangsan/.config/systemd/user/container-web01.service
##通过命令生成systemd的服务文件
[zhangsan@Client user]$ podman rm -f web01
web01
##删除web02容器,避免发送冲突
[zhangsan@rhel9 user]$ systemctl --user daemon-reload
[zhangsan@RHEl9 user]$ systemctl --user status container-web01.service
##一定要加上--user
(3)开机自启,root用户和普通用户是不同的
系统开机之后,只会运行root用户的服务。即使是普通用户设置了服务开机自启动,也不会运行
只有当你登录到了这个用户,这个用户的服务才会开始运行
[root@rhel9 ~]# loginctl enable-linger user ##设置真正的开机自启
[root@rhel9 ~]# loginctl show-user user
UID=1001
GID=1001
Name=zhangsan
Timestamp=Thu 2026-04-16 13:58:58 CST
TimestampMonotonic=5299251834
RuntimePath=/run/user/1001
Service=user@1001.service
Slice=user-1001.slice
State=lingering
Sessions=
IdleHint=yes
IdleSinceHint=0
IdleSinceHintMonotonic=0
Linger=yes ##这为yes则表示真正的开机自启
[root@RHEl9 /]# loginctl disable-linger zhangsan ##关闭开机自启
十三、自定义容器镜像

(一)Containerfile文件中的固定语法格式
FROM:指定基础镜像
RUN:指定在镜像中要执行的命令
ENTRYPOINT:指定基于镜像运行的容器运行的命令
CMD:指定基于镜像运行的容器运行的命令
如果文件中同时存在CMD和ENTRYPOINT,那么CMD会作为ENTRYPOINT的参数使用
如果运行容器的时候,传入了参数,那么这个参数会覆盖CMD的内容
如果运行容器的时候,传入了参数,那么这个参数会放到ENTRYPOINT的后面使用
如果一个文件中同时存在多个CMD,则最后一个CMD生效
EXPOSE:对外暴露的端口是什么。这个仅仅是标识,没有实际意义
VOLUME:容器中挂载点是什么
WORKDIR:指定登录容器默认所在的工作目录。默认是/
COPY:拷贝宿主机的文件到容器镜像中,原封不动的拷贝文件
ADD:拷贝宿主机的文件到容器镜像中,如果拷贝的是压缩包,ADD会自动解压缩
MINTAINER:指定作者信息
LABEL:指定作者信息
...
(二)实验:基于centos:7基础镜像,构建出来一个centos7:v1镜像,要求这个镜像运行的容器拥有vim命令、wget、ifconfig命令、安装httpd软件、网页文件、yum仓库
[root@rhel9 ~]# vim Containerfile
FROM uhub.service.ucloud.cn/library/centos:7
MAINTAINER Xulaoshi@yutianedu.com
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install -y httpd vim net-tools
RUN echo centos7-podman > /var/www/html/index.html
RUN yum clean all
CMD ["/bin/bash"]
[root@rhel9 ~]# podman build -t localhost/centos/centos7:v1 -f Containerfile .

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)