ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

离线环境快速部署 Docker 与 Docker Compose:从二进制到插件全攻略

离线环境快速部署 Docker 与 Docker Compose:从二进制到插件全攻略 简介面向需要离线部署 Docker 与 Docker Compose 的开发运维人员这份安装包将 Docker 27.3.1 离线二进制、systemd 服务配置与安装脚本整合在一起可有效解决内网或无外网环境下安装繁琐、依赖缺失的问题也适合在标准化交付容器基础环境时直接使用。压缩包共含 4 个文件整体大小约 84.53MB。其中 tgz 文件是 Docker 可离线解压的二进制稳定版service 文件用于将 Docker 注册为系统服务sh 脚本能够自动完成文件释放、环境配置与启动流程docker-compose 可执行文件则提供了多容器编排能力。各文件分工明确用户既可按步骤手动操作也可直接运行脚本快速搞定。目前已有 265 人学习下载。借助这套资源读者能够跳过逐条命令行的手动配置直接获得一套可用的 Docker 运行环境并同步掌握 docker-compose 的基本应用方式对于后续需要用 YAML 编排多个容器的项目也能在此基础上快速展开减少因版本不一致、配置遗漏导致的排错成本适合测试环境搭建与生产服务器批量初始化。1. 这份 docker 与 docker-compose 安装包专治离线环境“装不上”和“装不动”同事递给我一个 U 盘里面是解压好的 docker 和 docker-compose 安装包目标机器是一台没有外网的 CentOS 服务器。我原以为要花一下午折腾 yum 源和依赖结果十分钟不到docker info 已经正常回显。这类安装包看起来平平无奇价值在于绕开在线安装最折磨人的两个环节源超时和依赖缺失。这份资源适合三类人Windows 上装 Docker Desktop 老报错的新手内网服务器要装 docker 引擎和 compose 插件的运维想在新机器上一遍装完、不再为环境问题分心的从业者。装之前先看懂它包含哪几部分后续每一步才不会翻车。2. 安装选型Docker Desktop 与 Docker Engine 别装混装这类安装包最怕的不是缺文件而是把组件装错位置。同一台机器上dockerd、docker CLI、compose 插件三者的安装形态完全不同搞混之后可能出现命令存在但环境不可用的怪状态。2.1 引擎、命令行与 compose 插件先分清三层关系先对齐概念docker 不是一个大而全的软件而是由多个组件拼起来的。我们平时敲的docker run、docker ps走的是 CLI真正管理容器生命周期的是 dockerd 守护进程而 dockerd 又通过 containerd 和 runc 去起容器。这三者的关系如下表组件职责安装形态dockerd守护进程负责镜像、容器、网络等核心能力系统服务常驻后台docker CLI用户敲docker ...命令的入口单独二进制containerd容器运行时被 dockerd 调用二进制文件compose 插件让docker compose变成可用子命令放入 cli-plugins 目录这里有个容易踩的坑compose 早期版本是独立二进制docker-compose靠短横线调用现在官方主推的是 v2 插件形态命令变成了docker compose。两份资源如果弄混会出现脚本里写docker-compose up能用、写成docker compose up却报错的情况。我拿到安装包后的第一个动作就是确认里面带的是插件版还是独立版再决定脚本怎么写。2.2 Windows 与 Linux 岔路口不是所有机器都适合 Docker Desktop选安装方式只看一个场景就够有没有图形界面和桌面虚拟化后端。Windows 开发机首选 Docker Desktop因为它把引擎、compose、托盘管理、自动更新都打包好了日常点一点就能用。问题是 Docker Desktop 默认依赖 Hyper-V 或 WSL2 后端家庭版 Windows 没有 Hyper-V所以实操中几乎都走 WSL2 这条路径。Linux 服务器则恰恰相反——没有 GUI 需求装桌面版纯属给自己找麻烦正确做法是 docker 引擎静态二进制加上 compose 插件。对比给一个简单的选择表场景推荐安装方式原因Windows 开发机Docker Desktop自带引擎与 compose更新省心Linux 服务器docker 引擎 compose 插件无 GUI资源占用小内网 / 离线环境安装包手动分发绕开源超时依赖可控如果你的场景是“离线服务器”那么这份安装包里的 Linux 部分才是重点Windows 部分只是备用的桌面方案。2.3 安装包目录先看一遍结构再动手我习惯拿到这类资源后先展开目录确认三个目录是否存在windows、linux-amd64、scripts。一份典型的离线安装包长这样docker-and-compose/ ├── windows/ │ └── DockerDesktopInstaller.exe ├── linux-amd64/ │ ├── docker │ ├── dockerd │ ├── containerd │ ├── runc │ └── docker-compose ├── scripts/ │ ├── install-docker.sh │ └── check-env.sh └── README.md注意两个细节。第一linux-amd64 目录下的docker、dockerd是静态编译的二进制不是 rpm 或 deb 包所以不管目标机器是 CentOS、Ubuntu 还是其他发行版解压后放进/usr/local/bin就能用。第二scripts 里的check-env.sh值得看它会先确认架构是不是 amd64、磁盘剩多少、之前有没有装过 docker这些检查能避免装到一半才发现环境不兼容。3. Windows 装 Docker Desktop先解决 WSL2再双击安装包Windows 上 Docker Desktop 安装失败八成不是安装包的问题而是 WSL2 没就绪。下面这套顺序我每次重装机器都照着走一遍。3.1 装之前先查 WSL2一条命令定位 90% 的安装失败在 PowerShell 里先跑两条检测命令wsl --status wsl --list --verbosewsl --status会显示默认版本如果输出里出现“默认版本: 1”说明后续 Docker Desktop 很可能起不来wsl --list --verbose则列出当前已安装的发行版以及它们正在用 WSL1 还是 WSL2。解释一下为什么这步关键Docker Desktop 的 WSL2 后端要求内核支持如果系统里一个发行版都没有或者默认版本是 1安装过程虽然不报错但启动时会弹 virtualization support not detected。遇到这种情况我一般这样补wsl --install wsl --set-default-version 2第一条会装好 WSL 内核和默认发行版第二条把默认版本切到 2。两条命令都需要管理员权限装完必须重启。注意wsl --install在旧版 Windows 10 上不一定存在如果提示无法识别去系统设置里手动启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能再回来跑第二条。3.2 双击安装包之后必须勾选 WSL 2 引擎Docker Desktop 安装过程本身不需要过多干预一路默认就行。真正的坑出现在第一次启动后。启动进入 Settings在 General 标签页找到 “Use the WSL 2 based engine”确认这个开关处于勾选状态。很多翻车场景是安装包默认走了 Hyper-V 后端而家庭版 Windows 根本没有 Hyper-V于是一启动就报虚拟化不支持。我有个习惯性动作先勾上 WSL2 引擎再在 Resources - WSL Integration 里确认当前发行版被启用。这块设置好之后Docker Desktop 会把引擎挂在 WSL2 的发行版里docker version才能同时看到 Client 和 Server 两段信息。另外提醒一句如果机器内存只有 8GDocker Desktop 默认分给虚拟机的内存偏大可以在 Resources 里手动调低到 2G 左右这能明显减少 Windows 卡顿。3.3 用 hello-world 做落地验证镜像能跑通才算装完启动完成后别急着找镜像先拉一个最小的 hello-world 验证链路docker pull hello-world docker run --rm hello-world如果拉取环节卡住先看是不是网络问题本地网络能正常访问的情况下再检查 Docker Desktop 右下角鲸鱼图标是否变绿。docker run --rm hello-world会输出一段“Hello from Docker!”的说明文字看到它说明镜像拉取、容器创建、运行、清理整条链路都通了。跑完这一步Windows 侧的基本安装就算结束。剩下的 registry mirror 配置问题我在第 5 章会专门展开。4. Linux 服务器离线装 docker二进制解压 systemd 注册Linux 侧的核心思路不再是双击安装包而是把静态二进制放好、把守护进程注册成系统服务、把 compose 插件放进正确目录。三步做完systemctl start docker就能接管一切。4.1 解压静态二进制到 /usr/local/bin把安装包里的 linux-amd64 目录解压出来然后做一次批量复制tar -xzf docker-and-compose.tar.gz cd docker-and-compose/linux-amd64 cp docker dockerd containerd runc /usr/local/bin/ chmod x /usr/local/bin/docker /usr/local/bin/dockerd /usr/local/bin/containerd /usr/local/bin/runc这里解释一下为什么直接复制而不是用包管理器。离线环境里yum install docker-ce会因为缺依赖或源不可达直接失败而静态二进制不考虑发行版差异Debian、CentOS、Alpine 都能跑。复制后顺手验证一下docker version --client能输出 Client 版本就说明二进制架构没选错。如果提示 Exec format error几乎可以肯定是包下成了 arm64换回 amd64 目录重新复制即可。4.2 注册 systemd 服务开机自启与数据目录二进制放好后手动敲dockerd也能启动但一旦重启机器就没了而且日志没有托管。正确做法是写成 systemd 服务cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Afternetwork-online.target [Service] Typenotify ExecStart/usr/local/bin/dockerd --data-root /data/docker Restarton-failure [Install] WantedBymulti-user.target EOF这个 service 文件够用但很精简重点在两个地方。ExecStart里的--data-root /data/docker是数据目录参数默认在/var/lib/docker生产环境我通常挪到独立数据盘上避免系统盘被镜像撑满。Restarton-failure意思是守护进程异常退出时自动拉起容器服务挂了能自己恢复。启用并启动systemctl daemon-reload systemctl enable --now docker systemctl status docker --no-pager看到Active: active (running)就说明守护进程起来了。如果status里报找不到 dockerd多半是刚才复制时路径不对重新核对/usr/local/bin/dockerd是否存在。4.3 compose 插件放进 cli-plugins让 docker compose 成为子命令现代 docker CLI 查找 compose 插件的路径有两条用户级是~/.docker/cli-plugins系统级是/usr/local/lib/docker/cli-plugins。服务器上一般装系统级这样所有用户都能用mkdir -p /usr/local/lib/docker/cli-plugins cp docker-compose /usr/local/lib/docker/cli-plugins/ chmod x /usr/local/lib/docker/cli-plugins/docker-compose docker compose version注意一个细节插件文件必须叫docker-compose不能叫docker-compose-linux-amd64。CLI 是按文件名匹配的名字不对docker compose就提示 unknown command。最后一行docker compose version能输出版本号说明插件路径正确可以在 Linux 上直接用 compose 编排了。5. 安装启动避坑实录五条报错从现象到根因下面五条踩坑记录都来自实际装机的血泪经验每一条我都按“现象 - 原因 - 解决”写清楚照着排查比在网上翻帖子快得多。5.1 Virtualization support not detectedDocker Desktop 拒绝启动现象Windows 上双击 Docker Desktop 后弹窗提示 virtualization support not detected接下来就是反复要求重启也无济于事。这可能是 WSL2 后端没有真正跑起来也可能是 BIOS 层面的虚拟化开关被关掉了。原因Docker Desktop 的 WSL2 后端必须先有可用的虚拟机平台目标机器 BIOS 里 Intel VT-x 或 AMD-V 没开系统功能里“虚拟机平台”没启用或者 WSL 默认版本还是 1都会触发这个报错。解决先重启按 F2/Del 进 BIOS确认 CPU 虚拟化处于 Enabled再在 Windows 功能里勾选“虚拟机平台”执行wsl --set-default-version 2后重启。顺序不能反BIOS 不开后面全白搭。开机后重新打开 Docker Desktop这个报错通常就消失了。5.2 failed to connect to the docker api at npipedocker 命令连不上引擎现象docker version能显示 Client 版本但 Server 段报failed to connect to the docker api at npipe:////./pipe/dockerDesktopLinuxEngine在 Linux 上也可能报/var/run/docker.sock不存在。原因CLI 找到了但 dockerd 根本没在监听。Windows 场景通常是 Docker Desktop 种子进程没真正启动WSL 发行版没被集成Linux 场景则是 docker.service 启动失败或 socket 文件没生成。解决Windows 下先看右下角鲸鱼图标是不是绿的主等它变绿再敲命令不行就wsl --shutdown强行重启整个 WSL 子系统再打开 Docker Desktop。Linux 下执行journalctl -u docker.service -n 50看守护进程到底卡在哪一步再对应处理。这个报错最烦人的一点是它可能在你刚升级完 Docker Desktop 之后出现遇到时先想到“引擎没起来”而不是“重装”。5.3 docker: permission denied普通用户被拒之门外现象Linux 上切普通用户执行docker ps报permission denied然后是一长串 socket 路径的提示。切到 root 用户又完全正常。原因/var/run/docker.sock的属组是 root普通用户不在这个组里CLI 没有权限访问守护进程完成通信。解决把当前用户加进 docker 组然后重新登录使组权限生效。sudo usermod -aG docker $USER newgrp docker docker ps这里有一点必须提醒不要图省事执行chmod 777 /var/run/docker.sock。docker 的 socket 权限就是安全边界777 等于把宿主机 root 权限变相敞开只要对方能连上 docker daemon后续一切防护都是摆设。宁愿让用户重登一次也别放开这个权限。5.4 镜像拉取超时docker pull 卡住与 registry mirror 失效现象docker pull nginx执行后长时间停在 Pulling fs layer然后报 timeout 或连接被重置。离线环境装上 docker 后第一件事往往就是这个问题。原因默认官方仓库地址在部分网络环境下连接不稳或者网络波动导致镜像层下载中断。这不是安装包的问题是仓库访问链路的问题。解决配置 registry mirror让 docker 从可访问的镜像仓库拉取。编辑 daemon 配置{ registry-mirrors: [ https://your-registry-mirror.example.com ] }写完后重启systemctl daemon-reload systemctl restart docker注意registry-mirrors的地址必须是你确实能访问的仓库比如内网 Harbor 或云厂商控制台提供的加速地址。网上随手抄来的公网加速地址很多已经失效配进去不仅不加速反而会因为优先访问失效地址而更慢。另外说个经验/etc/docker/daemon.json如果原本不存在创建即可但每次改完 JSON 都要用docker info看下确认 Registry Mirrors 字段已经生效再重新 pull。改配置后不看生效状态就盲目重试很容易错觉“改了没用”。5.5 docker compose 命令不存在插件路径与文件名陷阱现象Linux 上执行docker compose version报docker: compose is not a docker command但独立命令docker-compose version又能用。原因docker CLI 按固定路径找插件插件不在 cli-plugins 目录或者文件名不是docker-composeCLI 就会认为没有这个子命令。另一类情况是安装包里带的是旧版独立二进制语法和插件版存在差异。解决把 compose 插件复制到正确目录并命名准确mkdir -p /usr/local/lib/docker/cli-plugins cp docker-compose /usr/local/lib/docker/cli-plugins/docker-compose chmod x /usr/local/lib/docker/cli-plugins/docker-compose docker compose version如果确认路径和文件名都没问题但仍然报错再检查 docker CLI 版本。CLI 太老可能不兼容 v2 插件需要把安装包里对应的 docker 二进制更新到目标机器。两条命令的区别记一下docker-compose是独立二进制docker compose是 CLI 子命令脚本里混用会带来不必要的兼容性负担。6. 装完后的验证与调试习惯十分钟确认环境真正可用6.1 一条验证链引擎、编排、拉取全跑通装完别急着开始做事先跑一条命令矩阵docker version --format {{.Server.Version}} docker compose version docker run --rm hello-world第一条输出的 Server.Version 为空就说明守护进程没起来第二条确认 compose 插件被 CLI 识别第三条验证镜像中心链路端到端可用。三行全部通过才敢放心往这台机器上丢业务镜像。6.2 用 compose 起一个 redis 栈顺带验证编排能力只验证单个命令还不够我习惯再起一个最小 compose 栈确认网络、端口映射、数据目录都没问题。下面这份配置拉起来很快services: redis: image: redis:7-alpine container_name: test-redis ports: - 6379:6379 volumes: - ./redis-data:/data command: [redis-server, --appendonly, yes]执行mkdir -p redis-data docker compose up -d docker compose psdocker compose ps里 STATUS 显示 running 或 healthy再顺手docker exec test-redis redis-cli ping得到 PONG编排这块就算实测能用了。这个验证之所以用 redis是因为它体积小、启动快一条命令就能测出端口映射和 exec 链路。6.3 把验证结果写进安装说明下次重装有后悔药从那以后我每次装完环境都强制走一遍这套验证并把改动过的配置记下来改了哪些 daemon.json、数据目录指到了哪、compose 插件放到了哪个路径。下次重装或换机器时直接照着记录操作而不是重新踩一遍坑。这套习惯看起来琐碎实际是离线环境最省时间的后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表