ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux服务器离线安装Docker完整指南:从原理到实战避坑

Linux服务器离线安装Docker完整指南:从原理到实战避坑 1. 项目概述为什么需要离线安装Docker在Linux服务器运维和项目部署的日常工作中我们常常会遇到一个看似简单却颇为棘手的问题生产环境或内网服务器无法连接互联网。无论是出于安全策略的硬性规定还是机房物理隔离的客观条件这些服务器都处于“离线”状态。此时如果你需要部署一套基于容器化的应用比如一个微服务项目或者一个数据采集系统安装Docker就成了第一道坎。“离线安装Docker”这个需求正是为了解决这个核心矛盾。它不是一个简单的“下载安装包”的过程而是一个涉及依赖分析、版本匹配、环境准备和手动配置的系统性工程。很多新手运维或者开发者在第一次面对这个问题时往往会感到无从下手要么是下载的包版本不对要么是依赖缺失导致安装失败要么是安装后服务无法启动。我自己在早期也踩过不少坑比如在CentOS 7上费劲下载了一堆RPM包结果因为glibc版本不匹配而前功尽弃。所以这篇文章的目的就是为你梳理出一套清晰、可靠、可复现的Linux环境离线安装Docker的完整方案。我会从原理讲起告诉你离线安装的本质是什么然后手把手带你完成从准备离线包到最终验证的每一个步骤并分享我积累下来的那些“血泪教训”和避坑技巧。无论你面对的是CentOS、Ubuntu还是其他主流的Linux发行版这套思路都是通用的。2. 核心原理与准备工作拆解2.1 理解离线安装的本质依赖链的本地化在线安装之所以简单是因为包管理器如yum、apt帮我们自动解决了依赖关系。你只需要一个命令它就会从配置好的镜像源拉取Docker安装包及其所有依赖包。而离线安装就是把这个“拉取”的动作提前在能联网的机器上模拟一次完整的安装过程把所有需要的文件主包、依赖包、配置文件全部下载到本地然后打包转移到目标离线服务器上再通过本地路径进行安装。这个过程的关键在于依赖的完整性。Docker CE社区版的依赖可能包括容器运行时如containerd.io这是Docker的核心组件之一负责管理容器的生命周期。Docker引擎docker-ce本身。命令行工具docker-ce-cli。系统依赖如libseccomp安全计算模式库、特定版本的systemd或iptables等。不同的Linux发行版和版本其软件包格式和依赖树完全不同。例如CentOS/RHEL及其衍生版如Rocky Linux、AlmaLinux使用RPM包而Debian/Ubuntu使用DEB包。这是准备工作前必须明确的第一点。2.2 环境侦察与工具选型在开始之前你必须像侦察兵一样摸清“敌情”。这包括目标服务器信息确认操作系统及版本执行cat /etc/os-release或lsb_release -a查看。例如是CentOS Linux 7.9还是Ubuntu 22.04 LTS。系统架构执行uname -m查看。最常见的是x86_64即AMD64也可能是aarch64ARM架构常见于国产化环境或树莓派。内核版本Docker对内核有要求一般3.10以上执行uname -r查看。虽然离线包不直接依赖内核包但确保内核支持是前提。准备一台同构的联网跳板机这是整个流程的基石。你需要一台能够连接互联网并且操作系统发行版、主版本号、系统架构与目标离线服务器完全一致的机器。例如目标机是CentOS 7.9 x86_64跳板机也必须是CentOS 7.9 x86_64。这是保证下载的软件包100%兼容的关键。用虚拟机临时搭建一个是最稳妥的办法。选择Docker版本访问Docker官方文档确定一个稳定、兼容的版本。对于生产环境不建议使用最新的edge版本而是选择一个经过考验的稳定版。例如在写这篇文章时20.10.x或24.0.x系列都是不错的选择。你可以通过yum list docker-ce --showduplicates联网环境下来查看所有可用版本。注意版本选择上有个小技巧如果你的应用对Docker版本有特定要求例如某些旧版编排工具那就遵循应用要求如果没有选择比最新稳定版稍旧一个次版本的版本通常社区里遇到的坑和解决方案会更多更稳妥。3. 实战演练分步构建离线安装包接下来我们以CentOS 7.x x86_64系统为例演示完整的离线包制作与安装过程。Ubuntu/Debian系的思路完全一致只是包管理命令从yum换成了apt。3.1 阶段一在联网跳板机上操作这个阶段的目标是创建一个包含所有必要文件的离线包。3.1.1 环境初始化与仓库配置首先在跳板机上清理旧Docker版本如果有并添加Docker官方CE仓库。# 1. 卸载旧版本如果存在 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 2. 安装yum工具集yum-utils 提供了 yumdownloader 这个关键工具 sudo yum install -y yum-utils # 3. 添加Docker官方CE仓库 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo3.1.2 下载Docker及其所有依赖这是核心步骤。我们使用yumdownloader命令它不仅能下载指定的RPM包还能通过--resolve参数自动下载所有依赖。# 创建一个目录来存放所有下载的包 mkdir -p /opt/docker-offline-packages cd /opt/docker-offline-packages # 使用 yumdownloader 下载指定版本的docker-ce, docker-ce-cli, containerd.io 及其所有依赖 # 假设我们选择安装 docker-ce-20.10.24 sudo yumdownloader --resolve docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io执行完上述命令后当前目录下会多出几十个.rpm文件。这些就是Docker运行所需的所有软件包。实操心得yumdownloader默认会下载当前仓库中最新版本的包。如果你不指定版本比如只写docker-ce那么下载的就是最新的。在生产环境中强烈建议指定具体版本号这样可以确保离线环境和后续扩容环境的一致性避免因版本差异导致不可预知的问题。3.1.3 额外关键下载device-mapper-persistent-data和lvm2对于CentOS/RHEL 7Docker默认的存储驱动曾经是devicemapper虽然新版本默认已改为overlay2但一些旧指南或系统可能仍需要这些依赖。为了确保万无一失特别是如果你不确定目标服务器的历史配置最好一并下载。sudo yumdownloader --resolve device-mapper-persistent-data lvm23.1.4 打包与完整性校验下载完成后我们需要将这些包和安装脚本一起打包方便传输。# 回到上级目录准备打包 cd /opt # 创建一个简单的安装脚本模板稍后会在目标服务器上编辑 cat install-docker.sh EOF #!/bin/bash # 离线安装Docker脚本 # 请将此脚本与所有.rpm文件放在同一目录下执行 INSTALL_DIR$(dirname $0) cd $INSTALL_DIR echo “开始安装Docker离线包...” # 使用本地路径安装所有rpm包忽略依赖检查因为依赖包已全部在本地 sudo rpm -ivh --nodeps *.rpm echo “启动Docker服务并设置开机自启” sudo systemctl start docker sudo systemctl enable docker echo “验证安装” sudo docker --version EOF # 给脚本添加执行权限 chmod x docker-offline-packages/install-docker.sh # 打包整个目录 tar -czvf docker-offline-20.10.24-centos7.x86_64.tar.gz docker-offline-packages/现在docker-offline-20.10.24-centos7.x86_64.tar.gz这个文件就是我们的终极离线安装包。你可以通过U盘、内网FTP、或者安全的文件传输工具将其复制到目标离线服务器。3.2 阶段二在目标离线服务器上操作将上一步生成的压缩包上传到目标服务器的某个目录例如/tmp。3.2.1 解压与预检查# 1. 切换到上传目录并解压 cd /tmp tar -xzvf docker-offline-20.10.24-centos7.x86_64.tar.gz # 2. 进入解压后的目录 cd docker-offline-packages # 3. 可选但推荐手动检查内核是否支持overlay2存储驱动 # 这是Docker推荐且性能更好的存储驱动 lsmod | grep overlay # 如果没有任何输出需要加载模块 sudo modprobe overlay # 确认加载成功 lsmod | grep overlay3.2.2 执行离线安装直接运行我们准备好的脚本或者手动执行安装命令。方法一使用脚本推荐sudo ./install-docker.sh脚本会依次安装所有RPM包启动Docker服务并设置开机自启。方法二手动安装如果你想更清晰地控制过程可以手动执行# 安装所有rpm包 sudo rpm -ivh --nodeps *.rpm # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker关键参数解释rpm -ivh --nodeps中的--nodeps参数表示“不检查依赖”。这是因为我们在跳板机上下载时已经通过--resolve确保了所有依赖包都在当前目录。如果不用这个参数rpm命令会去线上仓库查找依赖在离线环境下必然会失败。3.2.3 安装后配置与验证安装完成后有几项重要的后续工作。验证安装sudo docker --version # 预期输出Docker version 20.10.24, build 297e128 sudo systemctl status docker # 查看服务状态应为 active (running)配置用户组非root用户运行Docker 默认情况下执行Docker命令需要sudo。为了方便可以将当前用户加入docker用户组。sudo groupadd docker # 如果docker组不存在则创建通常安装时会自动创建 sudo usermod -aG docker $USER重要执行此命令后需要完全注销并重新登录或者新开一个终端用户组更改才会生效。之后你就可以直接使用docker ps而不需要sudo了。测试Docker基础功能# 运行一个最简单的测试容器 docker run hello-world如果这个命令能成功执行并输出 “Hello from Docker!” 等欢迎信息那么恭喜你Docker离线安装已经大功告成。4. 针对不同发行版的策略调整虽然我们以CentOS为例但其他发行版的流程大同小异核心是更换包管理工具。4.1 Ubuntu/Debian 系统在Ubuntu跳板机上的操作流程对比如下步骤CentOS/RHEL系Ubuntu/Debian系安装下载工具yum install yum-utilsapt install dpkg-dev(或使用apt-offline)添加仓库yum-config-manager --add-repoadd-apt-repository或手动编辑/etc/apt/sources.list.d/docker.list下载包及依赖yumdownloader --resolveapt download package配合apt-cache depends手动解析或使用apt-offline更佳本地安装命令rpm -ivh --nodeps *.rpmdpkg -i *.deb对于Ubuntu更推荐使用apt-offline工具它能更优雅地生成一个完整的离线安装签名文件sig文件在目标机上用这个文件来获取所有包。但考虑到通用性手动下载依赖也是一种可行方案只是过程更繁琐一些。4.2 国产化操作系统如麒麟、统信UOS国产系统大多基于CentOS或Ubuntu的某个版本衍生。首先使用cat /etc/os-release命令找到其“基系统”信息。例如银河麒麟V10可能基于CentOS 8。然后按照对应的基系统CentOS或Ubuntu的离线安装方法进行。关键点在于Docker官方可能不直接提供该衍生版的仓库你需要确认系统自带的仓库或第三方兼容仓库中是否有Docker包。如果没有尝试使用其基系统对应版本的Docker包如CentOS 8的包用于麒麟V10但这存在一定的兼容性风险务必先在测试环境验证。5. 高级技巧与深度避坑指南5.1 存储驱动选择与配置安装完成后Docker默认使用的存储驱动未必是最优的。对于CentOS/RHEL 7如果内核版本 3.10且文件系统是xfs并启用了ftype1强烈建议使用overlay2驱动。检查并配置overlay2# 1. 检查当前存储驱动 docker info | grep “Storage Driver” # 2. 如果显示为 devicemapper建议修改为 overlay2 # 停止Docker服务 sudo systemctl stop docker # 编辑Docker守护进程配置文件 sudo vi /etc/docker/daemon.json在daemon.json文件中添加以下内容如果文件不存在则创建{ “storage-driver”: “overlay2” }保存后启动Dockersudo systemctl start docker。再次使用docker info确认驱动已更改。踩坑记录我曾遇到一个环境修改为overlay2后Docker启动失败。原因是/var/lib/docker目录下存在旧的devicemapper数据。解决方法是在修改配置前先备份并清理/var/lib/docker目录sudo rm -rf /var/lib/docker/*。这是一个危险操作仅适用于全新安装或可接受数据丢失的环境生产环境务必谨慎5.2 离线环境下的镜像管理Docker安装好了但怎么在没有网络的环境下获取镜像呢答案是镜像导出与导入。在联网机器上拉取并保存镜像docker pull nginx:alpine docker save -o nginx-alpine.tar nginx:alpine将nginx-alpine.tar文件拷贝到离线服务器。在离线服务器上加载镜像docker load -i nginx-alpine.tar验证docker images docker run -d -p 80:80 nginx:alpine对于复杂的多镜像应用例如包含web、app、db多个服务的Compose项目你需要在联网环境将每个镜像都save出来然后到离线环境逐个load。也可以使用脚本批量操作。5.3 常见问题排查实录即使按照步骤操作也可能遇到意外。下面是我总结的几个典型问题及解决方案。问题现象可能原因排查与解决思路rpm -ivh安装时报错提示文件冲突系统中已存在旧版本或冲突的软件包。使用 rpm -qasystemctl start docker失败查看日志journalctl -xe -u docker发现”Failed to start Docker Application Container Engine.”1. 存储驱动配置错误如上述overlay2问题。2. 内核模块未加载如overlay、br_netfilter。3. 防火墙或SELinux阻止。1. 检查/etc/docker/daemon.json配置。2. 执行sudo modprobe overlay和sudo modprobe br_netfilter手动加载模块并确保开机自动加载写入/etc/modules-load.d/。3. 临时关闭防火墙和SELinux测试sudo setenforce 0和sudo systemctl stop firewalld。如果是它们的问题需要配置放行规则而非简单关闭。执行docker run hello-world时提示”Cannot connect to the Docker daemon…”Docker服务未启动或当前用户没有权限连接Docker socket。1. 确认服务状态systemctl status docker。2. 确认当前用户是否在docker组内groups $USER。如果不在执行sudo usermod -aG docker $USER并重新登录。在国产化系统上安装后运行容器性能极差或报错内核兼容性问题或缺少必要的内核特性支持。1. 检查内核版本和发行版说明确认官方是否支持该环境。2. 考虑使用更轻量级的容器方案如 Podman其命令行与Docker高度兼容并寻找对应的离线安装方案。5.4 构建企业级离线镜像仓库对于需要长期在离线环境部署多个项目的团队每次都手动save/load镜像效率太低。更专业的做法是搭建一个私有的离线Docker镜像仓库。在联网环境拉取所有需要的镜像并推送到一个你自己搭建的私有仓库如使用registry:2镜像。将整个私有仓库的数据目录通常是/var/lib/registry打包。在离线环境部署同样的私有仓库容器并将打包的数据目录解压覆盖。配置离线环境的Docker客户端将其镜像仓库地址指向这个内网私有仓库地址通过修改/etc/docker/daemon.json中的”insecure-registries”。这样离线环境中的所有机器都可以从这个内网仓库拉取镜像实现了镜像的集中管理和高效分发。这算是离线Docker使用的进阶玩法了能极大提升运维效率。
返回列表