在这里插入图片描述

离线环境下 在 RHEL (Red Hat Enterprise Linux) 系统上安装 DockerDocker Compose,需要提前在有网络的环境中下载相关 RPM 包及依赖,然后在目标机器上进行安装。以下是比较完整的步骤:

1. Docker及Docker-Compose离线安装

RHEL 9.4 上要在离线环境安装 Docker + Docker Compose,可以更有针对性地处理。因为 RHEL9 已经不再支持旧的 Docker CE 官方 YUM 源(主要推荐 Podman),所以我们必须提前在有网环境下载好 RHEL9 对应的 RPM 包。下面是完整流程:

1.1、在有网络的 RHEL 9.4 机器上准备 RPM 包

  1. 启用 yum-utils

    sudo dnf install -y yum-utils
    
  2. 添加 Docker 官方仓库(只在有网环境机器上执行)

    sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
    
  3. 下载需要的 RPM 包及依赖

    mkdir docker-rpms && cd docker-rpms
    sudo dnf download \docker-ce \docker-ce-cli \containerd.io \docker-buildx-plugin \docker-compose-plugin \--resolve
    

    --resolve 参数会把所有依赖包也一并下载。

  4. 打包带走

    tar czvf docker-rhel9.4.tar.gz docker-rpms/
    

    然后通过 U 盘 / 内网工具传到离线 RHEL9.4 机器。


1.2 在离线的 RHEL 9.4 机器上安装

  1. 拷贝并解压

    tar xzvf docker-rhel9.4.tar.gz
    cd docker-rpms
    
  2. 安装所有 RPM

    sudo dnf install -y *.rpm
    

    推荐用 dnf install 而不是 rpm -ivh,因为 dnf 能自动处理依赖关系。

  3. 启动 Docker 并设置开机自启

    sudo systemctl enable --now docker
    sudo systemctl status docker
    

1.3 安装 Docker Compose(离线)

在 RHEL9 上推荐使用 plugin 版本docker compose 命令,而不是 docker-compose)。
如果你已经在下载时加了 docker-compose-plugin,那么可以直接使用:

docker compose version

如果你需要旧版的独立二进制:

  1. 在有网机器下载:
  • https://github.com/docker/compose/releases

    curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o docker-compose
    chmod +x docker-compose
    
  1. 拷贝到离线机器的 /usr/local/bin/docker-compose

1.4 验证

docker run hello-world
docker compose version   # plugin 方式
# 或
docker-compose version   # 二进制方式

2. 非管理员用户配置

在 RHEL(包括 RHEL 9.4)上通过 sudo dnf install 安装完 Docker CEDocker Compose 之后,默认只有 root 用户 或者 属于 docker 用户组的用户 才能运行 docker 命令。


2.1 默认情况

  • 你安装好后:

    • root 用户可以直接运行 dockerdocker compose

    • 普通用户(不在 docker 组里)运行时会提示:

      Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
      

      因为 /var/run/docker.sock 只允许 root 和 docker 组访问。


2.2 让其他用户也能用 Docker 的方法

  1. 把用户加入 docker 组

    sudo usermod -aG docker <用户名>
    

    例如:

    sudo usermod -aG docker alice
    

    -aG 表示追加到组里,不会覆盖原有组。

  2. 让组生效
    用户需要重新登录一次(退出再登录,或者 newgrp docker 临时生效)。

  3. 验证
    普通用户直接运行:

    docker ps
    docker compose version
    

    能正常输出就说明权限生效了。


2.3 注意事项

  • 安装时用 sudo 只是确保系统文件、systemd 服务、二进制安装位置正确。
  • 运行时是否需要 sudo,取决于用户是否在 docker 组。
  • 如果你想限制哪些人能用 Docker,可以只给特定用户加到 docker 组。

👉 也就是说:
安装完之后,其他用户默认不能直接用,必须先加到 docker 用户组。


3. 批量用户添加

下面给你一份在 RHEL 9.4 上可用的 Bash 脚本,帮你把指定用户或整机的「普通用户」批量加入 docker 组(从而无需 sudo 就能用 docker / docker compose)。

把下面内容保存为 enable-docker-users.sh,然后 chmod +x enable-docker-users.sh

#!/usr/bin/env bash
# enable-docker-users.sh
# 批量将用户加入 docker 组(或移除)
# 适用于 RHEL 9.4 及相近发行版set -euo pipefailusage() {cat <<'EOF'
用法:sudo ./enable-docker-users.sh [选项] [用户名1 用户名2 ...]
选项:--all            把所有“普通人类用户”(UID>=1000,shell 非 nologin)加入 docker 组--file FILE      从文件批量读取用户名(每行一个)--remove         从 docker 组移除这些用户(默认是加入)--dry-run        只显示将执行的操作,不实际变更-h, --help       显示帮助示例:sudo ./enable-docker-users.sh alice bobsudo ./enable-docker-users.sh --allsudo ./enable-docker-users.sh --file users.txtsudo ./enable-docker-users.sh --all --dry-runsudo ./enable-docker-users.sh --remove alice
EOF
}require_root() {if [[ ${EUID} -ne 0 ]]; thenecho "请用 root 或 sudo 运行。" >&2exit 1fi
}ensure_docker_group() {if ! getent group docker >/dev/null; thenecho "[INFO] 未发现 docker 组,正在创建..."groupadd dockerfi
}list_human_users() {# UID >= 1000,shell 不是 nologin/falsegetent passwd | awk -F: '$3>=1000 && $7!~/nologin|false/ {print $1}'
}DRY_RUN=0
REMOVE=0
USERS=()# 解析参数
while (( "$#" )); docase "$1" in--all)mapfile -t ALL_USERS < <(list_human_users)USERS+=("${ALL_USERS[@]}")shift;;--file)[[ $# -ge 2 ]] || { echo "缺少 --file 参数的文件路径"; exit 1; }mapfile -t FILE_USERS < <(grep -Ev '^\s*($|#)' "$2" | awk '{print $1}')USERS+=("${FILE_USERS[@]}")shift 2;;--dry-run)DRY_RUN=1shift;;--remove)REMOVE=1shift;;-h|--help)usage; exit 0;;-*)echo "未知选项:$1"; usage; exit 1;;*)USERS+=("$1"); shift;;esac
doneif [[ ${#USERS[@]} -eq 0 ]]; thenecho "未指定用户。"usageexit 1
firequire_root
ensure_docker_group# 去重
readarray -t USERS < <(printf "%s\n" "${USERS[@]}" | awk 'NF' | sort -u)ACTION="加入"
CMD="usermod -aG docker"
if [[ $REMOVE -eq 1 ]]; thenACTION="移除"CMD="gpasswd -d"
fiecho "[INFO] 计划${ACTION} docker 组的用户:${#USERS[@]} 个"
for u in "${USERS[@]}"; doif ! id "$u" &>/dev/null; thenecho "[WARN] 用户不存在:$u(跳过)"continuefiif [[ $DRY_RUN -eq 1 ]]; thenif [[ $REMOVE -eq 1 ]]; thenecho "DRY-RUN: gpasswd -d $u docker"elseecho "DRY-RUN: usermod -aG docker $u"fielseif [[ $REMOVE -eq 1 ]]; thenif id -nG "$u" | tr ' ' '\n' | grep -qx docker; thengpasswd -d "$u" dockerecho "[OK] 已从 docker 组移除:$u"elseecho "[INFO] 用户不在 docker 组:$u(跳过)"fielse# 加组(即使已在组内也安全)usermod -aG docker "$u"echo "[OK] 已加入 docker 组:$u"fifi
doneecho
echo "完成。注意事项:"
echo "1) 用户需要重新登录会话后生效(或执行:newgrp docker)。"
echo "2) 可用命令验证:docker ps  和  docker compose version"

3.1 使用步骤(推荐)

  1. 保存并授权执行:
chmod +x enable-docker-users.sh
  1. 将所有普通用户加入 docker 组:
sudo ./enable-docker-users.sh --all

或只加指定账号:

sudo ./enable-docker-users.sh alice bob
  1. 让用户重新登录(或各自执行一次 newgrp docker),再用:
docker ps
docker compose version

3.2 小贴士

  • 想先看看会做什么再执行,可用 --dry-run
  • 需要回滚/移除权限:sudo ./enable-docker-users.sh --remove alice
  • 脚本会自动创建 docker 组(若不存在)。

4. 旧环境的清理

下面是一份在 RHEL 9.4 上“一键卸载 Docker & Docker Compose”的脚本。支持可选参数来删除容器/镜像彻底清空数据目录


4.1 使用方法

# 1) 保存脚本
cat > uninstall_docker_rhel9.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefailRED='\033[31m'; GREEN='\033[32m'; YELLOW='\033[33m'; NC='\033[0m'confirm() {local prompt="${1:-Are you sure?} [y/N] "if [[ "${ASSUME_YES:-0}" == "1" ]]; thenreturn 0firead -r -p "$prompt" ans[[ "$ans" == "y" || "$ans" == "Y" ]]
}log()   { echo -e "${GREEN}[OK]${NC} $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
err()   { echo -e "${RED}[ERR]${NC}  $*" >&2; }usage() {cat <<USAGE
Usage: sudo ./uninstall_docker_rhel9.sh [options]Options:--remove-all    停止前先删除所有容器、镜像、卷(危险操作)--purge-data    卸载后删除数据目录:/var/lib/docker 与 /var/lib/containerd(危险操作)--yes           对所有确认直接回答 yes(无人值守)-h, --help      显示帮助说明:
- 默认仅卸载 Docker 相关软件包与 docker-compose 二进制(若存在),不会删除数据目录。
- 如需兼容旧脚本,可保留 --remove-all 与 --purge-data 一起使用进行“全清理”。
USAGE
}REMOVE_ALL=0
PURGE_DATA=0
ASSUME_YES=0for arg in "$@"; docase "$arg" in--remove-all) REMOVE_ALL=1 ;;--purge-data) PURGE_DATA=1 ;;--yes)        ASSUME_YES=1 ;;-h|--help)    usage; exit 0 ;;*) err "未知参数: $arg"; usage; exit 1 ;;esac
doneif [[ $EUID -ne 0 ]]; thenerr "请使用 root 权限运行(加 sudo)。"exit 1
fiecho "=== RHEL 9.4 Docker/Compose 卸载脚本 ==="# 1) 尝试删除所有容器/镜像/卷(可选)
if [[ $REMOVE_ALL -eq 1 ]]; thenwarn "将删除所有容器、镜像、未使用的卷,这不可恢复!"if confirm "确认继续删除容器/镜像/卷吗?"; thenif command -v docker >/dev/null 2>&1; thensystemctl is-active --quiet docker && systemctl stop docker || truedocker ps -aq >/dev/null 2>&1 && \( [[ -z "$(docker ps -aq)" ]] || docker rm -f $(docker ps -aq) ) || truedocker images -q >/dev/null 2>&1 && \( [[ -z "$(docker images -q)" ]] || docker rmi -f $(docker images -q) ) || true# 删除未使用的卷(安全起见放在最后)if docker volume ls -q >/dev/null 2>&1; thenVOLS=$(docker volume ls -q || true)[[ -z "$VOLS" ]] || docker volume rm -f $VOLS || truefilog "已尝试删除所有容器/镜像/卷。"elsewarn "未检测到 docker 命令,跳过容器/镜像/卷删除。"fielsewarn "已取消删除容器/镜像/卷。"fi
fi# 2) 停止并禁用服务
for svc in docker.service docker.socket containerd.service; dosystemctl stop "$svc"  >/dev/null 2>&1 || truesystemctl disable "$svc" >/dev/null 2>&1 || true
done
systemctl daemon-reload || true
log "已停止并禁用 docker 与 containerd 服务(如存在)。"# 3) 卸载通过 dnf 安装的包
# 常见包名列表(按 Docker 官方仓库/插件命名)
PKGS=(dockerdocker-cedocker-ce-clidocker-ce-rootless-extrasdocker-buildx-plugindocker-compose-plugindocker-scan-plugincontainerd.io
)TO_REMOVE=()
for p in "${PKGS[@]}"; doif rpm -q "$p" >/dev/null 2>&1; thenTO_REMOVE+=("$p")fi
doneif [[ ${#TO_REMOVE[@]} -gt 0 ]]; thenecho "将卸载软件包: ${TO_REMOVE[*]}"if confirm "确认卸载以上软件包吗?"; thendnf remove -y "${TO_REMOVE[@]}"log "已卸载 dnf 安装的 Docker 相关包。"elsewarn "已取消 dnf 软件包卸载。"fi
elsewarn "未发现通过 dnf 安装的 Docker 相关包。"
fi# 4) 删除手动安装的 docker-compose 二进制
if [[ -f /usr/local/bin/docker-compose ]]; thenif confirm "检测到 /usr/local/bin/docker-compose,是否删除?"; thenrm -f /usr/local/bin/docker-composelog "已删除 /usr/local/bin/docker-compose。"elsewarn "保留 /usr/local/bin/docker-compose。"fi
elselog "未发现手动安装的 docker-compose 二进制。"
fi# 5) 清理配置与运行时残留(温和清理)
if [[ -d /etc/docker ]]; thenif confirm "是否删除 /etc/docker 配置目录?(如 daemon.json 等)"; thenrm -rf /etc/dockerlog "已删除 /etc/docker。"elsewarn "保留 /etc/docker。"fi
fi# 6) 彻底清空数据目录(可选,危险)
if [[ $PURGE_DATA -eq 1 ]]; thenwarn "将永久删除 /var/lib/docker 与 /var/lib/containerd,所有镜像/层/卷数据将丢失!"if confirm "确认继续彻底清空数据目录吗?"; thenrm -rf /var/lib/docker /var/lib/containerdlog "已删除数据目录 /var/lib/docker 与 /var/lib/containerd。"elsewarn "已取消删除数据目录。"fi
fi# 7) 最终检查
echo "=== 验证 ==="
if command -v docker >/dev/null 2>&1; thenwarn "docker 命令仍存在:$(command -v docker)"
elselog "docker 命令已不存在。"
fiif docker compose version >/dev/null 2>&1; thenwarn "'docker compose' 子命令仍可用(可能仍有残留或 PATH 中有其它版本)。"
elselog "'docker compose' 子命令不可用。"
fiif [[ -x /usr/local/bin/docker-compose ]]; thenwarn "旧版 docker-compose 二进制仍存在:/usr/local/bin/docker-compose"
elselog "旧版 docker-compose 二进制不存在。"
fiecho -e "${GREEN}完成。${NC}"
EOF# 2) 赋予执行权限
chmod +x uninstall_docker_rhel9.sh# 3) 试运行(会交互确认)
sudo ./uninstall_docker_rhel9.sh

4.2 无人值守(全部清理)

危险:会删除容器、镜像、卷和所有数据目录!

sudo ./uninstall_docker_rhel9.sh --remove-all --purge-data --yes

4.3 说明

  • 默认行为是卸载软件包并清理可能的旧版 docker-compose 二进制,不会删除你的数据目录。
  • --remove-all 会在卸载前尝试通过 docker 命令删除所有容器/镜像/卷(如果 docker 仍可用)。
  • --purge-data 会直接 rm -rf /var/lib/docker /var/lib/containerd,请务必确认没有需要保留的数据。
  • 如果系统中从未安装过某些软件包或文件,脚本会自动跳过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94064.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94064.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/94064.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react相关知识

1.类组件和函数组件&#xff08;1&#xff09;类组件import React, { Component } from react;class UserProfile extends Component {constructor(props) {super(props);this.state {userData: null,isLoading: true,};this.timerId null;}componentDidMount() {// 模拟 API…

算法第五十五天:图论part05(第十一章)

并查集理论基础并查集主要有两个功能&#xff1a;将两个元素添加到一个集合中。判断两个元素在不在同一个集合class UnionFind:def __init__(self, n):"""初始化并查集"""self.n nself.father list(range(n)) # 每个节点自己是根self.rank […

雨雾天气漏检率骤降80%!陌讯多模态车牌识别方案实战解析

一、行业痛点&#xff1a;车牌识别的天气敏感性据《智慧交通系统检测白皮书》统计&#xff0c;雨雾环境下传统车牌识别漏检率高达42.7%&#xff08;2024年数据&#xff09;。主要存在三大技术瓶颈&#xff1a;1.​​水膜干扰​​&#xff1a;挡风玻璃水渍导致车牌区域纹理模糊2…

PostgreSQL15——查询详解

PostgreSQL15查询详解一、简单查询1.1、单表查询1.2、无表查询1.3、消除重复结果1.4、使用注释二、查询条件2.1、WHERE子句2.2、模式匹配2.3、空值判断2.4、复杂条件三、排序显示3.1、单列排序3.2、多列排序3.3、空值排序四、限定结果数量4.1、Top-N查询4.2、分页查询4.3、注意…

03-容器数据卷

卷就是目录或文件&#xff0c;存在于一个或多个容器中&#xff0c;由 docker 挂载到容器&#xff0c;但不属于联合文件系统&#xff0c;因此能够绕过 UnionFS&#xff0c;提供一些用于持续存储或共享数据。 特性&#xff1a;卷设计的目的就是数据的持久化&#xff0c;完全独立于…

Linux内核进程管理子系统有什么第三十三回 —— 进程主结构详解(29)

接前一篇文章&#xff1a;Linux内核进程管理子系统有什么第三十二回 —— 进程主结构详解&#xff08;28&#xff09; 本文内容参考&#xff1a; Linux内核进程管理专题报告_linux rseq-CSDN博客 《趣谈Linux操作系统 核心原理篇&#xff1a;第三部分 进程管理》—— 刘超 《…

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

文章目录 1. 前言:当一个任务有多个目标 2. 目标导向的强化学习 (GoRL) 简介 3. HER算法:化失败为成功的智慧 4. 代码实践:用PyTorch实现HER+DDPG 4.1 自定义环境 (WorldEnv) 4.2 智能体与算法 (DDPG) 4.3 HER的核心:轨迹经验回放 4.4 主流程与训练 5. 训练结果与分析 6. 总…

前端 H5分片上传 vue实现大文件

用uniapp开发APP上传视频文件&#xff0c;大文件可以上传成功&#xff0c;但是一旦打包为H5的代码&#xff0c;就会一提示链接超时&#xff0c;我的代码中是实现的上传到阿里云 如果需要看全文的私信我 官方开发文档地址 前端&#xff1a;使用分片上传的方式上传大文件_对象…

Linux服务器Systemctl命令详细使用指南

目录 1. 基本语法 2. 基础命令速查表 3. 常用示例 3.1 部署新服务后&#xff0c;设置开机自启并启动 3.2 检查系统中所有失败的服务并尝试修复 3.3 查看系统中所有开机自启的服务 4. 总结 以下是 systemctl 使用指南&#xff0c;涵盖服务管理、单元操作、运行级别控制、…

【JVM内存结构系列】二、线程私有区域详解:程序计数器、虚拟机栈、本地方法栈——搞懂栈溢出与线程隔离

上一篇文章我们搭建了JVM内存结构的整体框架,知道程序计数器、虚拟机栈、本地方法栈属于“线程私有区域”——每个线程启动时会单独分配内存,线程结束后内存直接释放,无需GC参与。这三个区域看似“小众”,却是理解线程执行逻辑、排查栈溢出异常的关键,也是面试中高频被问的…

红帽认证升级华为openEuler证书活动!

如果您有红帽证书&#xff0c;可以升级以下相应的证书&#xff1a;&#x1f447; 有RHCSA证书&#xff0c;可以99元升级openEuler HCIA 有RHCE证书&#xff0c;可以99元升级openEuler HCIP 有RHCA证书&#xff0c;可以2100元升级openEuler HCIE 现金激励&#xff1a;&#x1f4…

迭代器模式与几个经典的C++实现

迭代器模式详解1. 定义与意图迭代器模式&#xff08;Iterator Pattern&#xff09; 是一种行为设计模式&#xff0c;它提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。主要意图&#xff1a;为不同的聚合结构提供统一的遍历接口。将遍历…

epoll 陷阱:隧道中的高级负担

上周提到了 tun/tap 转发框架的数据通道结构和优化 tun/tap 转发性能优化&#xff0c;涉及 RingBuffer&#xff0c;packetization 等核心话题。我也给出了一定的数据结构以及处理逻辑&#xff0c;但竟然没有高尚的 epoll&#xff0c;本文说说它&#xff0c;因为它不适合。 epo…

微前端架构常见框架

1. iframe 这里指的是每个微应用独立开发部署,通过 iframe 的方式将这些应用嵌入到父应用系统中,几乎所有微前端的框架最开始都考虑过 iframe,但最后都放弃,或者使用部分功能,原因主要有: url 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。 UI 不同…

SQL Server更改日志模式:操作指南与最佳实践!

全文目录&#xff1a;开篇语**前言****摘要****概述&#xff1a;SQL Server 的日志模式****日志模式的作用****三种日志模式**1. **简单恢复模式&#xff08;Simple&#xff09;**2. **完整恢复模式&#xff08;Full&#xff09;**3. **大容量日志恢复模式&#xff08;Bulk-Log…

git的工作使用中实际经验

老输入烦人的密码 每次我git pull的时候都要叫我输入三次烦人的密码&#xff0c;问了deepseek也没有尝试成功 出现 enter passphrase for key ‘~/.ssh/id_rsa’ 的原因: 在生成key的时候,没有注意,不小心设置了密码, 导致每次提交的时候都会提示要输入密码, 也就是上面的提示…

科技赋能,宁夏农业绘就塞上新“丰”景

在贺兰山的巍峨身影下&#xff0c;在黄河水的温柔滋养中&#xff0c;宁夏这片古老而神奇的土地&#xff0c;正借助农业科技的磅礴力量&#xff0c;实现从传统农耕到智慧农业的华丽转身&#xff0c;奏响一曲科技与自然和谐共生的壮丽乐章。一、数字农业&#xff1a;开启智慧种植…

imx6ull-驱动开发篇36——Linux 自带的 LED 灯驱动实验

在之前的文章里&#xff0c;我们掌握了无设备树和有设备树这两种 platform 驱动的开发方式。但实际上有现成的&#xff0c;Linux 内核的 LED 灯驱动采用 platform 框架&#xff0c;我们只需要按照要求在设备树文件中添加相应的 LED 节点即可。本讲内容&#xff0c;我们就来学习…

深度学习中主流激活函数的数学原理与PyTorch实现综述

1. 定义与作用什么是激活函数&#xff1f;激活函数有什么用&#xff1f;答&#xff1a;激活函数&#xff08;Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型&#xff0c;激…

Linux高效备份:rsync + inotify实时同步

一、rsync 简介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系统下的数据镜像备份工具&#xff0c;支持本地复制、远程同步&#xff08;通过 SSH 或 rsync 协议&#xff09;&#xff0c;是一个快速、安全、高效的增量备份工具。二、rsync 特性 支持镜像保存整个目录树和…