1. 为什么需要离线部署Docker-compose?

在企业内网或安全隔离环境中,服务器通常无法直接访问外网资源。这时候传统的在线安装方式就完全失效了。我遇到过不少客户现场,运维人员带着U盘来回跑机房,就为了部署几个简单的容器服务。离线部署不仅能解决网络隔离问题,还能确保部署过程的安全性和可控性。

离线部署的核心思路其实很简单:在有网环境准备好所有依赖,然后完整迁移到内网环境。但实际操作中会遇到各种坑,比如架构不匹配、权限问题、依赖缺失等。下面我就结合自己踩过的坑,分享一套经过实战检验的标准化流程。

2. 环境准备阶段

2.1 系统环境检查

首先确认目标服务器的基本环境。打开终端执行:

# 查看系统信息
cat /etc/os-release
uname -m

关键检查点:

  • 操作系统类型(CentOS/Ubuntu等)
  • 系统架构(x86_64或arm)
  • 已安装的Docker版本(如果有)

我曾经在一个arm架构的服务器上误装了x86的二进制包,结果各种奇怪的报错,排查了半天才发现架构不匹配。所以这一步千万不能省略。

2.2 工具依赖确认

确保系统有以下基础工具:

  • tar/unzip:用于解压安装包
  • curl/wget:部分场景需要(可选)
  • sudo权限:安装系统级服务必备

可以用这个命令快速检查:

which tar unzip curl wget sudo || echo "缺失必要工具"

2.3 文件传输方案规划

根据内网安全策略选择合适的传输方式:

  • 物理介质:U盘/移动硬盘(最安全但效率低)
  • 内部网络:SCP/SFTP(需提前配置好SSH)
  • 共享存储:NFS/Samba(适合批量部署)

我一般会准备一个专用目录存放安装文件,比如/opt/offline_pkgs,方便统一管理。

3. 获取Docker-compose二进制文件

3.1 版本选择策略

访问Docker官方GitHub仓库的Releases页面,选择稳定版本。对于生产环境,建议使用次新版而非最新版,避免踩到新版本的坑。

可以通过API获取最新版本号:

# 在有网环境执行
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d'"' -f4)
echo $COMPOSE_VERSION

3.2 多架构适配下载

根据目标服务器架构选择对应的二进制包:

# x86_64架构
wget https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-x86_64

# ARM架构(树莓派等)
wget https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-aarch64

3.3 完整性校验(重要!)

下载后务必验证文件完整性:

wget https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/checksums.txt
sha256sum -c checksums.txt 2>/dev/null | grep "docker-compose-linux"

这个步骤可以避免因文件损坏导致的诡异问题。曾经有个客户因为跳过校验,结果部署时各种段错误,浪费了大半天时间。

4. 离线安装实战步骤

4.1 文件传输与放置

将下载好的二进制文件传输到目标服务器:

# 示例:通过SCP传输
scp docker-compose-linux-x86_64 user@target:/tmp/

然后在目标服务器上执行:

# 移动到系统PATH目录
sudo mv /tmp/docker-compose-linux-x86_64 /usr/local/bin/docker-compose

# 设置可执行权限
sudo chmod +x /usr/local/bin/docker-compose

4.2 路径配置技巧

如果系统已有旧版本,建议先备份:

# 备份旧版本(如果有)
[ -f /usr/bin/docker-compose ] && sudo mv /usr/bin/docker-compose /usr/bin/docker-compose.bak

# 创建软链接
sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose

4.3 权限问题处理

遇到权限拒绝时,可以尝试:

# 检查SELinux状态
getenforce

# 临时关闭(生产环境慎用)
sudo setenforce 0

5. 验证与功能测试

5.1 基础验证

# 检查版本
docker-compose version

# 应该输出类似:
# Docker Compose version v2.23.0

5.2 实战测试

创建一个测试用的docker-compose.yml:

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"

然后执行:

# 启动服务
docker-compose up -d

# 检查状态
docker-compose ps

# 测试访问
curl localhost:8080

5.3 命令补全配置(可选)

提升使用体验的实用技巧:

# 下载补全脚本(需在有网环境提前准备)
wget https://raw.githubusercontent.com/docker/compose/v${COMPOSE_VERSION}/contrib/completion/bash/docker-compose

# 安装到系统
sudo mv docker-compose /etc/bash_completion.d/
source ~/.bashrc

6. 常见问题排查指南

6.1 命令未找到

# 检查PATH
echo $PATH | grep /usr/local/bin

# 临时添加PATH
export PATH=$PATH:/usr/local/bin

6.2 版本冲突

# 查看实际调用的二进制路径
which docker-compose

# 检查软链接
ls -l $(which docker-compose)

6.3 架构不兼容

# 检查二进制文件架构
file $(which docker-compose)

# 应该显示类似:
# ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked...

7. 高级部署方案

对于需要批量部署的场景,可以编写自动化脚本:

#!/bin/bash
COMPOSE_VERSION="v2.23.0"
BINARY_URL="https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-$(uname -m)"
INSTALL_DIR="/usr/local/bin"

echo "下载Docker Compose..."
wget -q $BINARY_URL -O /tmp/docker-compose

echo "安装到系统目录..."
sudo install /tmp/docker-compose $INSTALL_DIR/docker-compose

echo "设置权限..."
sudo chmod +x $INSTALL_DIR/docker-compose

echo "验证安装..."
$INSTALL_DIR/docker-compose version

保存为install-compose.sh后,可以通过ansible等工具批量执行。

8. 安全加固建议

在生产环境中,还需要考虑:

  1. 二进制文件校验:除了SHA256校验,还可以配置文件完整性监控
  2. 最小权限原则:为docker-compose创建专用系统账户
  3. 日志审计:配置详细的Docker日志收集
  4. 网络隔离:使用内部镜像仓库替代Docker Hub

我曾经帮某金融机构部署时,他们的安全团队要求所有二进制文件必须经过三重校验,包括病毒扫描、哈希校验和代码签名验证。虽然流程繁琐,但对于关键业务系统确实有必要。

9. 不同系统特殊处理

9.1 CentOS/RHEL系列

可能需要额外处理SELinux:

# 检查SELinux状态
sestatus

# 永久关闭(需重启)
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

9.2 Ubuntu/Debian

注意apparmor的影响:

# 检查apparmor状态
aa-status

# 临时关闭某个profile
sudo apparmor_parser -R /etc/apparmor.d/docker

10. 维护与升级策略

建议建立离线包版本管理制度:

  1. 在内部wiki记录各环境使用的版本
  2. 保留历史版本的安装包
  3. 升级前在测试环境验证兼容性

可以创建一个简单的版本管理目录结构:

/opt/offline_pkgs/
├── docker-compose
│   ├── v2.23.0
│   │   ├── linux-x86_64
│   │   └── checksums.txt
│   └── v2.22.0
│       ├── linux-aarch64
│       └── checksums.txt
└── README.md

这套方案在某制造业客户的生产环境中运行了3年,支持了200+服务器的容器化部署。关键是要形成标准化流程,避免每个运维人员都有自己的"独门秘籍"。

更多推荐