恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
CentOS 7 内网离线安装 Docker 与 docker-compose 完整指南
首页
资讯中心
/
CentOS 7 内网离线安装 Docker 与 docker-compose 完整指南
CentOS 7 内网离线安装 Docker 与 docker-compose 完整指南
发布时间:2026/9/20 15:25:46
内网环境装 Docker最折磨人的从来不是 Docker 本身而是什么都下不了。外网一条yum install docker-ce就完事的事情到了内网就得变成找一台能上网的机器、把 RPM 包一个个下全、再想办法把依赖关系理清楚、最后搬进内网手动装。中间任何一步漏了包rpm -ivh就会甩你一脸Failed dependencies然后你只能对着屏幕发呆。这篇内容就是把我自己在 CentOS 7 内网环境里反复装 Docker 的经验整理出来从离线包的准备、依赖的补齐、docker-compose 的单独处理到装完之后 systemd 起不来、镜像加速失效、非 root 用户用不了 docker 这些坑全部走一遍。适合手上有内网服务器、又必须把 Docker 跑起来的人参考不管你是运维、后端还是刚接触 Linux 的新手照着做基本能一次跑通。1. 先搞清楚内网离线安装到底难在哪很多人第一次做离线安装思路是把 docker-ce 的 rpm 下下来传进去装上就完了。真这么干十有八九会失败。原因在于 Docker 的 RPM 包不是孤立的它有一串依赖而这些依赖在最小化安装的 CentOS 7 上往往并不齐全。1.1 离线安装的三个真实痛点第一个痛点是依赖链不透明。docker-ce依赖containerd.io、docker-ce-cli、docker-ce-rootless-extras等而containerd.io又依赖libseccomp、container-selinux等。你在外网机器上yum install时yum 会自动帮你把这些都拉下来你根本感知不到它们的存在。一旦离线这些隐形依赖就全暴露出来了。第二个痛点是版本匹配。CentOS 7 和 CentOS 8、Rocky Linux、Ubuntu 的包格式完全不同CentOS 7 用的是el7后缀的 RPM你要是下成了el8的包装上去要么报错要么行为诡异。而且 Docker 官方仓库里同一版本会针对不同系统架构x86_64、aarch64出不同的包下错了架构一样白搭。第三个痛点是docker-compose 是独立的一条线。docker-compose 早期是 Python 写的用 pip 装后来官方主推 Go 写的二进制版本直接一个可执行文件丢到/usr/local/bin就行。这两条路在内网里的处理方式完全不同很多人卡在这里Docker 装好了compose 死活装不上。提示如果你的内网机器连yum源都没有那连yum install本地 rpm 都用不了得用rpm -ivh手动装这时候依赖顺序就特别重要。1.2 为什么推荐用 RPM 包而不是二进制 tar 包Docker 官方其实也提供静态二进制包docker-version.tgz解压出来把docker、dockerd等文件丢到/usr/bin就能用。听起来更简单但我不推荐在内网生产环境这么干原因有三个。一是没有 systemd 集成。RPM 包安装时会自动生成/usr/lib/systemd/system/docker.servicesystemctl start docker直接就能用。二进制包你得自己写 service 文件写错了排查起来很烦。二是没有自动的 containerd 和 runc 管理。RPM 包会把 containerd、runc 这些运行时组件一起装好并配置好路径二进制包你得自己保证这些组件版本兼容。三是升级和卸载麻烦。RPM 有rpm -e和rpm -Uvh二进制包你得手动删文件容易删不干净。所以除非你的系统特别特殊比如某些裁剪过的国产化系统否则优先走 RPM 路线。1.3 准备工作确认系统版本和架构动手之前先在内网机器上跑两条命令确认环境cat /etc/redhat-release uname -m第一条看系统版本CentOS 7 会输出类似CentOS Linux release 7.9.2009 (Core)。第二条看架构一般是x86_64国产化 ARM 服务器可能是aarch64。这两个信息决定了你要下哪个后缀的包。同时确认一下内网机器上有没有装过旧版本 Docker有的话先清掉yum remove docker docker-client docker-client-latest docker-common \ docker-latest docker-latest-logrotate docker-logrotate docker-engine如果是用 rpm 装的用rpm -qa | grep docker查一下有残留就rpm -e卸掉。这一步别偷懒新旧版本混装是后面各种诡异问题的根源。2. 在外网机器上把离线包一次性备齐这一步是整个流程的核心。备包备得全内网安装就是几分钟的事备不全你就得在内网和外网之间来回搬文件效率极低。2.1 用 yumdownloader 把依赖一起拉下来最省事的办法是找一台和外网机器系统版本完全一致的机器最好是同版本 CentOS 7用yumdownloader配合--resolve参数把 Docker 及其所有依赖一次性下载到本地目录。先装工具yum install -y yum-utils然后配置 Docker 官方仓库这一步只是为了让 yumdownloader 知道去哪找包yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo接着创建下载目录并执行下载mkdir -p /tmp/docker-offline yumdownloader --resolve --destdir/tmp/docker-offline \ docker-ce docker-ce-cli containerd.io docker-compose-plugin--resolve是关键它会把所有依赖包一并下载。执行完之后ls /tmp/docker-offline你会看到一堆 rpm通常包括包名作用docker-ceDocker 引擎主程序docker-ce-clidocker 命令行客户端containerd.io容器运行时docker-buildx-plugin构建扩展插件docker-compose-plugincompose v2 插件container-selinuxSELinux 策略CentOS 7 必需libseccomp系统调用过滤库libcgroupcgroup 支持库如果你只想要 compose 的独立二进制版本那docker-compose-plugin可以不下后面单独处理。2.2 手动补齐 yumdownloader 漏掉的包yumdownloader --resolve大部分情况够用但在最小化安装的 CentOS 7 上有时候container-selinux会因为版本问题没被拉下来。这时候你得手动补。去 Docker 官方仓库或者镜像站找container-selinux的 el7 版本注意要选2.9以上的版本低版本会导致 docker-ce 装不上。下载命令示例wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm另外libseccomp如果系统里版本太低低于 2.3也需要单独下新版本。用rpm -qa | grep libseccomp查一下当前版本。注意不要盲目追求最新版。Docker 24.x 之后的版本对 CentOS 7 的支持逐渐减弱CentOS 7 上建议用 20.10.x 或 24.0.x 这类经过长期验证的版本稳定性更好。2.3 docker-compose 二进制的单独准备如果你不想用 compose 插件而是想要独立的docker-compose命令那就去 GitHub Releases 页面下载对应架构的二进制文件。x86_64 机器下docker-compose-linux-x86_64ARM 机器下docker-compose-linux-aarch64。下载完之后重命名为docker-compose这个文件后面直接丢到内网机器的/usr/local/bin就行不需要任何依赖。这也是我推荐独立二进制版本的原因——它足够简单没有依赖链。wget https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-linux-x86_64 mv docker-compose-linux-x86_64 docker-compose chmod x docker-compose2.4 打包和传输把/tmp/docker-offline目录和docker-compose二进制一起打包tar -czvf docker-offline.tar.gz /tmp/docker-offline docker-compose传输方式看你的内网环境U 盘、内网文件服务器、跳板机 scp 都行。这一步没什么技术含量但要注意传输过程中文件完整性传完用md5sum对一下避免包损坏导致安装时报莫名其妙的错。3. 内网机器上的安装实操包搬进来了接下来就是装。这一步的顺序和参数很讲究顺序错了依赖就报错。3.1 用 rpm 批量安装并处理依赖顺序进入包所在目录先看一眼都有哪些包cd /tmp/docker-offline ls -1 *.rpm推荐用一条命令批量安装让 rpm 自己去解析依赖rpm -ivh *.rpm如果报Failed dependencies说明还有包没备齐根据报错信息去外网补下对应的包。如果报的是container-selinux相关那就是前面说的那个包没下对版本。有时候会遇到包之间的安装顺序问题比如containerd.io必须先于docker-ce装。这种情况下可以按顺序单独装rpm -ivh container-selinux-*.rpm rpm -ivh libseccomp-*.rpm rpm -ivh containerd.io-*.rpm rpm -ivh docker-ce-cli-*.rpm rpm -ivh docker-ce-*.rpm装完之后验证一下docker --version docker infodocker --version能输出版本号说明 CLI 装好了。docker info能输出服务端信息说明 daemon 也起来了。如果docker info报Cannot connect to the Docker daemon那就是服务没启动看下一节。3.2 启动服务并设置开机自启RPM 安装会自动创建 systemd 服务文件直接启动即可systemctl start docker systemctl enable docker systemctl status dockerstatus显示active (running)就说明起来了。如果显示failed用journalctl -u docker -n 50看最近 50 行日志常见原因有SELinux 拦截临时用setenforce 0测试如果好了就说明是 SELinux 问题需要正确配置container-selinux而不是直接关 SELinux。cgroup 驱动不匹配CentOS 7 默认用 cgroupfs如果系统启用了 systemd cgroup需要在/etc/docker/daemon.json里配置exec-opts: [native.cgroupdriversystemd]。存储驱动问题默认 overlay2如果内核太老不支持会报错需要升级内核或换驱动。3.3 安装 docker-compose 并验证把前面准备的docker-compose二进制复制到系统路径cp docker-compose /usr/local/bin/ chmod x /usr/local/bin/docker-compose docker-compose --version能输出版本号就成功了。如果你用的是 compose 插件版本docker-compose-plugin那命令是docker compose中间是空格验证方式docker compose version两种方式不要混用插件版和独立版同时存在可能会冲突。我个人在内网环境更倾向独立二进制版因为升级和替换都简单一个文件的事。3.4 配置镜像加速和日志限制内网机器虽然上不了外网但如果你的内网有私有镜像仓库Harbor 之类或者有内网代理那 daemon.json 还是要配一下。编辑/etc/docker/daemon.json{ exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker }log-opts这两行特别重要不配的话容器日志会无限增长把磁盘撑爆是迟早的事。>systemctl daemon-reload systemctl restart docker4. 装完之后最容易踩的五个坑Docker 装完不代表能用下面这几个问题我在不同项目里反复遇到每一个都能让人卡半天。4.1 非 root 用户执行 docker 报权限错误普通用户跑docker ps会报permission denied while trying to connect to the Docker daemon socket。解决办法是把用户加入 docker 组usermod -aG docker yourusername然后必须重新登录才生效newgrp docker只能临时生效当前会话。很多人加完组发现还是不行就是因为没重新登录。注意docker 组权限等同于 root 权限因为容器可以挂载宿主机任意目录。生产环境要谨慎授权别随便给普通用户加。4.2 systemd 服务起不来但手动跑 dockerd 正常这种情况通常是 systemd 的 service 文件里配置了EnvironmentFile或者ExecStart参数和 daemon.json 冲突。用systemctl cat docker看服务文件内容重点看ExecStart那行有没有--exec-opt之类的参数和 daemon.json 重复。另一个常见原因是/etc/docker/daemon.json格式错误比如多了个逗号、少了引号。用python -m json.tool /etc/docker/daemon.json验证一下 JSON 合法性。4.3 容器内 DNS 解析失败内网环境经常遇到容器里ping不通域名但宿主机正常。这是因为 Docker 默认用宿主机的/etc/resolv.conf但内网 DNS 配置可能没被正确传递。解决办法是在 daemon.json 里显式指定{ dns: [10.0.0.2, 10.0.0.3] }把 IP 换成你内网实际的 DNS 服务器地址。改完重启 docker 生效。4.4 镜像导入导出时的格式问题内网没法docker pull只能在外网docker save成 tar 包再在内网docker load。这里有个坑docker save出来的包如果用了 gzip 压缩docker load有时候识别不了建议直接docker save -o image.tar image:tag不压缩虽然文件大但兼容性好。导入之后用docker images确认镜像在注意 tag 别丢了丢了 tag 的镜像用起来很麻烦。4.5 磁盘空间被日志和镜像撑满前面配了日志限制但历史遗留的容器日志不会自动清理。用这条命令查一下各容器日志大小du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -20清理的话最稳妥是重建容器或者用truncate -s 0 logfile清空不推荐直接 rm会导致文件句柄问题。镜像清理用docker image prune -a但注意别把在用的镜像删了。5. 一套可复用的离线安装检查清单做了这么多次离线安装我总结了一套检查清单每次照着过一遍基本不会翻车。5.1 安装前的环境核对检查项命令预期结果系统版本cat /etc/redhat-releaseCentOS 7.x架构uname -mx86_64 或 aarch64旧版本残留rpm -qa | grep docker无输出SELinux 状态getenforceEnforcing 或 Permissive磁盘空间df -h /var至少 20G 可用5.2 安装后的功能验证装完别急着上业务先跑几个基础验证docker run --rm hello-world docker run --rm -it centos:7 bash -c echo ok docker-compose versionhello-world能跑通说明镜像加载、容器创建、网络都正常。第二个命令验证能进容器交互。第三个验证 compose 可用。如果hello-world跑不了内网没这个镜像那就用你docker load进来的任意镜像跑一个简单命令比如docker run --rm your-image echo ok。5.3 版本兼容性对照不同 CentOS 版本和 Docker 版本的搭配有讲究下面这张表是我实测下来比较稳的组合系统推荐 Docker 版本备注CentOS 7.6-7.920.10.x / 24.0.x最稳社区支持好CentOS 8 / Rocky 824.0.x / 25.x注意 podman 冲突Ubuntu 20.0424.0.x官方支持好国产化 ARM 系统20.10.x需确认 aarch64 包CentOS 7 上我强烈建议别追新20.10.x 这个系列用了好几年坑都被踩平了。新版本在 CentOS 7 上偶尔会有 cgroup 或 iptables 的兼容问题。5.4 离线包目录的规范管理最后分享一个习惯每次离线安装我都会把用到的所有包按版本归档到一个目录命名格式docker-offline-version-date里面放一个install.sh脚本记录安装命令。这样下次换机器或者重装直接拿这个目录就行不用重新备包。#!/bin/bash # install.sh set -e cd $(dirname $0) rpm -ivh *.rpm cp docker-compose /usr/local/bin/ chmod x /usr/local/bin/docker-compose systemctl start docker systemctl enable docker docker --version docker-compose --version这个脚本不复杂但能省掉大量重复劳动。尤其是团队里多台内网机器要装的时候一个脚本加一个包目录谁都能上手。我个人在实际操作中的体会是离线安装这件事80% 的功夫花在备包阶段20% 花在安装阶段。备包备得全、版本对得准内网那边就是几条命令的事。反过来如果备包时偷懒内网安装就会变成一场反复搬文件的拉锯战。所以宁可在外网多花十分钟把依赖理清楚也别在内网来回折腾。另外装完之后第一时间把daemon.json的日志限制配上这个习惯能帮你避免未来某天磁盘突然爆满的惊魂时刻。