在纯内网或隔离网络环境中部署容器编排工具,是很多企业IT运维和开发者都会遇到的典型场景。上周我就在客户现场遇到一个棘手案例:某金融机构测试环境需要部署一套基于容器的微服务系统,但服务器完全隔离外网,甚至连代理都不允许配置。这种环境下安装Docker Compose的经历,让我积累了不少实战经验。
离线安装的核心难点在于依赖链的完整性。与在线安装不同,apt-get install这类命令在离线环境下完全失效,所有依赖都需要手动下载、传输和校验。更麻烦的是,Docker Compose作为Docker的编排工具,其安装过程涉及Python环境、二进制包下载、权限配置等多个环节,任何一个环节缺失都会导致安装失败。
首先通过lsb_release -a确认Ubuntu具体版本。不同版本的库文件可能存在差异,比如Ubuntu 18.04和20.04的glibc版本就不同。我这次遇到的是Ubuntu 20.04.4 LTS,内核版本5.4.0-126-generic。
检查关键依赖是否存在:
bash复制which python3 # 需要Python 3.6+
ldconfig -p | grep libffi # 检查libffi库
openssl version # 需要OpenSSL 1.1.1+
在有网络的环境中,准备以下安装包(以amd64架构为例):
bash复制# 获取最新稳定版
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | cut -d'"' -f4)
curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o docker-compose
bash复制mkdir -p offline_packages/python
apt-get download python3 python3-pip python3-setuptools python3-wheel
mv *.deb offline_packages/python/
bash复制apt-get download libffi7 libssl1.1 libgmp10 libpython3.8
将下载的包通过安全U盘或内部文件服务器传输到目标机器。务必校验文件完整性:
bash复制sha256sum docker-compose > checksum.txt
# 在目标机器上验证
sha256sum -c checksum.txt
bash复制# 安装Python环境
sudo dpkg -i python/*.deb
# 安装系统依赖
sudo dpkg -i libffi7_*.deb libssl1.1_*.deb
# 修复可能的依赖问题
sudo apt-get -f install
bash复制# 移动二进制文件
sudo mv docker-compose /usr/local/bin/
# 设置执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建符号链接(可选)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
验证安装:
bash复制docker-compose --version
# 应输出类似:Docker Compose version v2.17.2
如果需要使用现有Compose文件:
bash复制# 在有网环境保存镜像
docker save -o nginx.tar nginx:latest
# 在离线环境加载
docker load -i nginx.tar
错误示例:
code复制docker-compose: error while loading shared libraries: libffi.so.7: cannot open shared object file
解决方案:
bash复制# 查找缺失库
ldd $(which docker-compose)
# 手动安装对应版本的libffi
sudo dpkg -i libffi7_3.3-4_amd64.deb
如果系统存在多个Python版本:
bash复制# 明确指定Python3路径
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
在金融等严格环境中可能需要:
bash复制# 更新CA证书
sudo cp internal_ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
bash复制echo "预期的SHA256值" | sha256sum -c -
bash复制sudo chown root:docker /usr/local/bin/docker-compose
sudo chmod 750 /usr/local/bin/docker-compose
bash复制# 在/etc/docker/daemon.json中添加
{
"audit-log": "/var/log/docker-audit.log"
}
离线环境下的升级需要特别规划:
bash复制# 保留旧版本
sudo mv /usr/local/bin/docker-compose /usr/local/bin/docker-compose-$(date +%Y%m%d)
bash复制# 记录安装详情
echo "$(date) - Installed docker-compose ${COMPOSE_VERSION}" >> /var/log/offline_install.log
bash复制# 测试旧版本是否可用
/usr/local/bin/docker-compose-20230801 version
在实际操作中,我发现金融行业的离线环境往往还面临额外的安全策略限制。比如某次遇到SELinux强制模式导致的问题,需要通过audit2allow工具生成新的策略模块。这类经验让我深刻体会到:离线安装从来不是简单的文件拷贝,而是需要对整个软件栈有深入理解的系统工程。