基于Docker Compose编排JumpServer堡垒机:从单机到高可用部署实践
1. 为什么选择Docker Compose部署JumpServer
第一次接触JumpServer时,我像大多数人一样直接用Docker单容器部署。结果发现每次升级都要手动迁移数据,配置文件散落在各处,Redis和MySQL还要单独维护。这种"裸奔"式部署在生产环境跑了两周就遇到服务中断,让我下定决心改用Docker Compose。
Docker Compose就像乐高说明书,把零散的容器组装成有机整体。通过一个YAML文件就能定义MySQL、Redis、Core等服务的关联关系。去年我们团队扩容时,原本需要3天完成的部署现在只需复制文件改参数,半小时就能拉起新集群。
最让我惊喜的是它的配置管理能力。所有环境变量、数据卷挂载点都在docker-compose.yml里集中定义。上周发现Redis需要调优内存参数,直接在文件里添加- maxmemory 2gb就完成了全集群统一更新,再也不用逐个容器修改。
2. 从零开始准备部署环境
2.1 硬件与系统要求
实测发现4核8G是性价比最高的配置。我们给客户部署时,20人团队管理200台服务器,日常CPU利用率不到30%。但内存建议不低于8G,特别是要开启会话录像时——我曾遇到内存不足导致录像服务频繁崩溃的情况。
操作系统首选Ubuntu 20.04 LTS,它对Docker的兼容性最好。有次在CentOS 7上遇到cgroup v2的兼容性问题,折腾了半天才解决。现在我的部署清单里第一条就是确认系统版本:
# 查看系统版本
lsb_release -a
# 内核版本需≥5.4
uname -r
2.2 Docker环境配置
国内用户一定要配置镜像加速。阿里云的加速器实测拉取镜像速度能提升5倍:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<你的ID>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl restart docker
安装Docker Compose时注意版本兼容性。v2.2.3有个已知的YAML解析bug会导致服务启动失败,推荐使用v2.17.2:
# 安装指定版本
sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3. 编写生产级Compose文件
3.1 基础服务定义
这是经过10+次迭代的Compose模板精华部分。关键点在于网络规划——一定要为数据库和Redis创建独立网络,避免核心服务暴露在默认网络:
version: '3.8'
networks:
backend:
driver: bridge
database:
internal: true
services:
redis:
image: redis:6.2-alpine
networks:
- backend
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
3.2 高可用配置技巧
MySQL主从复制是保障服务连续性的关键。这个配置实现了自动故障转移,当主库宕机时从库会在30秒内接管:
mysql-master:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
MYSQL_REPLICATION_USER: replica
MYSQL_REPLICATION_PASSWORD: $REPLICA_PASSWORD
networks:
- database
volumes:
- mysql_master:/var/lib/mysql
mysql-slave:
image: mysql:5.7
depends_on:
- mysql-master
environment:
MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
MYSQL_REPLICATION_USER: replica
MYSQL_REPLICATION_PASSWORD: $REPLICA_PASSWORD
command: >
--server-id=2
--log-bin=mysql-bin
--relay-log=mysql-relay-bin
--read-only=1
--replicate-do-db=jumpserver
4. 持久化与数据安全
4.1 存储卷最佳实践
千万别把数据库直接挂载到主机目录!我吃过亏——文件权限问题导致MySQL无法启动。应该用命名卷让Docker管理物理存储:
volumes:
mysql_master:
driver_opts:
type: ext4
device: /dev/sdb1
redis_data:
driver: local
会话录像建议用NFS共享存储。我们在AWS环境用EFS挂载,录像文件自动同步到S3备份:
volumes:
recordings:
driver: local
driver_opts:
type: nfs
o: addr=10.0.0.1,rw
device: ":/path/to/nfs/share"
4.2 备份恢复方案
每天凌晨3点自动备份的脚本,已经帮客户成功恢复了3次误删数据:
#!/bin/bash
docker exec jumpserver_db_1 mysqldump -uroot -p$PASSWORD jumpserver > backup_$(date +%F).sql
aws s3 cp backup_$(date +%F).sql s3://my-bucket/backups/
5. 集群扩展与负载均衡
5.1 横向扩展方案
当Web终端出现卡顿时,通过Compose快速扩容Core服务:
docker-compose up -d --scale core=3 --no-recreate
配合Nginx做负载均衡,这个配置支持动态服务发现:
upstream jumpserver {
zone upstreams 64K;
server jumpserver_core_1:8080 resolve;
server jumpserver_core_2:8080 resolve;
server jumpserver_core_3:8080 resolve;
}
5.2 监控与日志收集
Prometheus+Granfa监控模板里最关键的两个指标:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
日志收集建议用Loki+Graylog。曾经通过分析日志发现某个IP的暴力破解尝试:
docker-compose logs -f --tail=100 core | grep "Failed login"
6. 升级与维护实战
6.1 无缝升级步骤
采用蓝绿部署方式升级,确保零停机:
# 启动新版本集群
docker-compose -f docker-compose-v2.10.yml up -d
# 逐步迁移流量
for container in $(seq 1 3); do
docker stop jumpserver_core_${container}
sleep 60
done
6.2 常见故障排查
遇到服务启动失败时,按这个顺序检查:
- 查看容器日志:
docker-compose logs core - 检查网络连通性:
docker exec -it core ping redis - 验证数据库连接:
docker exec -it db mysql -uroot -p$PASSWORD
有次Redis连接超时问题困扰了我半天,最后发现是防火墙规则被误删。现在我的检查清单里新增了网络策略验证:
docker network inspect jumpserver_backend | grep -A 5 "IPv4"
7. 安全加固措施
7.1 网络隔离方案
使用自定义网络实现微隔离,这个配置阻止了去年某次内网渗透:
networks:
jumpserver_frontend:
driver: bridge
enable_ipv6: false
ipam:
config:
- subnet: 172.22.0.0/24
jumpserver_backend:
internal: true
7.2 证书与加密配置
一定要替换自签名证书!用Let's Encrypt实现自动续期:
nginx:
image: nginx:alpine
volumes:
- /etc/letsencrypt:/etc/letsencrypt
ports:
- "443:443"
environment:
SSL_CERT: "/etc/letsencrypt/live/example.com/fullchain.pem"
SSL_KEY: "/etc/letsencrypt/live/example.com/privkey.pem"
8. 性能调优经验
8.1 数据库参数优化
MySQL配置里这两个参数对性能影响最大:
[mysqld]
innodb_buffer_pool_size = 2G
innodb_flush_log_at_trx_commit = 2
Redis内存限制要设为物理内存的3/4,并启用持久化:
redis:
command: >
--maxmemory 6gb
--maxmemory-policy allkeys-lru
--appendonly yes
8.2 会话连接管理
WebSocket连接数限制能防止资源耗尽:
# config.yml
websocket:
max_connections: 500
connection_age: 3600
去年某次运维事故后,我增加了自动清理机制:
docker exec jumpserver_redis_1 redis-cli --eval cleanup_old_sessions.lua
更多推荐



所有评论(0)