44 Docker:安装与容器管理

文章目录

前言

本文档聚焦 Docker 发展与简介Docker 容器管理 两大核心章节,系统梳理容器化技术的演进背景、核心概念、镜像与容器操作命令及其实验流程。内容严格遵循"理论+实操"结构,保留所有关键命令、配置路径、端口号及操作细节,便于教学与后期查阅。

  1. 云服务
    1. 云服务(基础设施IaaS、平台PaaS、软件DaaS、数据DaaS)
    2. 云厂商:阿里云、腾讯云、华为云、Google云、AWS云,百度云、西部数码、天翼云。
  2. 虚拟化
    1. 虚拟化架构:全虚拟化、半虚拟化;裸金属虚拟化、宿主型虚拟化。
    2. 虚拟化产品:VMware、Openstack、KVM、VirtualBox、Hyper-V
    3. 实现IaaS服务的核心技术(但并非IaaS本身)
  3. 容器
    1. 轻量级
    2. 多台主机上可以在同环境上运行
    3. 实现PaaS服务的核心技术(但并非PaaS本身)
  4. 容器和虚拟化的区别
    1. 虚拟机安装完整操作系统,占用资源大,启动比较慢。
    2. 容器共享宿主机内核,只包含应用和依赖关系,占用资源小,启动快。
  5. 日常使用的容器产品
    1. Docker
    2. Podman
    3. Kubernetes
    4. Containerd/CRI-O
    5. OpenShift
  6. 容器技术的使用场景
    1. 云原生
    2. 混合云
    3. 微服务
  7. Docker概述(logo)
    1. 大鲸鱼:代表宿主机
    2. 集装箱:隔离出来的容器
  8. Docker版本
    1. 社区版(CE)
    2. 企业版(EE)
  9. Docker六大命名空间
    1. 挂载点隔离
    2. 网络隔离
    3. 进程ID隔离
    4. 进程通信隔离
    5. 用户/组隔离
    6. 主机名/域名隔离
  10. Docker架构与组件
    1. Docker Daemon:后台服务进程(dockerd)。
    2. Client:命令行工具(docker),与 Daemon 通信。
    3. Images:只读模板,用于创建容器。
    4. Registry:镜像仓库(如 Docker Hub)。
    5. Container:镜像的运行实例。
  11. Docker核心技术
    1. Namespace:实现资源隔离。
    2. Cgroup:实现 CPU、内存等资源限制。
    3. Copy-on-Write (CoW):基于 UnionFS 的高效文件操作。
  12. 核心概念
    1. 镜像(Image):应用模板。
    2. 容器(Container):运行实例
    3. 仓库(Repository):存放镜像的地方。
  13. Docker管理命令:pull(拉取镜像)、push(上传镜像)、rmi(删除镜像)、(删除容器下节内容)、tag(标签)、image(查看镜像)、save(导出镜像)、load(导入镜像)、info(Docker系统信息)、--version(版本信息)

什么有人称 Docker 为"虚拟化"?

在广义语境下,"虚拟化"有时被泛化为"资源抽象与隔离",于是:

  • 硬件虚拟化(Hardware Virtualization):VMware、KVM
  • 操作系统虚拟化(OS-level Virtualization):Docker、LXC、Solaris Zones
  • 应用虚拟化 :Java VM、.NET CLR(更抽象)
    但这些只是术语分类,技术实现方式完全不同。

理论部分

1_发展与简介

Docker 是一种开源的容器化平台,通过将应用程序及其依赖打包为标准化单元(容器),实现"一次构建,到处运行"的部署目标。

1.1_云服务与虚拟化基础

① 云服务模型介绍

云计算按服务层级分为四类:

  • IaaS(基础设施即服务):提供虚拟机、存储、网络等底层资源(如 AWS EC2)。用户需自行安装 OS 和应用。
  • PaaS(平台即服务):提供开发和运行环境(如 Heroku),开发者只需关注代码。
  • SaaS(软件即服务):直接使用云端软件(如 Gmail),无需维护。
  • DaaS(数据即服务):提供数据存储与分析能力(如 Snowflake)。

各模型灵活性递减,运维复杂度递增。

主流云厂商:阿里云、腾讯云、AWS、Google Cloud、华为云等,提供计算、存储、CDN 等服务。

② 虚拟化技术概述

虚拟化是云服务的基础,主要类型包括:
全虚拟化

  • 虚拟机不知道自己是虚拟机。
  • Hypervisor 完全模拟硬件(如 VMware),兼容多 OS,但性能损耗大。
    半虚拟化
  • 虚拟机知道自己是虚拟机。
  • Guest OS 与 Hypervisor 协作(如 Xen),性能更优,需修改内核。
    裸金属虚拟化
  • 虚拟化系统(Hypervisor)直接接管硬件。
    宿主型虚拟化:
  • 虚拟化系统寄居在宿主机操作系统上。
③ 虚拟化产品

企业主流产品:

  • VMware:企业级,支持 ESXi/vSphere。
  • Hyper-V:微软 Windows Server 内置方案。
  • VirtualBox:跨平台个人开发工具。
  • KVM:Linux 内核原生虚拟化模块。

大型虚拟化产品推荐:Openstack

  • 可编程的云操作系统,多地区部署,统一管理,支持私有转公有。
  • OpenStack 的强大之处:统一入口,异构整合 ,可以通过开发插件、驱动或集成方式,与大量第三方产品(计算资源)协同工作。例如:KVM/QEMU(默认)、VMware vSphere (via vmwareapi)等。

个人产品推荐:Proxmox VE

  • 开箱即用的虚拟化一体机,架构简洁,去中心化的web管理,一个OS镜像就可以实现分布式部署和虚拟化管理,不需要复杂的模块参与。
  • 裸金属虚拟化(Type-1) + 同时支持全虚拟化和容器虚拟化(LXC)。
  • 基于Debian Linux系统,运行稳定,功能完善(定时备份、邮件提醒等),开源免费。
  • 支持丰富的存储方式,可以配合Ceph提供虚拟机的高可用(HA)。
  • 但集群规模有上限(建议 ≤32 节点),且不原生支持openstack接口,适合中小企业开支有限的私有云。

1.2_Docker简介及其重要性

① 为什么使用 Docker?

传统虚拟机每个实例需完整 OS,资源开销大;Docker 容器共享宿主机内核,仅隔离进程、文件系统等,启动快(秒级)、资源占用少(单机可运行上千容器)。

类比:集装箱(容器) vs 整艘货轮(虚拟机)。

② Docker 发展历史(关键节点)
  • 2013年:Docker 项目发布(Solomon Hykes, DotCloud)。
  • 2017年:推出 CE(社区版)与 EE(企业版)。
  • 2018年:集成 Kubernetes,支持多阶段构建。
  • 2019年:支持 GPU 加速。
  • 2020年后:聚焦开发者体验,强化 CI/CD 与云原生支持。
③ Docker 版本:CE vs EE
特性 Docker CE Docker EE
目标用户 个人/小团队 企业生产环境
费用 免费 付费
发布周期 月度 长期支持
④ Docker 与传统虚拟化区别
对比项 Docker 容器 虚拟机
启动速度 秒级 分钟级
计算损耗 几乎无 ~50%
单机支持量 上千 几十
隔离性 Namespace/Cgroup 完全硬件隔离
⑤ 容器化技术生态系统
  • Docker:最流行容器引擎。
  • Kubernetes:容器编排事实标准。
  • Podman:无守护进程替代品。
  • Containerd/CRI-O:底层运行时(K8s 使用)。
  • OpenShift:Red Hat 的企业 K8s 平台。
⑥ Docker 核心优势
  • 移植性:镜像跨平台一致运行。
  • 隔离性:容器间互不影响。
  • 高效性:轻量、快速启动。
  • 简化部署:标准化交付单元。
⑦ 应用场景
  • CI/CD 流水线(环境一致性)
  • 微服务架构(独立部署)
  • 多云/混合云迁移(无缝切换)

1.3_Docker基础概念

  • 蓝色鲸鱼:宿主机
  • 集装箱:容器
  • 大海:操作系统(Linux/Windows)

设计宗旨:Build, Ship and Run Any App, Anywhere

② Linux 六大命名空间(Namespace)
缩写 作用
MNT 文件系统挂载点隔离
NET 网络栈(网卡、路由)隔离
PID 进程 ID 隔离
IPC 进程间通信隔离
UTS 主机名/域名隔离
USER 用户/组 ID 隔离
③ Docker 架构组件
  • Docker Daemon :后台服务进程(dockerd)。
  • Client :命令行工具(docker),与 Daemon 通信。
  • Images:只读模板,用于创建容器。
  • Container:镜像的运行实例。
  • Registry:镜像仓库(如 Docker Hub)。
④ 核心技术
  • Namespace:实现资源隔离。
  • Cgroup:实现 CPU、内存等资源限制。
  • Copy-on-Write (CoW):基于 UnionFS 的高效文件操作。
⑤ 核心概念
  • 镜像(Image):包含应用及依赖的只读模板。
  • 容器(Container):镜像的运行实例,具独立文件系统、网络、进程空间。
  • 仓库(Repository):存放镜像的地方(Docker Hub 为公共仓库)。

2_容器管理

容器管理涵盖镜像操作与容器生命周期控制。

2.1_Docker镜像操作

镜像是容器的基础,管理包括:

  • 搜索docker search <关键词>
  • 拉取docker pull <镜像>
  • 查看docker images
  • 打标签docker tag <源> <新标签>
  • 导出/导入docker save / docker load
  • 删除docker rmi

镜像由多层组成,每层对应 Dockerfile 一条指令;latest 为默认标签,建议使用明确版本号(如 v1.0)。

2.2_Docker容器操作

容器生命周期:创建 → 启动 → 停止 → 删除

关键行为:

  • 容器默认停止状态 ,需 docker startdocker run 启动。
  • 容器存活依赖 PID=1 的前台进程,该进程退出则容器停止。
  • 支持 7 种状态:created, running, restarting, removing, paused, exited, dead。

常用操作:

  • 创建docker create
  • 启动/停止docker start/stop
  • 后台运行docker run -d
  • 交互进入docker exec -it
  • 文件传输docker cp
  • 导出/导入docker export / docker import
  • 删除docker rm

docker run = docker create + docker start


实验部分

1_Docker 安装与配置

1.1_安装 Docker CE

① 关闭防火墙与 SELinux

shell 复制代码
systemctl stop firewalld.service
setenforce 0

避免网络策略干扰 Docker 网桥通信。

② 安装依赖包

shell 复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils:提供 yum-config-manager 工具,用于拉取镜像源。
device-mapper-persistent-datalvm2:Docker持久化存储驱动依赖

③ 配置阿里云yum源

  • 添加yum源配置文件
shell 复制代码
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 查看新添加的docker软件源
shell 复制代码
cat /etc/yum.repos.d/docker-ce.repo

④ 安装 Docker CE

shell 复制代码
yum install -y docker-ce docker-ce-cli containerd.io

可指定版本:yum install -y docker-ce-20.10.18

⑤ 启动并设置开机自启

shell 复制代码
systemctl start docker.service
systemctl enable docker.service

⑥ 验证安装

shell 复制代码
docker --version    # 查看版本
docker info         # 查看详细系统信息

1.2_配置镜像加速器

① 创建配置文件

  • 新建目录
shell 复制代码
mkdir -p /etc/docker
  • 阿里云Docker镜像加速器
shell 复制代码
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://xdisb0be.mirror.aliyuncs.com"]
}
EOF

具体获取方式:阿里云 ACR镜像工具镜像加速器

  • 华为云Docker镜像加速器
shell 复制代码
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [ https://1c786b17d3614c7a876977ea63b80b7e.mirror.swr.myhuaweicloud.com ]
}
EOF

具体获取方式:华为云 SWR镜像资源镜像中心镜像加速器

  • 其他国内Docker镜像加速器地址
shell 复制代码
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ]
}
EOF

支持多个加速器,链接之间注意要加逗号。

  • 一个国外的Docker镜像加速器
shell 复制代码
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://hub.littlediary.cn/"]
}
EOF

tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["http://43.163.206.59:9211"]
}
EOF

② 重载并重启 Docker

shell 复制代码
systemctl daemon-reload
systemctl restart docker

2_镜像操作实验

2.1_镜像基础操作

① 搜索镜像

shell 复制代码
docker search nginx

显示名称、描述、星级等信息

② 拉取镜像

shell 复制代码
docker pull nginx

默认拉取 latest 标签

③ 查看本地镜像

shell 复制代码
docker images

输出字段:REPOSITORY, TAG, IMAGE ID, CREATED, SIZE

④ 查看镜像详情

shell 复制代码
docker inspect 41f689c20910

返回 JSON 格式,含层次、历史、配置等

⑤ 为镜像添加标签

shell 复制代码
docker tag nginx:latest nginx:web
docker images | grep nginx

同一镜像可有多个标签,用于区分版本,例如:v0.1 v1.0。

⑥ 删除镜像

shell 复制代码
docker rmi nginx:web      # 仅删除标签
docker rmi 41f689c20910   # 彻底删除镜像(无容器依赖时)

若被容器使用,需先删除容器

⑦ 导出镜像

shell 复制代码
docker save -o nginx.tar nginx:latest

生成 tar 包用于备份或迁移

⑧ 导入镜像

shell 复制代码
docker load < nginx.tar
# 或
docker load -i nginx.tar
  • 查看帮助信息
shell 复制代码
docker load --help

⑨ 上传到 Docker Hub

  • 登录 Docker Hub
shell 复制代码
docker login

被墙了,需要加速,或使用国内仓库。

  1. 浏览器登陆公共仓库(例如:华为云 SWR、阿里云 ACR)

  2. 在公共仓库创建组织(阿里云 ACR 创建实例非常规,可以在华为云 SWR创建组织)。

  3. 以 华为云SWR 为例:我的镜像客户端上传生成登陆指令

  4. 在服务器粘贴登陆指令,登陆 华为云SWR 公共仓库。

shell 复制代码
docker login -u cn-east-3@ABCDEFGHIJKLMNOPQRST -p 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqr swr.cn-east-3.myhuaweicloud.com
  1. 先打一个标签
shell 复制代码
docker tag {镜像名称}:{版本名称} swr.cn-east-3.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}

docker tag nginx:web swr.cn-east-3.myhuaweicloud.com/toopen/nginx:web
  1. 然后推送
shell 复制代码
docker push swr.cn-east-3.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}

docker push swr.cn-east-3.myhuaweicloud.com/toopen/nginx:web

3_容器操作实验

3.1_容器生命周期管理

① 创建容器(不启动)

shell 复制代码
docker create -it nginx:latest /bin/bash

-i:保持标准输入(STDIN)打开;-t:分配伪终端(tty);合起来就是运行一个交互式会话。

② 查看容器状态

shell 复制代码
docker ps          # 仅运行中
docker ps -a       # 所有容器

③ 启动容器

shell 复制代码
docker start 容器编号(CONTAINER ID)
docker start 8b0a7be0ff58

④ 停止容器

shell 复制代码
docker stop 容器编号(CONTAINER ID)
docker stop 8b0a7be0ff58

⑤ 创建并启动容器

shell 复制代码
docker run -it centos:7 /bin/bash

退出 shell 后容器停止(因主进程结束)

⑥ 后台持续运行

shell 复制代码
docker run -itd --name test1 centos:7 /bin/bash

-d:后台运行;--name:指定容器名

  • 重命名容器
shell 复制代码
docker rename 旧容器名  新容器名

3.2_容器交互与数据传输

① 进入运行中容器

shell 复制代码
docker exec -it test1 /bin/bash

退出后容器继续运行

② 复制文件到容器

shell 复制代码
echo abc123 > ~/test.txt
docker cp ~/test.txt test1:/opt/

③ 从容器复制文件

shell 复制代码
docker cp test1:/opt/test.txt ~/abc123.txt

3.3_容器迁移与清理

① 导出容器

shell 复制代码
docker export test1 > centos7.tar	# 旧版本方式
docker export test1 -o centos7.tar

无论容器运行与否均可导出

② 导入为镜像

shell 复制代码
cat centos7.tar | docker import - centos7:test	# 旧版本方式
docker import centos7.tar centos7:test
docker images	# 查看导入的镜像

生成新镜像,不创建容器

③ 删除容器

shell 复制代码
docker stop test1
docker rm test1              # 删除已停止容器
docker rm -f test1           # 强制删除运行中容器

④ 批量清理

shell 复制代码
# 批量停止所有容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop
# 批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm
# 删除所有未使用资源
docker system prune -a		# 全删操作,谨慎操作!!

xargs:按行分隔管道输出的内容
system prune:清理系统"无用"的资源(停止的容器、未使用的网络、悬空镜像等)


结语

Docker 核心价值 :通过轻量级容器实现应用的标准化封装与跨环境一致运行。
镜像管理要点 :标签用于版本控制,save/load 适用于镜像迁移,rmi 需确保无容器依赖。
容器生命周期 :以 PID=1 进程为生命线,run -d 后台运行需保证主进程不退出。
数据持久化基础docker cp 实现宿主机与容器间文件传输,为后续数据卷学习铺垫。

!question\] 为什么 Docker 容器启动速度远快于虚拟机? 容器共享宿主机内核,无需启动完整操作系统,仅初始化隔离的用户空间进程。 \[!question\] 执行 `docker run -it centos:7 bash` 后退出终端,容器为何停止? 容器内 PID=1 的进程是 `bash`,退出后该进程终止,Docker 认为容器任务完成,自动停止。 \[!question\] `docker export` 与 `docker save` 的区别是什么? `export` 导出**容器快照** (不含历史层和元数据),生成新镜像时丢失构建信息;`save` 导出**完整镜像**(含所有层和标签),可完全还原。 \[!question\] 如何让容器在后台持续运行? 使用 `docker run -d` 并确保容器内主进程为**前台常驻进程** (如 `while true; do echo hello; sleep 1; done`)。 \[!question\] 删除镜像时提示 "image is being used by running container",如何解决? 先执行 `docker stop ` 停止容器,再 `docker rm ` 删除容器,最后 `docker rmi ` 删除镜像。

扩展

思考是否可以手动封装一个"容器"

当然可以!以下是从零开始,将 /opt/ls 目录制作成可用 Docker 镜像的完整简明步骤,适用于自定义 rootfs 场景(如最小化系统、调试环境等)。


最终目标

将一个能运行 lsbash 的独立目录 /opt/ls

→ 打包为 Docker 镜像 myroot:latest

→ 可用命令:docker run -it myroot


🧰 前提条件

  • 主机为 x86_64 Linux(CentOS/RHEL/Fedora/Ubuntu 等)
  • 已安装 docker
  • 当前用户可执行 sudo

🔧 操作步骤(全程复制粘贴即可)

  • 制作一个最小的可执行ls命令的依赖环境
bash 复制代码
# 1. 创建目标目录
rm -rf /opt/ls && mkdir -p /opt/ls/{bin,lib64,etc,proc,sys,tmp}

# 2. 复制基本命令(bash 和 ls)
cp /bin/bash /opt/ls/bin/
cp /bin/ls   /opt/ls/bin/

# 3. 复制必要共享库(自动提取依赖)
for lib in $(ldd /bin/bash /bin/ls | grep '/lib64/' | awk '{print $3}' | grep '^/'); do
    cp $lib /opt/ls/lib64/
done

# 补上动态链接器(重要!否则报 "no such file")
cp /lib64/ld-linux-x86-64.so.2 /opt/ls/lib64/

# 4. 复制其他关键库(可能未被 ldd 列出,但运行时需要)
cp /lib64/libcap.so.2.22 /opt/ls/lib64/ 2>/dev/null || true
ln -sf libcap.so.2.22 /opt/ls/lib64/libcap.so.2

cp /lib64/libpcre.so.1.2.0 /opt/ls/lib64/ 2>/dev/null || true
ln -sf libpcre.so.1.2.0 /opt/ls/lib64/libpcre.so.1

cp /lib64/libattr.so.1.1.0 /opt/ls/lib64/ 2>/dev/null || true
ln -sf libattr.so.1.1.0 /opt/ls/lib64/libattr.so.1

# 5. 设置 PATH 环境变量:创建启动脚本
tee /opt/ls/chroot.sh > /dev/null <<'EOF'
#!/bin/bash
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
exec /bin/bash "$@"
EOF
chmod +x /opt/ls/chroot.sh

# 6. (可选)创建 passwd 文件避免警告
mkdir -p /opt/ls/etc
tee /opt/ls/etc/passwd > /dev/null <<'EOF'
root:x:0:0:root:/root:/bin/bash
EOF

# 7. 用chroot测试运行环境是否可用
chroot /opt/ls/ /bin/bash --login
chroot /opt/docker /chroot.sh

chroot是docker的灵感来源,但chroot只实现了根目录的挂载点隔离,而进程、用户、网络等资源并没有完全隔离,而隔离运行环境就是docker诞生的目的。

  • 将这个环境打包成docker镜像
shell 复制代码
# 8. 打包 ls 并以ls为根目录
tar -cf ls -C ls .

# 9. 或者直接将目录 打包为 Docker 镜像
tar -C /opt/ls -c . | docker import - myroot:latest

# 10. 验证镜像是否可用
docker run --rm -it myroot /bin/ls /

# 进入交互式 shell
docker run --rm -it myroot /chroot.sh

-C ls:先进入 ls 目录
-c .:然后从 ls/ 内部打包所有文件

最终生成的 tar 文件里,路径就是:

bin/

lib64/

etc/

...


🐳 使用说明

bash 复制代码
# 启动容器并进入 bash
docker run --rm -it myroot /chroot.sh

# 在容器内可直接使用:
ls
ps aux
cat /etc/passwd

⚠️ 不支持 systemd, service 等守护进程操作(这是最小 rootfs)


📦 成果

你现在拥有了:

  • ✅ 一个基于真实 Linux 二进制构建的 rootfs
  • ✅ 包含 shell 和基础命令
  • ✅ 正确的库依赖和解释器
  • ✅ 可导入 Docker 的标准镜像

💡 扩展建议

想添加更多命令?比如 ip, ss, curl

bash 复制代码
cp /usr/sbin/ip   /opt/ls/bin/
cp /usr/bin/ss    /opt/ls/bin/
cp /usr/bin/curl  /opt/ls/bin/

然后拷贝依赖的库文件,含软链接对应的实际文件,最后重新打包即可。

相关推荐
眠りたいです2 小时前
Docker:Docker image常用命令使用及实操
运维·docker·容器·eureka·镜像
可爱又迷人的反派角色“yang”2 小时前
docker基本概念(一)
linux·运维·docker·容器
CHINAHEAO2 小时前
Docker 安装Bagisto详细过程
运维·docker·容器
RemainderTime3 小时前
(十)Spring Cloud Alibaba 2023.x:生产级 CI/CD 全链路实战(从 Dockerfile 到 Jenkins)
运维·spring cloud·ci/cd·docker·jenkins
Radan小哥3 小时前
Docker学习笔记—day013
笔记·学习·docker
mr_orange_klj3 小时前
关于docker远端缓存的AI问答(豆包)
docker
Justin_194 小时前
K8s常见问题
云原生·容器·kubernetes
tzhou6445212 小时前
Docker容器技术指南
运维·docker·容器
gaize121315 小时前
如何编写一个简单的服务器应用程序?
服务器·云计算