Ubuntu 20.04 LTS 安装 Docker 指南

Ubuntu 20.04 LTS 安装 Docker 指南

  • 前言
    • [1. 前置检查](#1. 前置检查)
    • [2. 标准安装步骤](#2. 标准安装步骤)
    • [3. 验证安装](#3. 验证安装)
    • [4. 常见报错与解决方案 🚑](#4. 常见报错与解决方案 🚑)
      • [❌ 问题 1:GPG 密钥错误或仓库签名无效](#❌ 问题 1:GPG 密钥错误或仓库签名无效)
      • [❌ 问题 2:下载速度极慢或连接超时](#❌ 问题 2:下载速度极慢或连接超时)
      • [❌ 问题 3:`permission denied while trying to connect to the Docker daemon socket`](#❌ 问题 3:permission denied while trying to connect to the Docker daemon socket)
      • [❌ 问题 4:容器启动后立即退出 (`Exited (0)` 或 `Exited (127)`)](#❌ 问题 4:容器启动后立即退出 (Exited (0)Exited (127)))
      • [❌ 问题 5:`nvidia-smi` 在容器内无法运行](#❌ 问题 5:nvidia-smi 在容器内无法运行)
    • [5. Docker 基础使用速查](#5. Docker 基础使用速查)
      • [💡 终极建议](#💡 终极建议)
      • [⚠️ 重要前提](#⚠️ 重要前提)
    • [6. 额外提示:修改存储位置](#6. 额外提示:修改存储位置)
      • 操作步骤
        • [1. 停止 Docker 服务](#1. 停止 Docker 服务)
        • [2. 创建新的数据目录](#2. 创建新的数据目录)
        • [3. 迁移现有数据](#3. 迁移现有数据)
        • [4. 验证迁移(可选但推荐)](#4. 验证迁移(可选但推荐))
        • [5. 配置 Docker 使用新路径](#5. 配置 Docker 使用新路径)
        • [6. 重载配置并重启 Docker](#6. 重载配置并重启 Docker)
        • [7. 验证新配置](#7. 验证新配置)
        • [8. 清理旧数据(释放系统盘空间)](#8. 清理旧数据(释放系统盘空间))
      • [💡 额外提示:关于 AI 开发的存储规划](#💡 额外提示:关于 AI 开发的存储规划)
  • 参考

前言

1. 前置检查

适用系统 :Ubuntu 20.04 LTS (Focal Fossa)
更新时间 :2026年3月
目标:从零开始安装最新稳定版 Docker,并解决常见报错。

在开始之前,请确保你的系统满足以下条件:

  • 系统版本 :必须是 64 位 Ubuntu 20.04 LTS。

    bash 复制代码
    lsb_release -a
    # 确认 Codename 为 focal
  • 内核版本 :Docker 需要 4.15 或更高版本的内核。

    bash 复制代码
    uname -r
  • 权限 :你需要拥有 sudo 权限的账户。

  • 网络:确保服务器可以访问互联网(如果无法访问官方源,请参考下文"国内源加速"部分)。


2. 标准安装步骤

第一步:卸载旧版本(可选但推荐)

如果你之前安装过旧版本的 Docker(如 docker, docker.io, containerd),建议先卸载以避免冲突。

bash 复制代码
sudo apt-get remove docker docker-engine docker.io containerd runc

第二步:设置仓库

Docker 官方推荐使用自己的仓库来获取最新版本,而不是 Ubuntu 默认仓库(通常版本较旧)。

  1. 更新软件包索引并安装依赖

    bash 复制代码
    sudo apt-get update
    sudo apt-get install -y ca-certificates curl gnupg lsb-release
  2. 添加 Docker 官方 GPG 密钥

    bash 复制代码
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
  3. 设置稳定的仓库源

    bash 复制代码
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

第三步:安装 Docker Engine

  1. 再次更新索引(让系统识别新的 Docker 仓库):

    bash 复制代码
    sudo apt-get update
  2. 安装最新版 Docker

    bash 复制代码
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    注:如果需要安装特定版本,可以使用 apt-cache madison docker-ce 查看可用版本,然后指定版本号安装。

第四步:配置非 root 用户权限(重要!)

默认情况下,Docker 命令需要 sudo 权限。为了方便,可以将当前用户加入 docker 用户组。

bash 复制代码
sudo usermod -aG docker $USER

注意 :执行完此命令后,你必须注销并重新登录 (或运行 newgrp docker)才能生效,否则可能会遇到 permission denied 错误。

第五步:启动并设置开机自启

bash 复制代码
sudo systemctl start docker
sudo systemctl enable docker

3. 验证安装

运行经典的 "Hello World" 镜像来验证安装是否成功:

bash 复制代码
sudo docker run hello-world

如果看到类似 Hello from Docker! 的欢迎信息,说明安装成功!

bash 复制代码
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

4. 常见报错与解决方案 🚑

这是本教程的核心部分,总结了在实际操作中容易遇到的坑。

❌ 问题 1:GPG 密钥错误或仓库签名无效

现象 :执行 apt-get update 时报错 NO_PUBKEYThe following signatures were invalid
原因 :密钥文件路径错误或权限不对,或者官方密钥更新。
解决

严格按照上述"第二步"重新执行添加密钥的命令。特别是新版 Docker 推荐使用 /etc/apt/keyrings/ 目录。

bash 复制代码
# 强制重新下载并转换密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 重新生成源列表
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

❌ 问题 2:下载速度极慢或连接超时

现象curl 下载密钥或 apt-get update 时卡住不动,提示 Connection timed out
原因 :无法直接访问 Docker 官方源(位于国外)。
解决使用国内镜像源(阿里云/腾讯云/清华源)

在安装步骤的"设置仓库源"环节,替换为阿里云的源:

bash 复制代码
# 删除之前可能添加的官方源
sudo rm /etc/apt/sources.list.d/docker.list

# 添加阿里云源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

配置镜像加速器(可选) :编辑 /etc/docker/daemon.json(如果没有则创建):

json 复制代码
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev",
    "https://docker.aityp.com/r/docker.io"
  ]
}
bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

❌ 问题 3:permission denied while trying to connect to the Docker daemon socket

现象 :运行 docker psdocker run 时报错,提示权限被拒绝。
原因 :当前用户不在 docker 用户组中,或者组变更未生效。
解决

  1. 确认已执行 sudo usermod -aG docker $USER
  2. 必须重新登录终端 ,或者执行 newgrp docker 刷新组权限。
  3. 临时方案:在命令前加 sudo(如 sudo docker ps),但这只是权宜之计。

❌ 问题 4:容器启动后立即退出 (Exited (0)Exited (127))

现象 :运行 docker run -it ubuntu bash 后,容器瞬间停止,或者进入后提示 command not found
原因

  • Exited (0) :容器内的主进程(如 bash)没有前台任务,执行完就退出了。通常是因为没有加 -it 参数,或者脚本执行完毕。

  • Exited (127) :找不到命令。可能是镜像里根本没有 /bin/bash(极简镜像),或者路径写错了。
    解决

  • 务必加上 -it 参数docker run -it <镜像名> /bin/bash

  • 如果 bash 不存在 :尝试使用 sh 进入:docker run -it <镜像名> /bin/sh

  • 进入后立刻安装工具 :纯净的 Ubuntu 镜像非常小,很多命令(如 vim, ping, apt 有时甚至需要更新源后才能用)都没有。进入后第一时间执行:

    bash 复制代码
    apt-get update
    apt-get install -y vim net-tools curl
  • 复用已创建的容器 :如果容器已经退出了,不要重新 run,用 start 命令把它拉起来:

    bash 复制代码
    docker start -ai <容器ID或名称>

❌ 问题 5:nvidia-smi 在容器内无法运行

现象 :宿主机有显卡,但在容器内运行 nvidia-smi 提示找不到命令或驱动。
原因 :普通的 Docker 镜像不包含 NVIDIA 驱动库,且启动时未挂载 GPU。
解决

  1. 确保宿主机安装了 NVIDIA Container Toolkit

  2. Docker拉取命令

    bash 复制代码
    docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.1.1-base
    docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.1.1-base  docker.io/nvidia/cuda:11.1.1-base
  3. 启动容器时必须加上 --gpus all 参数:

    bash 复制代码
    docker run -it --gpus all nvidia/cuda:11.1.1-base /bin/bash
  4. 不要使用纯 ubuntu 镜像跑 GPU 任务,请使用 nvidia/cuda 系列镜像。


5. Docker 基础使用速查

安装完成后,这些命令你最常用:

功能 命令示例 说明
查看镜像 docker images 列出本地下载的所有镜像
拉取镜像 docker pull ubuntu:20.04 从网上下载镜像
启动容器 docker run -it --name my-test ubuntu:20.04 /bin/bash 创建并启动一个新容器
重启容器 docker start -ai my-test 启动一个已停止的容器并连入
查看运行中 docker ps 只看正在运行的容器
查看所有 docker ps -a 看所有容器(包括已停止的)
进入容器 docker exec -it my-test /bin/bash 在一个正在运行的容器里开新终端
删除容器 docker rm <容器ID> 删除已停止的容器(运行中的需加 -f
删除镜像 docker rmi <镜像ID> 删除本地镜像
查看日志 docker logs <容器ID> 查看容器输出日志

💡 终极建议

对于深度学习用户,不要纠结于纯净的 ubuntu 镜像

请直接使用 NVIDIA 官方提供的 CUDA 镜像,它们已经基于 Ubuntu 配置好了大部分环境:

bash 复制代码
# 推荐:直接启动一个带 GPU 支持的环境
docker run -it --gpus all --name gpu-dev nvidia/cuda:11.1.1-base /bin/bash

这样你可以跳过繁琐的驱动配置,直接进入开发状态!

这是一个非常关键的操作!对于 AI 开发来说,镜像(Image)和容器层(Container Layer)往往非常大(例如 PyTorch 或 CUDA 镜像动辄 10GB+),如果不迁移,系统盘很快就会爆满导致服务器无法启动或 Docker 崩溃。

以下是将 Docker 数据目录(默认 /var/lib/docker)迁移到大容量数据盘(假设挂载在 /data)的标准操作步骤

⚠️ 重要前提

  1. 停止 Docker 服务:迁移过程中 Docker 必须处于停止状态。
  2. 确认大盘路径 :假设你的大容量磁盘已挂载到 /data 目录。如果不是,请替换为你实际的大盘路径(如 /mnt/sda1)。
  3. 备份意识:虽然此操作通常安全,但在生产环境操作前建议对重要数据进行快照或备份。

6. 额外提示:修改存储位置

  • 将 Docker 数据目录迁移到大容量数据盘。
  • 这是一个非常关键的操作!对于 AI 开发来说,镜像(Image)和容器层(Container Layer)往往非常大(例如 PyTorch 或 CUDA 镜像动辄 10GB+),如果不迁移,系统盘很快就会爆满导致服务器无法启动或 Docker 崩溃。
  • 以下是将 Docker 数据目录(默认 /var/lib/docker)迁移到大容量数据盘(假设挂载在 /data)的标准操作步骤。

操作步骤

1. 停止 Docker 服务
bash 复制代码
sudo systemctl stop docker
# 可选:确认是否还有容器在运行
docker ps 
# (此时应该报错或无输出,因为服务已停)
2. 创建新的数据目录

在大盘上创建新的 docker 目录:

bash 复制代码
# 假设大盘挂载在 /data
sudo mkdir -p /data/docker-data
3. 迁移现有数据

使用 rsync 命令将原有数据完整复制到新目录。

  • -a: 归档模式,保留权限、软链接等所有属性。
  • -v: 显示进度。
  • -P: 显示进度并支持断点续传(如果数据量大,这个很重要)。
bash 复制代码
sudo rsync -avP /var/lib/docker/ /data/docker-data/

> 注意:命令末尾的斜杠 / 很重要,它表示复制目录下的内容,而不是复制目录本身。

4. 验证迁移(可选但推荐)

简单检查一下新目录下是否有文件,且大小看起来正常:

bash 复制代码
ls -lh /data/docker-data
# 你应该能看到 containers, image, volumes 等文件夹
5. 配置 Docker 使用新路径

有两种方法,推荐使用 daemon.json 方法,因为它更规范且不易出错。

方法 A:修改 /etc/docker/daemon.json (推荐)

编辑配置文件:

bash 复制代码
sudo nano /etc/docker/daemon.json

添加或修改 "data-root" 字段(注意:旧版本 Docker 叫 "graph",新版本推荐用 "data-root"):

json 复制代码
{
  "data-root": "/data/docker-data",
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://huecker.io"
  ]
}

(如果你之前配置过镜像加速器,请保留 registry-mirrors 部分,只新增 data-root)

保存并退出 (Ctrl+O, Enter, Ctrl+X)。

方法 B:修改 systemd 服务文件 (备选,不推荐除非 A 失效)

如果需要,可以编辑 /etc/systemd/system/docker.service.d/docker.conf 添加 --data-root /data/docker-data,但通常方法 A 足够。

6. 重载配置并重启 Docker
bash 复制代码
sudo systemctl daemon-reload
sudo systemctl start docker
7. 验证新配置

运行以下命令查看 Docker 信息:

bash 复制代码
docker info | grep "Docker Root Dir"

预期输出:

text 复制代码
Docker Root Dir: /data/docker-data

如果显示的是你的新路径,说明迁移成功!

8. 清理旧数据(释放系统盘空间)

确认 Docker 正常运行,且能拉取镜像、运行容器无误后,删除旧目录以释放系统盘空间:

bash 复制代码
# 再次确认新路径工作正常
docker run --rm hello-world 

# 如果上面成功,删除旧数据
sudo rm -rf /var/lib/docker

💡 额外提示:关于 AI 开发的存储规划

既然你在做 AI 开发,除了 Docker 目录,还有两个地方容易爆满,建议一并规划到大盘:

  1. 模型权重文件 (Model Weights):

    • HuggingFace 下载的模型 (~/.cache/huggingface)
    • PyTorch Hub 缓存 (~/.cache/torch)
    • 建议:在代码中设置环境变量,将这些缓存指向大盘。
    bash 复制代码
    export HF_HOME=/data/huggingface_cache
    export TORCH_HOME=/data/torch_cache
    # 写入 ~/.bashrc 以便永久生效
    echo "export HF_HOME=/data/huggingface_cache" >> ~/.bashrc
    echo "export TORCH_HOME=/data/torch_cache" >> ~/.bashrc
    source ~/.bashrc
  2. 数据集 (Datasets):

    • 不要将大型数据集放在容器内部(容器删除数据就没了),也不要放在系统盘。
    • 最佳实践 :将数据存放在大盘(如 /data/datasets),然后在运行容器时通过 -v 挂载进去。
    bash 复制代码
    docker run -v /data/datasets:/datasets -v /data/models:/models ...

这样配置后,你的系统盘将只保留操作系统和日志,所有重型数据都在数据盘,服务器会更加稳定。

参考

1\] https://docs.docker.com/desktop/setup/install/linux/ubuntu/ \[2\] https://docs.ultralytics.com/guides/docker-quickstart/ \[3\] https://blog.csdn.net/qq_27370437/article/details/124945605 > * 由于本人水平有限,难免出现错漏,敬请批评改正。 > * 更多精彩内容,可点击进入[Python日常小操作](https://blog.csdn.net/friendshiptang/category_11653584.html)专栏、[OpenCV-Python小应用](https://blog.csdn.net/friendshiptang/category_11975851.html)专栏、[YOLO系列](https://blog.csdn.net/friendshiptang/category_12168736.html)专栏、[自然语言处理](https://blog.csdn.net/friendshiptang/category_12396029.html)专栏、[人工智能混合编程实践](https://blog.csdn.net/friendshiptang/category_12915912.html)专栏或我的[个人主页](https://blog.csdn.net/FriendshipTang)查看 > * [YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)](https://blog.csdn.net/FriendshipTang/article/details/158886725) > * [PaddleOCR:Win10上安装使用PPOCRLabel标注工具](https://blog.csdn.net/FriendshipTang/article/details/156572297) > * [目标检测:使用自己的数据集微调DEIMv2进行物体检测](https://blog.csdn.net/FriendshipTang/article/details/153635354) > * [图像分割:PyTorch从零开始实现SegFormer语义分割](https://blog.csdn.net/FriendshipTang/article/details/152268871) > * [图像超分:使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建](https://blog.csdn.net/FriendshipTang/article/details/153331274) > * [图像生成:PyTorch从零开始实现一个简单的扩散模型](https://blog.csdn.net/FriendshipTang/article/details/154358228) > * [Stable Diffusion:使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型](https://blog.csdn.net/FriendshipTang/article/details/153737733) > * [图像超分:使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建](https://blog.csdn.net/FriendshipTang/article/details/153314081) > * [Anomalib:使用Anomalib 2.1.0训练自己的数据集进行异常检测](https://blog.csdn.net/FriendshipTang/article/details/150561799) > * [Anomalib:在Linux服务器上安装使用Anomalib 2.1.0](https://blog.csdn.net/FriendshipTang/article/details/150499849) > * [人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理](https://blog.csdn.net/FriendshipTang/article/details/153200335) > * [人工智能混合编程实践:C++调用封装好的DLL进行FP16图像超分重建(v3.0)](https://blog.csdn.net/FriendshipTang/article/details/154637411) > * [隔离系统Python:源码编译3.11.8到自定义目录(含PGO性能优化)](https://blog.csdn.net/FriendshipTang/article/details/154641702) > * [在线机的Python环境迁移到离线机上](https://blog.csdn.net/FriendshipTang/article/details/151580480) > * [Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件](https://blog.csdn.net/FriendshipTang/article/details/151617965) > * [Ultralytics:使用 YOLO11 进行速度估计](https://blog.csdn.net/FriendshipTang/article/details/151989345) > * [Ultralytics:使用 YOLO11 进行物体追踪](https://blog.csdn.net/FriendshipTang/article/details/151988142) > * [Ultralytics:使用 YOLO11 进行物体计数](https://blog.csdn.net/FriendshipTang/article/details/151866467) > * [Ultralytics:使用 YOLO11 进行目标打码](https://blog.csdn.net/FriendshipTang/article/details/151868450) > * [人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理](https://blog.csdn.net/FriendshipTang/article/details/146188546) > * [人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割](https://blog.csdn.net/FriendshipTang/article/details/149050653) > * [人工智能混合编程实践:C++调用Python ONNX进行图像超分重建](https://blog.csdn.net/FriendshipTang/article/details/146210258) > * [人工智能混合编程实践:C++调用Python AgentOCR进行文本识别](https://blog.csdn.net/FriendshipTang/article/details/146336798) > * [通过计算实例简单地理解PatchCore异常检测](https://blog.csdn.net/FriendshipTang/article/details/148877810) > * [Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集](https://blog.csdn.net/FriendshipTang/article/details/149101072) > * [YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型](https://blog.csdn.net/FriendshipTang/article/details/132498898) > * [基于DETR的人脸伪装检测](https://blog.csdn.net/FriendshipTang/article/details/131670277) > * [YOLOv7训练自己的数据集(口罩检测)](https://blog.csdn.net/FriendshipTang/article/details/126513426) > * [YOLOv8训练自己的数据集(足球检测)](https://blog.csdn.net/FriendshipTang/article/details/129035180) > * [YOLOv5:TensorRT加速YOLOv5模型推理](https://blog.csdn.net/FriendshipTang/article/details/131023963) > * [YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU](https://blog.csdn.net/FriendshipTang/article/details/129969044) > * [玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测](https://blog.csdn.net/FriendshipTang/article/details/126696542) > * [YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制](https://blog.csdn.net/FriendshipTang/article/details/130396540) > * [YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层](https://blog.csdn.net/FriendshipTang/article/details/130375883) > * [Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集](https://blog.csdn.net/FriendshipTang/article/details/131979248) > * [YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)](https://blog.csdn.net/FriendshipTang/article/details/131987249) > * [使用Kaggle GPU资源免费体验Stable Diffusion开源项目](https://blog.csdn.net/FriendshipTang/article/details/132238734) > * [Stable Diffusion:在服务器上部署使用Stable Diffusion WebUI进行AI绘图(v2.0)](https://blog.csdn.net/FriendshipTang/article/details/150287538) > * [Stable Diffusion:使用自己的数据集微调训练LoRA模型(v2.0)](https://blog.csdn.net/FriendshipTang/article/details/150283800)

相关推荐
袁小皮皮不皮2 小时前
【HCIA】第二章 ipv4协议以及子网划分与集合
linux·运维·服务器·网络·网络协议·tcp/ip·信息与通信
暴力求解2 小时前
Linux---ELF动态库加载
linux·运维·服务器
技术宅星云2 小时前
【极客的Ubuntu 操作系统维护手册】
linux·运维·ubuntu
Ken_11152 小时前
Linux放开端口
linux·服务器·网络
艾莉丝努力练剑2 小时前
System V IPC内核实现精析
linux·运维·服务器·网络·c++·人工智能·学习
海盗猫鸥2 小时前
「Linux工具」yum和vim
linux·编辑器·vim
缘友一世2 小时前
ubuntu24.04最新内核6.17.0.19卸载折腾记
linux·kernel
小璐资源网2 小时前
Nginx安装教程:Windows/Linux/macOS全平台覆盖
linux·windows·nginx
万象.2 小时前
docker虚拟化,容器化的原理与实现
运维·docker·容器