Ubuntu环境下离线部署Docker生态全攻略:从安装到镜像迁移
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
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!