详解 Linux 远程 Docker 自动化部署脚本:从 SSH 连接到镜像拉取的全流程
在服务器管理与应用部署中,自动化脚本是提升效率、减少人为错误的关键工具。本文将以一份基于 Python+Paramiko 的 Linux 远程 Docker 部署脚本为例,按功能模块拆解其实现逻辑,带你理解从 SSH 连接建立到 Docker 环境配置、镜像拉取的完整自动化流程,同时掌握脚本设计中的关键技术点与最佳实践。
一、脚本整体架构与核心目标
在拆解细节前,先明确脚本的定位与核心功能:该脚本面向openEuler/CentOS 系统,通过 Python 的paramiko库实现远程 SSH 连接,自动化完成从 “环境初始化” 到 “Docker 部署 + 镜像拉取” 的全流程,无需人工登录服务器操作。
核心目标
- 自动建立并维持 SSH 连接(含断线重连、保活机制);
- 初始化服务器环境(关闭防火墙 / SELinux、清理旧依赖);
- 安装 Docker 引擎并配置自定义镜像源;
- 拉取指定 Docker 镜像(含重试机制,应对网络波动);
- 兼容不同
paramiko版本,降低环境依赖门槛。
模块划分
脚本按 “功能职责” 分为 5 个核心模块,各模块独立且可复用,结构如下:
plaintext
脚本模块划分
├─ 1. 依赖导入与全局配置模块
├─ 2. SSH客户端创建与登录模块(create_ssh_client)
├─ 3. 远程命令执行模块(run_remote_command)
├─ 4. Docker镜像源配置模块(configure_docker_mirror)
├─ 5. 完整部署流程模块(deploy_docker_and_images)
└─ 6. 主函数与入口(main)
二、模块 1:依赖导入与全局配置
脚本的 “基础层”,负责导入必要库、定义远程服务器核心参数,是后续所有操作的前提。
代码解析
python
运行
#!/usr/bin/env python3
import paramiko # 实现SSH协议的核心库
import sys # 处理命令行参数、程序退出
import time # 提供时间延迟(用于重试间隔)
# 远程服务器信息(需根据实际环境修改)
REMOTE_IP = "88.88.88.17" # 目标服务器IP
REMOTE_USER = "root" # 登录用户名(root权限确保操作无权限问题)
REMOTE_PASSWORD = "Admin@2025" # 登录密码(生产环境建议用密钥登录,更安全)
SSH_PORT = 22 # SSH默认端口(非默认需修改)
关键说明
- shebang 头
#!/usr/bin/env python3:指定脚本使用系统中的 Python3 解释器,避免因 Python 版本冲突导致执行失败; - 全局参数硬编码问题:当前脚本将服务器密码直接写在代码中,生产环境需优化(推荐用
os.getenv()从环境变量读取,或用密钥文件登录); paramiko库作用:Python 生态中最常用的 SSH 客户端库,支持远程命令执行、文件传输,兼容绝大多数 Linux 系统。
三、模块 2:SSH 客户端创建与登录(create_ssh_client)
脚本的 “连接层”,负责建立 SSH 连接、处理登录异常,并配置连接保活,解决长时间操作导致的连接断开问题。
代码解析
python
运行
def create_ssh_client():
"""创建SSH客户端并自动登录,兼容所有paramiko版本"""
try:
# 1. 初始化SSH客户端对象
ssh = paramiko.SSHClient()
# 2. 自动接受未知主机密钥(避免首次连接时手动确认)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 3. 建立SSH连接(基础配置,避免版本兼容问题)
ssh.connect(
hostname=REMOTE_IP,
port=SSH_PORT,
username=REMOTE_USER,
password=REMOTE_PASSWORD,
timeout=30 # 连接超时时间(30秒)
)
# 4. 配置连接保活(解决长时间无操作导致的断开)
transport = ssh.get_transport() # 获取底层传输对象
transport.set_keepalive(60) # 每60秒发送1个保活包
print("SSH连接成功,已自动登录root用户")
return ssh # 返回可用的SSH客户端对象
# 5. 捕获所有异常(连接失败时退出程序)
except Exception as e:
print(f"SSH连接失败: {str(e)}")
sys.exit(1) # 非0退出码表示程


最低0.47元/天 解锁文章
1597

被折叠的 条评论
为什么被折叠?



