1. 项目概述:容器化GLPI的价值与场景
GLPI作为一款开源的IT资产管理和服务台系统,在企业IT运维中扮演着重要角色。传统部署方式需要手动配置LAMP环境,而采用Docker容器化部署可以显著降低环境依赖问题。我在最近一次客户现场部署中,仅用40分钟就完成了GLPI 11的全套部署,相比传统方式节省了60%以上的时间。
这种部署方式特别适合以下场景:
- 需要快速搭建测试环境进行功能验证
- 企业IT部门希望实现标准化部署
- 需要频繁升级或迁移GLPI实例
- 开发人员需要在本地搭建与生产环境一致的GLPI
2. 环境准备与依赖检查
2.1 Ubuntu 22.04基础配置
在开始前,请确保你的Ubuntu 22.04系统满足以下条件:
- 至少4GB内存(GLPI运行需要2GB,Docker需要额外资源)
- 50GB可用磁盘空间
- 已启用sudo权限的用户账户
首先更新系统包:
sudo apt update && sudo apt upgrade -y安装必要工具包:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common2.2 Docker环境安装与配置
添加Docker官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg设置稳定版仓库:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装Docker引擎:
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io验证安装:
sudo docker run hello-world注意:如果遇到"permission denied"错误,需要将当前用户加入docker组:
sudo usermod -aG docker $USER newgrp docker
3. GLPI容器化部署实战
3.1 准备Docker Compose文件
创建项目目录:
mkdir -p ~/glpi-docker/{db,glpi_files} && cd ~/glpi-docker创建docker-compose.yml文件:
version: '3.8' services: db: image: mariadb:10.6 container_name: glpi_db environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: glpidb MYSQL_USER: glpi_user MYSQL_PASSWORD: glpi_password volumes: - ./db:/var/lib/mysql restart: unless-stopped networks: - glpi_network glpi: image: diouxx/glpi:11.0 container_name: glpi_app ports: - "8080:80" volumes: - ./glpi_files:/var/www/html/glpi/files environment: - MYSQL_HOST=db - MYSQL_DATABASE=glpidb - MYSQL_USER=glpi_user - MYSQL_PASSWORD=glpi_password depends_on: - db restart: unless-stopped networks: - glpi_network networks: glpi_network: driver: bridge3.2 启动GLPI容器
启动服务:
docker-compose up -d检查容器状态:
docker ps应该看到两个容器(glpi_app和glpi_db)都处于运行状态。
3.3 初始化GLPI配置
打开浏览器访问:
http://your_server_ip:8080按照向导完成安装:
- 选择语言(建议选择英文完成安装后再切换)
- 数据库配置页面填写:
- 数据库服务器:db
- 用户名:glpi_user
- 密码:glpi_password
- 数据库名:glpidb
- 完成管理员账户设置
重要提示:首次登录后立即修改默认管理员密码(默认admin/admin)
4. 高级配置与优化
4.1 数据持久化验证
检查数据持久化是否正常工作:
ls -lh ~/glpi-docker/db ls -lh ~/glpi-docker/glpi_files应该能看到数据库文件和GLPI上传文件已正确存储在宿主机上。
4.2 性能调优
修改docker-compose.yml中的GLPI服务部分,添加资源限制:
glpi: # ...原有配置... deploy: resources: limits: cpus: '2' memory: 2G reservations: memory: 1G4.3 启用HTTPS访问
使用Nginx反向代理配置HTTPS:
sudo apt install -y nginx certbot python3-certbot-nginx创建Nginx配置文件/etc/nginx/sites-available/glpi:
server { listen 80; server_name your_domain.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }启用配置并获取证书:
sudo ln -s /etc/nginx/sites-available/glpi /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx sudo certbot --nginx -d your_domain.com5. 日常维护与问题排查
5.1 备份策略
创建备份脚本~/backup_glpi.sh:
#!/bin/bash BACKUP_DIR="/path/to/backup" DATE=$(date +%Y%m%d) docker exec glpi_db mysqldump -u glpi_user -pglpi_password glpidb > $BACKUP_DIR/glpi_db_$DATE.sql tar -czvf $BACKUP_DIR/glpi_files_$DATE.tar.gz ~/glpi-docker/glpi_files设置定时任务(每周日凌晨3点):
(crontab -l ; echo "0 3 * * 0 /bin/bash ~/backup_glpi.sh") | crontab -5.2 常见问题解决
问题1:502 Bad Gateway错误检查容器是否运行:
docker ps -a查看GLPI容器日志:
docker logs glpi_app问题2:数据库连接失败检查数据库容器状态:
docker exec -it glpi_db mysql -u glpi_user -pglpi_password问题3:文件上传失败检查文件目录权限:
sudo chown -R www-data:www-data ~/glpi-docker/glpi_files5.3 版本升级步骤
- 停止当前服务:
docker-compose down备份数据和文件(参考5.1节)
修改docker-compose.yml中的GLPI镜像版本号
重新启动服务:
docker-compose up -d- 访问web界面完成数据库升级向导
6. 安全加固建议
6.1 容器安全配置
修改docker-compose.yml增加安全限制:
glpi: # ...原有配置... security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp - /var/www/html/glpi/files/_tmp6.2 数据库安全
定期修改数据库密码:
docker exec -it glpi_db mysql -u root -p ALTER USER 'glpi_user'@'%' IDENTIFIED BY 'new_strong_password';更新docker-compose.yml中的密码配置并重启服务。
6.3 网络隔离
创建专用网络并限制访问:
networks: glpi_network: driver: bridge internal: true在宿主机防火墙中只开放必要端口:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable7. 性能监控与日志管理
7.1 容器资源监控
安装cAdvisor监控:
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8081:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest访问监控界面:
http://your_server_ip:80817.2 日志集中管理
配置docker-compose.yml添加日志限制:
glpi: # ...原有配置... logging: driver: "json-file" options: max-size: "10m" max-file: "3"查看最近日志:
docker logs --tail 100 glpi_app7.3 定期维护任务
设置每月自动清理旧容器和镜像:
(crontab -l ; echo "0 2 1 * * /usr/bin/docker system prune -af") | crontab -8. 扩展功能集成
8.1 与FusionInventory集成
修改docker-compose.yml添加FusionInventory插件:
glpi: # ...原有配置... volumes: - ./glpi_files:/var/www/html/glpi/files - ./plugins:/var/www/html/glpi/plugins下载并安装插件:
mkdir -p ~/glpi-docker/plugins wget https://github.com/fusioninventory/fusioninventory-for-glpi/releases/download/glpi11.0%2B1.1/fusioninventory-1.1.tar.gz tar -xzf fusioninventory-1.1.tar.gz -C ~/glpi-docker/plugins/ docker-compose restart glpi8.2 邮件通知配置
在GLPI管理界面配置SMTP:
- 进入Setup > Notifications > Mail Server
- 选择"Use SMTP"
- 填写SMTP服务器详情
- 测试并保存配置
8.3 多语言支持
安装中文语言包:
- 下载中文语言包到plugins目录
- 在GLPI界面进入Setup > Translations
- 导入并激活中文语言包
9. 生产环境部署建议
9.1 高可用架构
对于生产环境,建议采用以下架构:
- 数据库:MariaDB Galera集群
- GLPI:多容器实例+负载均衡
- 存储:NFS共享文件系统
示例docker-compose-prod.yml:
version: '3.8' services: db1: image: mariadb:10.6 environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: glpidb MYSQL_USER: glpi_user MYSQL_PASSWORD: glpi_password GALERA_CLUSTER_NAME: glpi_cluster GALERA_MARIABACKUP_USER: galera_user GALERA_MARIABACKUP_PASSWORD: galera_password GALERA_NODE_ADDRESS: db1 GALERA_WSREP_SST_AUTH: galera_user:galera_password volumes: - ./db1:/var/lib/mysql networks: - glpi_network deploy: replicas: 1 resources: limits: cpus: '2' memory: 4G glpi: image: diouxx/glpi:11.0 ports: - "8080:80" volumes: - /nfs/glpi_files:/var/www/html/glpi/files environment: - MYSQL_HOST=db1 - MYSQL_DATABASE=glpidb - MYSQL_USER=glpi_user - MYSQL_PASSWORD=glpi_password depends_on: - db1 networks: - glpi_network deploy: replicas: 3 resources: limits: cpus: '1' memory: 2G networks: glpi_network: driver: overlay9.2 监控告警配置
建议配置以下监控项:
- 容器健康状态
- 数据库连接数
- 磁盘空间使用率
- HTTP响应时间
使用Prometheus+Grafana实现可视化监控。
9.3 灾备方案设计
- 跨可用区部署数据库集群
- 定期测试备份恢复流程
- 准备手动故障转移脚本
- 文档化应急响应流程
10. 经验总结与最佳实践
在实际部署中,我总结了以下关键经验:
数据库性能调优:
- 调整InnoDB缓冲池大小为可用内存的70%
- 设置合适的字符集(utf8mb4)
- 定期优化表
文件存储优化:
- 对大容量部署使用独立文件存储服务
- 设置合理的文件上传大小限制
- 定期清理临时文件
会话管理:
- 将会话存储改为数据库方式
- 设置合理的会话超时时间
- 在多实例部署中使用共享会话存储
备份验证:
- 每月至少执行一次恢复测试
- 备份文件异地存储
- 验证备份完整性(checksum)
用户培训:
- 制作简明使用手册
- 录制关键操作视频
- 建立内部知识库
这套容器化部署方案已经在多个客户环境中稳定运行超过18个月,最高支持了200+并发用户的访问量。相比传统部署方式,容器化方案在维护成本、升级便捷性和环境一致性方面展现出明显优势。