项目架构:Docker+MySQL+PHP+Apache

服务器配置:2C4G 硬盘60G或者以上配置,根据Agent端规模调整

1、部署docker环境

部署的版本可以选择20+,在这里,我安装docker的版本是25.0.5,在 Docker 25.x 版本中,Docker Compose V2 是作为 Docker CLI 的一个插件(docker-compose-plugin)提供的,安装 Docker 时可以选择安装该插件,可直接使用 docker compose 命令,也可以安装docker-compos进行使用

# 1. 卸载旧版本 Docker
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2. 更新系统包
sudo apt-get update
sudo apt-get upgrade -y

# 3. 安装必要工具
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 4. 添加阿里云 Docker GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 5. 设置阿里云 Docker 仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 6. 更新包索引
sudo apt-get update

# 7. 安装 Docker 25.0.5
sudo apt-get install -y docker-ce=5:25.0.5-1~ubuntu.22.04~jammy \
                         docker-ce-cli=5:25.0.5-1~ubuntu.22.04~jammy \
                         containerd.io \
                         docker-buildx-plugin \
                         docker-compose-plugin
# 8.安装docker-compose(可选)
sudo wget -O /usr/bin/docker-compose   https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64
sudo chmod +x /usr/bin/docker-compose
sudo docker-compose -v

安装完成后,可以检查一下版本

sudo docker -v
sudo docker compose version

在这里插入图片描述
启动docker并设置为开机自启

sudo systemctl start docker 
sudo systemctl enable docker

查看docker的状态是否启动成功,状态为active则代表启动成功

sudo systemctl status docker

在这里插入图片描述

添加国内docker镜像源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.anyhub.us.kg",
        "https://dockerhub.jobcher.com",
        "https://dockerhub.icu",
        "https://docker.1ms.run",
        "https://docker-0.unsee.tech"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

查看镜像源添加的情况,如果添加成功,就会显示配置文件里面写的源地址。

sudo docker info

在这里插入图片描述

2、构建Docker镜像

GLPI 11系列在官网已经有了Docker镜像,可以从官方拉取然后部署,我的GLPI是从10系列升级到11系列,为了方便升级,我便自己构建了Docker镜像,方便后期丝滑升级。
官方镜像地址:https://hub.docker.com/r/glpi/glpi/tags

创建构建镜像的目录

sudo mkdir -p /opt/build-glpi && cd /opt/build-glpi

2.1、创建glpi.conf

配置Apache虚拟主机,使得Apache能够正确服务于GLPI应用程序,Apache将从这个/var/www/html/public目录开始寻找文件来响应请求。

sudo cat <<EOF> glpi.conf
<VirtualHost *:80>
    # 核心修改:将根目录指向 /public 子目录
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        # 确保所有请求都路由到 index.php (符合GLPI要求)
        DirectoryIndex index.php
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)\$ index.php [QSA,L]
        </IfModule>
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/error.log
    CustomLog \${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF

2.2、创建docker-entrypoint.sh

在Docker容器启动时运行,用于执行一些初始化操作,然后启动主进程。

sudo cat <<EOF> docker-entrypoint.sh
#!/bin/bash

# 等待数据库就绪的函数
wait_for_database() {
    local host="\$1"
    local port="\${2:-3306}"
    local timeout=30
    local counter=0
    
    echo "等待数据库连接: \$host:\$port"
    
    while [ \$counter -lt \$timeout ]; do
        # 使用 bash 内置的 TCP 检查
        if timeout 1 bash -c "echo > /dev/tcp/\$host/\$port" 2>/dev/null; then
            echo "数据库已就绪"
            return 0
        fi
        
        echo "等待数据库... (\$((counter + 1))/\$timeout)"
        sleep 2
        counter=\$((counter + 1))
    done
    
    echo "错误: 数据库连接超时"
    return 1
}

# 主程序
if [ -n "\$DB_HOST" ]; then
    wait_for_database "\$DB_HOST" "\${DB_PORT:-3306}"
fi

# 设置文件权限
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html

# 检查是否首次运行
if [ ! -f /var/www/html/config/config_db.php ]; then
    echo "检测到首次运行,确保插件目录存在..."
    mkdir -p /var/www/html/plugins
    chown www-data:www-data /var/www/html/plugins
    
    # 如果是首次运行,等待数据库完全初始化
    sleep 5
fi

# 执行原始命令
exec "\$@"
EOF

2.3、编写Dockerfile

在构建镜像的过程中,如果拉取GithubGLPI的源码失败,可以通过科学的方式去Github上下载源码到本地,然后上传至服务器/opt/build-glpi目录并对Dockerfile进行部分修改即可。
源码地址:

https://github.com/glpi-project/glpi/releases/download/11.0.4/glpi-11.0.4.tgz

修改前:

ENV GLPI_VERSION=11.0.4
ENV GLPI_FILE=glpi-${GLPI_VERSION}.tgz
RUN wget -O "/tmp/${GLPI_FILE}" \
    "https://github.com/glpi-project/glpi/releases/download/${GLPI_VERSION}/${GLPI_FILE}" \
    && tar -xzf "/tmp/${GLPI_FILE}" -C /var/www/html --strip-components=1 \
    && rm -f "/tmp/${GLPI_FILE}"

修改后:

ENV GLPI_VERSION=11.0.4
ENV GLPI_FILE=glpi-${GLPI_VERSION}.tgz
COPY ./${GLPI_FILE}  /tmp/${GLPI_FILE} # 新增语句
RUN  tar -xzf "/tmp/${GLPI_FILE}" -C /var/www/html --strip-components=1 \
    && rm -f "/tmp/${GLPI_FILE}"

在这里插入图片描述

编写Dockerfile

sudo cat <<EOF> Dockerfile
FROM php:8.2-apache

# 设置时区
ENV TZ=Asia/Shanghai
ENV PHP_INI_DATE_TIMEZONE=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    libpng-dev libjpeg-dev libfreetype6-dev \
    libxml2-dev libldap2-dev libicu-dev \
    libzip-dev libcurl4-openssl-dev libonig-dev \
    libxslt1-dev unzip wget curl cron nano \
    && rm -rf /var/lib/apt/lists/*

# 配置 PHP 扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/

# 安装 PHP 扩展
RUN docker-php-ext-install \
    pdo_mysql mysqli gd intl ldap zip xml xsl mbstring \
    curl soap sockets opcache bcmath bz2

# 安装和配置 APCu
RUN pecl install apcu && docker-php-ext-enable apcu

# 设置 PHP 时区
RUN echo "date.timezone = Asia/Shanghai" > /usr/local/etc/php/conf.d/timezone.ini

# 启用 Apache 模块
RUN a2enmod rewrite
RUN a2enmod headers

# 下载 GLPI
ENV GLPI_VERSION=11.0.4
ENV GLPI_FILE=glpi-\${GLPI_VERSION}.tgz
RUN wget -O "/tmp/\${GLPI_FILE}" \
    "https://github.com/glpi-project/glpi/releases/download/\${GLPI_VERSION}/\${GLPI_FILE}" \
    && tar -xzf "/tmp/\${GLPI_FILE}" -C /var/www/html --strip-components=1 \
    && rm -f "/tmp/\${GLPI_FILE}"
COPY glpi.conf /etc/apache2/sites-available/000-default.conf

# 创建必要的目录
RUN mkdir -p /var/www/html/files/_cache /var/www/html/files/_cron \
    /var/www/html/files/_dumps /var/www/html/files/_graphs \
    /var/www/html/files/_lock /var/www/html/files/_pictures \
    /var/www/html/files/_plugins /var/www/html/files/_rss \
    /var/www/html/files/_tmp /var/www/html/files/_uploads \
    /var/www/html/files/_sessions

# 设置权限
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost/ || exit 1

# 启动脚本 - 处理首次安装配置
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

EXPOSE 80

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]
EOF

2.4、构建镜像

sudo docker build -t my-glpi:11.0.4 .

构建的过程大概需要十几分钟…
在这里插入图片描述
如果构建失败,并且提示glpi源码拉取失败,可以看前面给出的解决方案。
在这里插入图片描述
镜像构建完成后,查看镜像的情况

sudo docker images

在这里插入图片描述

3、编排容器

创建docker-compose.yaml,将 Docker 容器内的数据持久化存储到宿主机的指定目录,避免容器重启或删除时数据丢失。

sudo cat <<EOF> docker-compose.yaml 
services:
  glpi-db:
    image: mysql:8.0
    container_name: glpi-db
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: glpi
      MYSQL_USER: glpi
      MYSQL_PASSWORD: glpi@123
      MYSQL_ROOT_HOST: '%'
      TZ: Asia/Shanghai
      MYSQL_DEFAULT_AUTHENTICATION_PLUGIN: mysql_native_password
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --innodb-buffer-pool-size=512M
      - --sql-mode=NO_ENGINE_SUBSTITUTION
      - --default-authentication-plugin=mysql_native_password
    volumes:
      - glpi_db_data:/var/lib/mysql
    networks:
      - glpi-network
    restart: unless-stopped

  my-glpi:
    image: my-glpi:11.0.4
    container_name: my-glpi
    environment:
      - TIMEZONE=Asia/Shanghai
      - DB_HOST=glpi-db
      - DB_NAME=glpi
      - DB_USER=glpi
      - DB_PASSWORD=glpi@123
    volumes:
      - glpi_files_data:/var/www/html/files
      - glpi_plugins_data:/var/www/html/plugins
      - glpi_config_data:/var/www/html/config
    ports:
      - "80:80"
    networks:
      - glpi-network
    depends_on:
      - glpi-db
    restart: unless-stopped

volumes:
  glpi_db_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /usr/local/glpi/mysql8/data
  glpi_files_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /usr/local/glpi/glpi_files_data
  glpi_plugins_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /usr/local/glpi/glpi_plugins_data
  glpi_config_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /usr/local/glpi/glpi_config_data
networks:
  glpi-network:
    name: glpi-network
    driver: bridge
EOF

4、创建数据持久化目录

数据持久化目录必须为空目录

sudo mkdir -p /usr/local/glpi/mysql8/data /usr/local/glpi/glpi_files_data \
			/usr/local/glpi/glpi_plugins_data /usr/local/glpi/glpi_config_data

5、启动GLPI项目

sudo docker compose -f docker-compose.yaml up -d

首次启动的信息
在这里插入图片描述
查看容器运行的情况

sudo docker ps

在这里插入图片描述

6、访问Web端

访问地址:http://服务器IP
加粗样式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于MySQL容器GLPI容器在同一个网段,并且做了主机名解析,SQL数据库地址一栏输入MySQL容器的主机名即可
SQL数据库地址:glpi-db
SQL账户:glpi
SQL密码:glpi@123
在这里插入图片描述
在这里插入图片描述
等待初始化完成即可
在这里插入图片描述
初始化完成后继续下一步
在这里插入图片描述
GLPI默认的管理员账号和密码都是glpi
在这里插入图片描述
走到这一步,服务端已经部署完成,可以给自己几个掌声鼓励一下!
在这里插入图片描述
这一步很关键,启用资产盘点,GLPI-Agent的数据能否正常传输,必须开启这个功能,【系统管理】-【资产盘点】-勾选【启用盘点】-【保存】,启用此功能后,就可以在客户端发送资产数据给Server端。
在这里插入图片描述

具体的使用教程可以参考【tornado】大佬的文章:GLPI部署、运维和管理使用手册

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐