Docker离线安装全攻略:分步法与一键法详解
1. 项目概述为什么需要离线安装Docker在服务器运维和项目部署的日常工作中我们经常会遇到一个非常典型的场景生产环境或内网开发环境的服务器出于安全合规要求是完全隔离在互联网之外的。这时候当你需要部署一套基于容器化的应用时常规的curl | bash或者apt-get install docker-ce这类在线安装命令就完全失效了。这就是“离线安装Docker”这个需求最核心的出发点——它解决的是在网络受限环境下如何将现代化的容器技术落地的问题。我经历过不少这样的项目客户的核心业务系统部署在物理隔离的机房所有软件包都需要通过U盘或内部文件服务器进行中转。在这种环境下离线安装不仅仅是“下载一个安装包”那么简单它涉及到依赖关系的完整传递、系统版本的严格匹配以及安装后服务的稳定性和可维护性。网上很多教程只给命令不讲背后的逻辑真到实战时一个依赖缺失就能让你折腾半天。所以今天我想结合自己多次在CentOS、Ubuntu等主流Linux发行版上实施的经验系统性地拆解两种主流的离线安装方法分步法和一键法。分步法适合需要深刻理解安装过程、定制化强或环境复杂的场景一键法则追求快速部署和标准化适合批量操作。无论你是运维工程师、开发还是架构师掌握这两种方法都能让你在内网部署容器化应用时更加游刃有余。2. 核心思路与方案选型分步法与一键法深度对比在动手之前我们先厘清两种方法的本质区别和适用场景。这决定了你后续的工作效率和排查问题的难易程度。2.1 分步法庖丁解牛掌控全局分步法顾名思义就是将Docker的安装过程拆解成几个清晰的、可手动控制的步骤。通常包括准备离线安装包、传输到目标服务器、手动安装依赖、安装Docker核心组件、配置并启动服务。它的核心优势在于过程透明易于调试每一步操作你都能看到输出一旦报错可以精准定位到是哪个包或哪个配置出了问题。例如如果rpm -ivh某个包时提示依赖冲突你能立刻知道是哪个库版本不对。环境适应性强对于老旧系统、定制化内核或存在特定安全加固策略的系统分步法允许你在每一步进行干预和调整。比如你可以选择不安装某个默认的存储驱动或者手动修改systemd的启动参数。学习价值高通过分步操作你能真正理解Docker在Linux上的组成部件docker-ce, docker-ce-cli, containerd.io等以及它们之间的依赖关系这是运维深度能力的体现。它的劣势也很明显步骤繁琐容易出错需要手动处理大量包和依赖一个顺序错误就可能导致安装失败。效率较低不适合需要批量部署数十上百台服务器的场景。2.2 一键法化繁为简追求效率一键法则是通过一个预先编写好的Shell脚本将下载、传输、安装、配置等一系列步骤自动化。你只需要在能联网的机器上运行脚本打好包然后把整个包放到内网服务器上执行安装脚本即可。它的核心优势在于部署效率极高特别适合标准化环境的批量部署。一次制作多次使用极大地减少了重复劳动。标准化和一致性脚本固化了下载版本、安装路径和配置参数确保了所有服务器上的Docker环境完全一致避免了人为操作失误。降低了操作门槛对于不熟悉Linux包管理细节的开发者一键脚本提供了“开箱即用”的体验。其潜在的缺点包括黑盒化排查困难如果脚本在某个特定环境运行失败你可能需要深入阅读脚本逻辑才能定位问题对新手不友好。灵活性差脚本通常是针对通用场景编写的如果目标系统有特殊配置如自定义的磁盘挂载点、特定的代理设置可能需要修改脚本。我的经验选择对于首次在某个新环境类型比如从CentOS切换到麒麟OS上安装我强烈建议先用分步法走一遍摸清所有坑点。当验证通过后再基于成功的经验编写或优化一键脚本用于后续的批量部署。这是一种“先探索后固化”的高效工作流。3. 前期准备与环境检查无论选择哪种方法充分的准备工作是成功的一半。跳过这一步很可能让你在后续步骤中陷入困境。3.1 确定系统版本与架构这是最关键的一步版本不匹配是离线安装失败的首要原因。你需要精确获取以下信息# 1. 查看系统发行版和版本号 cat /etc/os-release # 2. 查看系统内核版本 uname -r # 3. 查看系统架构x86_64, aarch64等 uname -m例如输出可能是CentOS Linux 7.9.2009 (Core)和x86_64。这意味着你需要寻找适用于CentOS 7、x86_64架构的Docker安装包。对于Ubuntu则要关注jammy(22.04)、focal(20.04)这样的代号。3.2 检查关键依赖与冲突在安装Docker之前需要确保系统没有残留的旧版本或冲突软件包。# 检查是否安装过旧版本Docker如docker, docker-engine, docker.io sudo yum list installed | grep docker # CentOS/RHEL sudo dpkg -l | grep docker # Ubuntu/Debian # 如果存在请彻底卸载它们 sudo yum remove docker* containerd.io runc -y # CentOS sudo apt-get remove docker docker-engine docker.io containerd runc -y # Ubuntu同时确认系统已安装必要的工具用于后续可能的手动依赖安装# 确保有wget或curl用于下载以及tar用于解压 which wget curl tar3.3 准备离线环境传输介质你需要一个“跳板机”能连接互联网的机器其系统版本和架构最好与目标内网机一致来下载所有所需文件。然后通过以下方式之一传输到内网服务器U盘/移动硬盘适用于物理隔离的机房。内部文件服务器/FTP在内网环境中搭建一个文件共享服务。安全摆渡设备在一些高安全等级的网络中使用的专用设备。在跳板机上建议创建一个清晰的工作目录例如~/docker-offline所有下载的文件都归集于此。4. 分步安装法实战详解我们以CentOS 7.9 x86_64系统为例演示分步法的完整过程。其他发行版的思路完全一致只是包管理命令yum/rpm换成apt/dpkg和包名后缀.rpm换成.deb不同。4.1 在跳板机下载所有依赖包Docker CE社区版依赖于几个核心组件。我们需要使用yum的downloadonly插件将它们全部下载到本地。# 1. 在跳板机上安装downloadonly插件如果尚未安装 sudo yum install -y yum-utils # 2. 添加Docker的官方Yum仓库这里使用阿里云镜像加速 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 3. 创建一个目录存放所有下载的包 mkdir -p ~/docker-offline/packages cd ~/docker-offline/packages # 4. 下载Docker CE及其所有依赖但不安装 # 这里我们指定一个长期支持版本例如 24.0.9避免使用latest导致版本漂移 sudo yum install --downloadonly --downloaddir./ docker-ce-24.0.9 docker-ce-cli-24.0.9 containerd.io docker-buildx-plugin docker-compose-plugin执行完上述命令后packages目录下会多出几十个.rpm文件。这些就是包含了所有依赖的完整离线安装包。关键点解析--downloadonly这是yum的关键参数告诉它只下载不执行安装。--downloaddir./指定下载文件存放的目录。版本锁定明确指定docker-ce-24.0.9而不是docker-ce。在生产环境中锁定小版本号是必须的可以确保环境的一致性避免因自动升级引入不兼容问题。4.2 传输文件并手动安装将整个docker-offline目录打包通过准备好的传输介质复制到目标内网服务器上。# 在目标服务器上进入传输过来的目录 cd /path/to/docker-offline/packages # 使用rpm命令本地安装所有包。使用 -ivh 参数可以看到详细的安装过程。 # 注意如果系统缺少基础依赖如libcgroup可能需要先找到对应的系统ISO镜像从中安装。 sudo rpm -ivh *.rpm --nodeps --force参数解释与避坑指南-ivhi表示安装v显示详细信息h显示进度条。--nodeps慎用。它表示不检查依赖关系。在离线环境下因为我们已通过yum downloadonly下载了所有依赖理论上依赖是齐备的。但有时系统可能存在一些极其基础的、不在Docker仓库里的包如特定版本的systemd或glibc这时--nodeps可以让你先把包装上去但这些缺失的依赖可能会导致Docker无法运行。更好的做法是先尝试不加--nodeps如果报依赖错误再根据错误信息去系统镜像里寻找对应的rpm包补上。--force强制安装覆盖已有的文件。在清理旧版本不彻底时可能需要。4.3 安装后配置与启动安装完包只是第一步让Docker服务以符合我们需求的方式运行起来还需要进行配置。# 1. 启动Docker守护进程并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 2. 可选但推荐建立docker用户组并将当前用户加入这样无需sudo即可运行docker命令 sudo groupadd docker # 如果组已存在会提示可忽略 sudo usermod -aG docker $USER # 注意修改组后需要**重新登录**当前用户组权限变更才会生效。 # 3. 验证安装是否成功 docker --version docker run hello-world如果hello-world镜像能成功运行并输出欢迎信息恭喜你Docker离线安装的核心部分已经成功了。4.4 关键配置镜像加速与存储驱动在内网环境我们通常需要配置一个内部的私有镜像仓库而不是Docker Hub。# 编辑Docker守护进程配置文件 sudo vim /etc/docker/daemon.json如果公司有私有镜像仓库如Harbor可以这样配置{ registry-mirrors: [https://your-internal-harbor.com], insecure-registries: [your-internal-harbor.com], // 如果仓库是HTTP而非HTTPS data-root: /data/docker, // 建议修改数据目录到数据盘避免根目录爆满 log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }配置完成后需要重启Docker服务使配置生效sudo systemctl daemon-reload sudo systemctl restart docker重要心得daemon.json的格式必须严格是JSON一个多余的逗号都会导致Docker启动失败。可以使用sudo docker info命令来验证配置是否已加载成功。另外修改>#!/bin/bash # create-offline-docker.sh # 使用方法./create-offline-docker.sh docker_version os_type os_version # 示例./create-offline-docker.sh 24.0.9 centos 7 set -e # 遇到错误立即退出 DOCKER_VERSION${1:-24.0.9} # 默认版本 OS_TYPE${2:-centos} # 支持 centos/ubuntu OS_VERSION${3:-7} # 例如 7, 8 或 20.04, 22.04 WORK_DIRdocker-offline-${OS_TYPE}${OS_VERSION}-${DOCKER_VERSION} PACKAGE_DIR${WORK_DIR}/packages SCRIPT_DIR${WORK_DIR}/scripts echo 创建离线Docker安装包: Docker ${DOCKER_VERSION} for ${OS_TYPE} ${OS_VERSION} mkdir -p ${PACKAGE_DIR} ${SCRIPT_DIR} # 根据系统类型执行不同的下载逻辑 case ${OS_TYPE} in centos|rhel) echo 配置CentOS/RHEL环境... sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 清理可能的旧缓存 sudo yum clean all # 下载核心包及依赖 sudo yum install --downloadonly --downloaddir${PACKAGE_DIR}/ \ docker-ce-${DOCKER_VERSION} \ docker-ce-cli-${DOCKER_VERSION} \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin ;; ubuntu) echo 配置Ubuntu环境... # 这里需要模拟Ubuntu的下载逻辑可以使用apt-offline或dpkg-scanpackages等工具 # 由于篇幅此处给出思路在docker.com下载对应版本的.deb包并用apt-get download下载依赖 echo Ubuntu一键打包逻辑较复杂建议先手动下载好deb包放入${PACKAGE_DIR}目录。 ;; *) echo 不支持的操作系统类型: ${OS_TYPE} exit 1 ;; esac # 创建安装脚本 cat ${SCRIPT_DIR}/install.sh EOF #!/bin/bash # install.sh - Docker离线安装脚本 set -e PACKAGE_DIR./packages LOG_FILE/var/log/docker-offline-install.log echo 开始离线安装Docker日志: ${LOG_FILE} | tee -a ${LOG_FILE} # 1. 检查并卸载旧版本 echo [1/4] 检查旧版本... | tee -a ${LOG_FILE} if command -v docker /dev/null; then echo 发现已安装Docker开始卸载... | tee -a ${LOG_FILE} systemctl stop docker || true yum remove -y docker* containerd.io runc 21 | tee -a ${LOG_FILE} fi # 2. 安装所有本地rpm包 echo [2/4] 安装本地包... | tee -a ${LOG_FILE} if ls ${PACKAGE_DIR}/*.rpm /dev/null; then rpm -ivh ${PACKAGE_DIR}/*.rpm 21 | tee -a ${LOG_FILE} else echo 错误: 在 ${PACKAGE_DIR} 未找到rpm包 | tee -a ${LOG_FILE} exit 1 fi # 3. 配置与启动 echo [3/4] 配置Docker服务... | tee -a ${LOG_FILE} systemctl start docker 21 | tee -a ${LOG_FILE} systemctl enable docker 21 | tee -a ${LOG_FILE} # 4. 验证安装 echo [4/4] 验证安装... | tee -a ${LOG_FILE} docker --version 21 | tee -a ${LOG_FILE} if docker run --rm hello-world ${LOG_FILE}; then echo SUCCESS: Docker离线安装并验证成功 | tee -a ${LOG_FILE} else echo ERROR: Docker hello-world 运行失败请检查日志 ${LOG_FILE} | tee -a ${LOG_FILE} exit 1 fi EOF chmod x ${SCRIPT_DIR}/install.sh # 创建README文件 cat ${WORK_DIR}/README.md EOF # Docker离线安装包 - 系统: ${OS_TYPE} ${OS_VERSION} - Docker版本: ${DOCKER_VERSION} - 生成日期: $(date) ## 安装步骤 1. 将整个目录上传至目标服务器。 2. 进入该目录: \cd ${WORK_DIR}\ 3. 执行安装脚本: \sudo ./scripts/install.sh\ 4. 查看安装日志: \tail -f /var/log/docker-offline-install.log\ ## 注意 - 请确保目标系统架构与打包环境一致。 - 安装前请备份重要数据。 EOF # 打包整个目录 tar -czf ${WORK_DIR}.tar.gz ${WORK_DIR}/ echo 离线安装包已创建: ${WORK_DIR}.tar.gz echo 请将此文件传输到目标服务器解压后按照README指引安装。5.2 使用流程与注意事项在跳板机生成包根据目标服务器系统运行./create-offline-docker.sh 24.0.9 centos 7。传输与解压将生成的.tar.gz文件传到内网服务器解压。执行安装进入解压目录以root权限执行sudo ./scripts/install.sh。查看日志安装过程会详细记录在/var/log/docker-offline-install.log任何错误都可追溯。脚本安全提醒从互联网获取的脚本务必谨慎。上述脚本是一个模板在实际使用前你应该仔细阅读每一行命令理解其作用。特别是rpm -ivh和yum remove这类具有破坏性的命令。在重要环境执行前可以先在测试虚拟机中完整跑一遍。6. 常见问题与深度排查指南离线安装由于环境封闭遇到的问题往往比在线安装更棘手。这里我总结几个最典型的“坑”及其解决方案。6.1 依赖包缺失或冲突问题现象在执行rpm -ivh时提示error: Failed dependencies: ... is needed by ...。排查思路检查下载的包是否完整回到跳板机确认yum downloadonly命令是否成功下载了所有包。有时网络中断会导致部分包缺失。检查系统基础版本依赖缺失最常见的原因是目标系统的版本比跳板机老。例如在CentOS 7.9上打的包拿到CentOS 7.6上安装可能会因为glibc或systemd版本过低而失败。手动补充依赖首先在目标服务器上尝试用系统安装镜像ISO作为本地Yum源安装缺失的基础包。# 挂载系统ISO mount /path/to/CentOS-7-x86_64-Everything-2009.iso /mnt # 创建本地repo文件 cat /etc/yum.repos.d/local.repo EOF [local] nameLocal ISO baseurlfile:///mnt enabled1 gpgcheck0 EOF # 安装缺失的包例如 libseccomp yum --disablerepo* --enablerepolocal install libseccomp6.2 Docker服务启动失败问题现象执行systemctl start docker后失败使用systemctl status docker -l查看详细错误。常见原因及解决存储驱动不支持某些旧内核或虚拟化环境可能不支持默认的overlay2驱动。排查dmesg | grep overlay查看内核日志。解决在/etc/docker/daemon.json中更换驱动如{storage-driver: devicemapper}注意devicemapper需要额外配置不推荐生产环境使用或者升级内核。cgroups问题Docker依赖于cgroups进行资源控制。排查检查/sys/fs/cgroup目录是否存在且已挂载。解决确保系统已启动cgroup。对于某些最小化安装的系统可能需要安装libcgroup包。防火墙或SELinux拦截临时排查可以尝试暂时关闭防火墙 (systemctl stop firewalld) 和设置SELinux为宽松模式 (setenforce 0)看Docker是否能启动。这仅是排查手段生产环境需配置安全规则而非直接关闭。生产环境解决为Docker添加正确的防火墙规则并配置SELinux策略或将其设置为宽容模式需安全评估。6.3 用户权限问题无法连接Docker守护进程问题现象执行docker ps时提示Got permission denied while trying to connect to the Docker daemon socket。原因与解决这是因为当前用户不在docker用户组中无权访问Unix socket/var/run/docker.sock。永久解决将用户加入docker组sudo usermod -aG docker $USER然后必须重新登录该用户新的组权限才会生效。临时验证可以使用sudo docker ps来验证Docker本身是否运行正常。6.4 离线环境下的镜像管理Docker安装成功后如何在内网使用镜像这是离线环境的下一个核心问题。保存与加载镜像在能联网的环境拉取镜像导出为文件再导入内网。# 在跳板机 docker pull nginx:alpine docker save -o nginx-alpine.tar nginx:alpine # 将tar文件传到内网服务器 docker load -i nginx-alpine.tar docker images # 确认镜像已导入搭建私有镜像仓库对于长期、多团队使用的环境强烈建议在内网搭建一个私有镜像仓库如Harbor。这样开发人员可以将构建好的镜像推送到私有仓库运维人员再从私有仓库拉取部署形成一个完整的离线CI/CD流水线。Harbor本身也支持离线安装其思路与Docker离线安装类似。7. 进阶考量与生产环境建议当你掌握了基本的离线安装后为了应对更复杂、要求更高的生产环境还需要考虑以下几点。7.1 版本管理与升级策略版本锁定在daemon.json中可以配置禁止自动更新防止意外升级。{ disable-legacy-registry: true, live-restore: true }同时在包安装时坚持使用完整的版本号docker-ce-24.0.9。升级流程离线环境的升级需要规划窗口期。流程是在测试环境用新版本包验证所有现有应用 - 制作新版本离线包 - 在生产环境按批次滚动升级。务必先备份/var/lib/docker或自定义的>