Ubuntu环境下离线部署Docker生态全攻略:从安装到镜像迁移

news2026/3/14 12:15:16
1. 为什么需要离线部署Docker从企业内网说起大家好我是老张在运维和开发这个行当里摸爬滚打了十几年经手过不少企业级项目。今天想和大家聊聊一个非常实际但又常常让新手头疼的场景在完全没有外网的环境里怎么把Docker这套东西给完整地装起来并且把镜像资产搬过去。你可能觉得现在网络这么发达直接apt install docker.io不就完事了这话没错但很多企业的生产环境尤其是金融、政务、军工或者一些对安全要求极高的研发内网服务器是物理隔离的压根连不上互联网。我早年就踩过这个坑当时客户现场服务器在内网项目又急着上线结果发现连Docker都装不上那叫一个手忙脚乱。所以掌握一套完整的离线部署流程绝对不是屠龙之技而是运维和开发人员的必备生存技能。离线部署的核心目标就三个第一把Docker引擎也就是docker-ce和它的好搭档docker-compose装到目标机器上第二把你在开发环境或者镜像仓库里准备好的Docker镜像完整地迁移到内网环境第三确保整个过程可控、可重复版本要对得上依赖不能缺。这听起来简单但里面有不少细节比如系统版本适配、依赖包冲突、批量操作效率等等一个不注意就可能掉坑里。这篇文章我就结合自己踩过的坑和总结的经验带你走一遍从零开始的Ubuntu离线Docker生态部署全流程保证你跟着做就能成功。2. 战前准备搞定离线安装包与依赖俗话说工欲善其事必先利其器。离线安装的第一步不是冲进机房而是要在一台能上网的、系统环境类似的机器上把所有需要的“弹药”准备好。这个准备阶段做得好后面就能省下至少80%的麻烦。2.1 确定系统版本与架构这是最容易忽略也最容易导致失败的一步。你兴冲冲下载了安装包结果到内网机器上一执行报错“架构不匹配”或者“依赖的libc版本不对”直接就傻眼了。所以务必先登录你的目标内网Ubuntu服务器执行下面几个命令看清楚# 查看Ubuntu系统具体版本号 lsb_release -a # 查看系统是64位amd64/x86_64还是ARM架构aarch64 uname -m # 查看内核版本Docker对内核有最低要求 uname -r记下这些信息尤其是Codename比如focal对应 Ubuntu 20.04 LTS,jammy对应 22.04 LTS和架构绝大多数是amd64。然后在你的联网机器准备机上尽量安装一个版本完全相同的Ubuntu虚拟机或容器用来下载包这样可以最大程度保证依赖一致性。我一般习惯用Docker快速起一个同版本环境docker run -it ubuntu:20.04 /bin/bash。2.2 下载Docker引擎离线包Docker官方为每个Ubuntu版本都维护了独立的软件仓库。我们不能直接用apt-get install但可以手动从仓库里把需要的.deb包扒下来。这里的关键是找到正确的仓库地址。以 Ubuntu 20.04 LTS (Focal Fossa) amd64 架构为例官方仓库地址模板是https://download.docker.com/linux/ubuntu/dists/UBUNTU_CODENAME/pool/stable/amd64/你需要把UBUNTU_CODENAME替换成你查到的代号比如focal。用浏览器或者wget访问这个地址你会看到一堆.deb文件。对于基础安装我们主要需要三个包版本号请以当时最新的稳定版为准但安装顺序固定containerd.io_version_amd64.deb容器运行时docker-ce-cli_version_amd64.debDocker命令行工具docker-ce_version_amd64.debDocker引擎本体注意下载时务必留意版本间的依赖关系。一个稳妥的方法是在联网的准备机上通过apt模拟安装来获取完整的依赖包列表。我们可以先生成一个下载脚本# 在准备机上先更新源并安装 apt-utils 和 dpkg-dev 以便使用 apt-get download apt-get update apt-get install -y apt-utils dpkg-dev # 模拟安装docker-ce并打印出所有将会安装的包 apt-get install -y --dry-run docker-ce docker-ce-cli containerd.io从输出的信息里你能看到除了上述三个主包外是否还需要docker-ce-rootless-extras、docker-buildx-plugin等扩展包。更直接的方法是使用apt-get download命令它会下载包及其所有依赖到当前目录# 下载指定包及其所有依赖但不会安装 apt-get download docker-ce docker-ce-cli containerd.io下载完成后你会得到一堆.deb文件。把它们全部打包这就是你的Docker引擎离线安装包集合。我习惯按功能分类比如docker-engine-packages/目录下放所有.deb文件。2.3 下载docker-compose离线包docker-compose的离线安装相对简单因为它是一个独立的二进制文件。你需要去 Docker Compose的GitHub Release页面 下载对应你系统架构的版本。比如对于amd64架构的Linux通常下载的文件名是docker-compose-linux-x86_64。这里有个小技巧直接下载速度慢的话可以先用迅雷等工具下载到本地再上传到准备机。下载后记得重命名并赋予可执行权限但这步可以等到部署时再做。把这个二进制文件单独保存例如放在docker-compose-binary/目录下。2.4 处理潜在的系统依赖有时候安装Docker的.deb包可能会依赖一些特定的系统库比如libseccomp2的某个较新版本。如果你的内网系统版本非常老旧可能会缺失。为了避免这个问题可以在准备机上使用apt-cache depends命令仔细查看docker-ce包的依赖树并把那些可能不存在的底层库也一并下载下来。不过对于主流的Ubuntu LTS版本通常系统自带的库就足够了。这一步属于高级检查在你第一次部署某个特定老旧系统时值得一做。3. 实战部署在内网机器上安装Docker引擎好了现在你已经有了一个装满.deb包的U盘或者内部网络共享目录。我们带着这些“弹药”进入内网环境开始真正的安装。3.1 传输文件与环境检查首先把准备好的所有文件Docker的deb包、docker-compose二进制文件拷贝到目标服务器的某个目录比如/opt/docker-offline/。然后再次确认系统版本和架构确保和下载的包匹配。接着可以按顺序安装Docker的deb包了。安装顺序很重要必须先装containerd.io再装docker-ce-cli最后装docker-ce。# 切换到包所在目录 cd /opt/docker-offline/docker-engine-packages/ # 使用dpkg安装-i参数表示安装。如果遇到依赖错误可以用下面的-f参数修复。 sudo dpkg -i containerd.io_*.deb sudo dpkg -i docker-ce-cli_*.deb sudo dpkg -i docker-ce_*.deb如果安装过程中报错提示缺少某些依赖例如libseccomp2版本不够别慌。这是因为dpkg不会自动处理依赖。我们可以先用dpkg -i *.deb尝试安装所有包然后运行sudo apt-get install -f来修复依赖。但在离线环境apt-get install -f会失败因为它需要联网。所以更可靠的做法是在安装前就用dpkg -I package.deb检查包的依赖并确保所有依赖包都已经在你的离线包集合里。如果缺就回到准备机上下载补齐。3.2 配置与启动Docker服务安装完成后我们需要启动Docker服务并把它设为开机自启。同时为了避免每次都要用sudo通常会把当前用户加入docker用户组。# 启动Docker守护进程 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # 检查Docker服务状态看到active (running)就说明成功了 sudo systemctl status docker # 将当前用户加入docker组之后运行docker命令就不需要sudo了 sudo usermod -aG docker $USER # **重要**为了使组更改生效你需要注销并重新登录或者执行以下命令在新终端生效 newgrp docker现在运行docker version和docker info如果能看到客户端和服务端的版本信息恭喜你Docker引擎已经成功在离线环境下跑起来了但先别急我们还需要它的黄金搭档——docker-compose。4. 安装与配置docker-composedocker-compose的安装就简单多了因为它就是一个二进制文件不需要处理复杂的依赖。4.1 安装docker-compose二进制文件我们把之前下载好的docker-compose-linux-x86_64文件放到系统的可执行路径下比如/usr/local/bin并改名为docker-compose。# 将二进制文件复制到系统目录 sudo cp /opt/docker-offline/docker-compose-binary/docker-compose-linux-x86_64 /usr/local/bin/docker-compose # 赋予可执行权限 sudo chmod x /usr/local/bin/docker-compose # 可选创建软链接到/usr/bin确保在任意路径下都能直接调用 sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose4.2 验证安装安装完成后直接运行版本检查命令来验证docker-compose version如果正确输出了版本号比如Docker Compose version v2.20.2那么docker-compose也安装成功了。至此Docker的运行环境已经全部就绪。但是光有引擎没用我们还需要把业务需要的镜像“搬”进来。5. Docker镜像的离线迁移导出、传输与导入这是离线部署的另一个核心环节。镜像就像集装箱里面装好了应用程序和所有运行环境。我们需要在联网环境把集装箱打包导出运进内网传输再卸货导入。5.1 在联网环境导出镜像首先在你有网络的环境比如你的开发机或公司的镜像仓库服务器上找到需要的镜像。使用docker images查看镜像列表记住镜像的REPOSITORY:TAG比如nginx:1.23-alpine。导出单个镜像使用docker save命令它会把镜像及其所有层layers打包成一个tar文件。# 将镜像保存为tar文件推荐使用标准输出重定向避免格式问题 docker save nginx:1.23-alpine nginx-1.23-alpine.tar # 或者使用 -o 参数指定输出文件 docker save -o nginx-1.23-alpine.tar nginx:1.23-alpine导出多个镜像到一个文件如果你有一组相关的镜像比如一个微服务应用的所有组件可以一次性导出这样管理和传输更方便。docker save -o my-app-all-images.tar nginx:1.23-alpine postgres:15-alpine my-app:latest一个我踩过的坑直接用docker save IMAGE_NAME file.tar时如果镜像名包含特定字符可能会有些小问题。而使用-o参数是更稳妥的方式。另外导出的tar文件可能会很大记得用gzip或pigz多线程压缩压缩一下能节省大量传输时间和存储空间gzip nginx-1.23-alpine.tar。5.2 安全传输与完整性校验把压缩后的.tar.gz文件通过U盘、内部文件服务器或者安全的网络共享拷贝到内网服务器。强烈建议在传输前后进行完整性校验避免文件损坏导致导入失败。常用的方法是计算文件的MD5或SHA256校验和。在源机器上sha256sum nginx-1.23-alpine.tar.gz nginx-1.23-alpine.tar.gz.sha256把.tar.gz文件和.sha256校验文件一起拷贝。在内网目标机器上进行验证sha256sum -c nginx-1.23-alpine.tar.gz.sha256如果显示OK说明文件完好无损。5.3 在内网环境导入镜像文件到位且校验通过后就可以导入镜像了。使用docker load命令。# 如果文件是gzip压缩的可以直接loaddocker会自动解压 docker load -i nginx-1.23-alpine.tar.gz # 如果是未压缩的tar文件用法一样 docker load -i nginx-1.23-alpine.tar导入成功后运行docker images你就能看到刚刚导入的镜像了。现在你就可以像在联网环境一样使用docker run或者结合docker-compose.yml文件来启动你的容器应用了。关于批量导入如果你一次性导入了多个镜像到一个tar文件docker load也会一次性把所有镜像都导入进去非常方便。导入后镜像的名称和标签Tag会保持原样。6. 进阶技巧与避坑指南掌握了基本流程我们再来聊聊一些能提升效率和稳定性的进阶技巧这些都是我在实际项目中用血泪教训换来的。6.1 使用私有镜像仓库作为中转站对于需要频繁迁移、镜像数量众多的场景每次都save/load效率太低而且难以管理版本。更专业的做法是在内网搭建一个私有Docker镜像仓库比如开源的registry:2镜像。你可以这样做在内网服务器上用刚装好的Docker运行一个Registry容器。在联网环境将镜像push到某个你能临时访问的中转仓库甚至可以是本地运行的registry。将中转仓库的存储目录通常是容器内的/var/lib/registry整个打包复制到内网。在内网的Registry容器中替换这个存储目录或者直接通过docker load导入镜像后再push到内网私有仓库。这样内网的其他开发测试机器就可以直接从内网私有仓库pull镜像实现了镜像的集中管理和分发。虽然初次搭建稍复杂但对于长期的内网开发运维来说是绝对值得的。6.2 编写自动化部署脚本手动执行一系列命令容易出错。我们应该把安装和导入过程脚本化。我通常会准备两个脚本install-docker.sh包含安装Docker引擎和docker-compose的所有命令并加入错误检查比如检查包是否存在、命令是否执行成功。load-images.sh遍历指定目录下的所有.tar.gz镜像文件用循环语句批量执行docker load。脚本化之后部署新环境就是“拷贝文件 - 运行脚本”两步极大减少了人为失误也方便后续的维护和知识传递。6.3 版本管理与回滚方案离线环境更要重视版本管理。对于Docker引擎本身建议将所有下载的.deb包、docker-compose二进制文件、以及导入的镜像tar包都按照版本号清晰地归档保存。例如建立v20231027-docker20.10.12-compose2.20.2/这样的目录结构。在导入镜像时不要总是覆盖latest标签。建议导入时带上明确的版本号标签或者使用docker tag命令为镜像打上内网专用的标签如myapp:v1.0-internal。这样当新版本应用出现问题时你可以快速回滚到旧版本的镜像。6.4 常见问题排查安装时依赖报错仔细阅读错误信息确认缺失的库名。回到准备机使用apt-get download missing-lib下载对应的deb包加入你的离线包集合重新安装。docker-compose命令找不到检查/usr/local/bin是否在系统的PATH环境变量中或者检查软链接/usr/bin/docker-compose是否创建成功。导入镜像失败首先用sha256sum检查文件完整性。其次确保有足够的磁盘空间。最后可以用tar -tzf file.tar.gz先预览一下tar包内的文件结构确认它是一个有效的Docker镜像存档。镜像导入后无法运行这可能是因为镜像本身依赖某些特定的内核特性或硬件比如某些数据库镜像对CPU有要求或者docker run的命令参数、环境变量在内网没有正确配置。需要对照原运行环境仔细检查。离线部署Docker生态看似繁琐但一旦掌握了这套方法你就拥有了在任何隔离环境中构建现代化应用基础设施的能力。关键在于准备阶段的细致和操作过程的规范。多练习几次把流程固化下来以后遇到类似需求就能从容应对了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…