本文最后更新于231 天前,其中的信息可能已经过时,如有错误请发送邮件到1979007616@qq.com
首先附上本人制作的镜像以及相关配置文件。使用GLPI资产管理系统做测试。
Github地址:xiemuhou/docker-glpi: 自建docker hub仓库配置文件保存 (github.com)
Docker Hub地址:xiemuhou/glpi – Docker Image | Docker Hub
制作个人Docker Hub镜像的前提是熟悉项目部署、项目文件目录结构、以及下文的Docker相关配置文件。
所有docker pull
下载到本地的镜像都是别人制作好上传到Docker Hub仓库中的。
制作方法
1.编写Dockerfile
和start.sh
配置文件,使用命令:docker build -f Dockerfile -t xiemuhou/glpi:latest .
创建镜像。
2.上传镜像至Docker Hub:docker push xiemuhou/glpi:latest
。
3.编写docker-compose.yml
文件,使用命令:docker-compose up -d
创建容器。
任意项目版本
效果:Docker Hub镜像中不固定GLPI版本,通过docker-compose.yml文件配置信息选择GLPI版本号。
优点:版本号可自由选择。
缺点:Docker Hub镜像只打包了运行环境,项目文件在docker容器部署时才下载,如果没有外网,下载会非常慢。
start.sh文件
start.sh
#!/bin/bash
#Controle du choix de version ou prise de la latest
[[ ! "$VERSION_GLPI" ]] \
&& VERSION_GLPI=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep tag_name | cut -d '"' -f 4)
if [[ -z "${TIMEZONE}" ]]; then echo "TIMEZONE is unset";
else
echo "date.timezone = \"$TIMEZONE\"" > /etc/php/8.1/apache2/conf.d/timezone.ini;
echo "date.timezone = \"$TIMEZONE\"" > /etc/php/8.1/cli/conf.d/timezone.ini;
fi
#Enable session.cookie_httponly
sed -i 's,session.cookie_httponly = *\(on\|off\|true\|false\|0\|1\)\?,session.cookie_httponly = on,gi' /etc/php/8.1/apache2/php.ini
FOLDER_GLPI=glpi/
FOLDER_WEB=/var/www/html/
#check if TLS_REQCERT is present
if !(grep -q "TLS_REQCERT" /etc/ldap/ldap.conf)
then
echo "TLS_REQCERT isn't present"
echo -e "TLS_REQCERT\tnever" >> /etc/ldap/ldap.conf
fi
#Téléchargement et extraction des sources de GLPI
if [ "$(ls ${FOLDER_WEB}${FOLDER_GLPI}/bin)" ];
then
echo "GLPI is already installed"
else
SRC_GLPI=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/tags/${VERSION_GLPI} | jq .assets[0].browser_download_url | tr -d \")
TAR_GLPI=$(basename ${SRC_GLPI})
wget -P ${FOLDER_WEB} ${SRC_GLPI}
tar -xzf ${FOLDER_WEB}${TAR_GLPI} -C ${FOLDER_WEB}
rm -Rf ${FOLDER_WEB}${TAR_GLPI}
chown -R www-data:www-data ${FOLDER_WEB}${FOLDER_GLPI}
fi
#Adapt the Apache server according to the version of GLPI installed
## Extract local version installed
LOCAL_GLPI_VERSION=$(ls ${FOLDER_WEB}/${FOLDER_GLPI}/version)
## Extract major version number
LOCAL_GLPI_MAJOR_VERSION=$(echo $LOCAL_GLPI_VERSION | cut -d. -f1)
## Remove dots from version string
LOCAL_GLPI_VERSION_NUM=${LOCAL_GLPI_VERSION//./}
## Target value is GLPI 1.0.7
TARGET_GLPI_VERSION="10.0.7"
TARGET_GLPI_VERSION_NUM=${TARGET_GLPI_VERSION//./}
TARGET_GLPI_MAJOR_VERSION=$(echo $TARGET_GLPI_VERSION | cut -d. -f1)
# Compare the numeric value of the version number to the target number
if [[ $LOCAL_GLPI_VERSION_NUM -lt $TARGET_GLPI_VERSION_NUM || $LOCAL_GLPI_MAJOR_VERSION -lt $TARGET_GLPI_MAJOR_VERSION ]]; then
echo -e "<VirtualHost *:80>\n\tDocumentRoot /var/www/html/glpi\n\n\t<Directory /var/www/html/glpi>\n\t\tAllowOverride All\n\t\tOrder Allow,Deny\n\t\tAllow from all\n\t</Directory>\n\n\tErrorLog /var/log/apache2/error-glpi.log\n\tLogLevel warn\n\tCustomLog /var/log/apache2/access-glpi.log combined\n</VirtualHost>" > /etc/apache2/sites-available/000-default.conf
else
set +H
echo -e "<VirtualHost *:80>\n\tDocumentRoot /var/www/html/glpi/public\n\n\t<Directory /var/www/html/glpi/public>\n\t\tRequire all granted\n\t\tRewriteEngine On\n\t\tRewriteCond %{REQUEST_FILENAME} !-f\n\t\n\t\tRewriteRule ^(.*)$ index.php [QSA,L]\n\t</Directory>\n\n\tErrorLog /var/log/apache2/error-glpi.log\n\tLogLevel warn\n\tCustomLog /var/log/apache2/access-glpi.log combined\n</VirtualHost>" > /etc/apache2/sites-available/000-default.conf
fi
#Add scheduled task by cron and enable
echo "*/2 * * * * www-data /usr/bin/php /var/www/html/glpi/front/cron.php &>/dev/null" > /etc/cron.d/glpi
#Start cron service
service cron start
#Activation du module rewrite d'apache
a2enmod rewrite && service apache2 restart && service apache2 stop
#Fix to really stop apache
pkill -9 apache
#Lancement du service apache au premier plan
/usr/sbin/apache2ctl -D FOREGROUND
由于是没有指定GLPI版本的镜像,所以项目文件是不能放在镜像创建文件中的。start.sh文件是容器启动后才会执行,所以GLPI项目文件的下载任务放在该文件中。
配置解析:
- 4-5行:定义GLPI版本参数,如果参数没有被赋值,将默认最新版本;
- 14行:修改
php.ini
文件中session.cookie_httponly = on
;
- 20-24行:将
TLS_REQCERT
配置项添加到 /etc/ldap/ldap.conf
文件中,并将其设置为 never
。
- 27-38行:通过检查glpi/bin文件是否存在判断GLPI安装状态,如果没有安装就获取下载地址,下载、解压、删除安装包、更改文件夹的所有者。
- 42-46行:获取本地GLPI项目版本号,对版本号进行相关处理。
- 49行:定义目标GLPI版本号为10.0.7;
- 50行:将目标 GLPI 版本号中的点号(”.”)全部替换为空字符串,得到字符串:“1007”;
- 51行:将目标 GLPI 版本号中的第一个数字(主版本号)提取出来。它使用了
cut
命令来以点号作为分隔符,然后取得第一个字段,得到主版本号:“10”。
- 54-59行:比较本地GLPI版本号和目标GLPI版本号,根据对比结果配置
/etc/apache2/sites-available/000-default.conf
文件,-lt
是比较操作符,表示“小于”。
Dockerfile文件
Dockerfile
#On choisit une debian
FROM debian:11.6
LABEL org.opencontainers.image.authors="github@xiemuhou"
#Ne pas poser de question à l'installation
ENV DEBIAN_FRONTEND noninteractive
#Installation d'apache et de php8.1 avec extension
RUN apt update \
&& apt install --yes ca-certificates apt-transport-https lsb-release wget curl \
&& curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg \
&& sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \
&& apt update \
&& apt install --yes --no-install-recommends \
apache2 \
vim \
php8.1 \
php8.1-mysql \
php8.1-ldap \
php8.1-xmlrpc \
php8.1-imap \
php8.1-curl \
php8.1-gd \
php8.1-mbstring \
php8.1-xml \
php-cas \
php8.1-intl \
php8.1-zip \
php8.1-bz2 \
php8.1-redis \
cron \
jq \
libldap-2.4-2 \
libldap-common \
libsasl2-2 \
libsasl2-modules \
libsasl2-modules-db \
&& rm -rf /var/lib/apt/lists/*
#Copie et execution du script pour l'installation et l'initialisation de GLPI
COPY start.sh /opt/
RUN chmod +x /opt/start.sh
ENTRYPOINT ["/opt/start.sh"]
#Exposition des ports
EXPOSE 80
Dockerfile文件在镜像创建的时候就会执行,一般用于部署项目所需的服务环境,包括常用的工具,如vim。
创建镜像
配置好上面两个文件就可以创建镜像:docker build -f Dockerfile -t xiemuhou/glpi:latest .
注:不加标签默认是latest
,所以docker run
的时候要带上镜像标签,注意后面有点号(”.”)。
报错:软件包“libldap-2.4-2”没有安装候选项,说明debian:12.5
不支持这个libldap版本,可以将debian版本改成11.6
,或者将libldap-2.4-2
改成libldap-2.5-0
。
创建成功可以看到如下结果:
同时,我们可以用docker history <image名称>
命令来进一步验证Dockerfile的构建过程。
推送镜像至Docker Hub
推送之前需要登录Docker Hub账号:docker login
,没有账号可以注册:Docker Hub Container Image Library | App Containerization
输入用户名和密码,我的账号是:xiemuhou
退出命令:docker out
官方文档要求,我们推送的镜像名字必须是Docker Hub ID/<image名称>
:版本号
,比如:xiemuhou/glpi:10.0.6
,所以我们需要给镜像换一个名字。
复制镜像并且修改名称:docker tag 镜像名:版本 新镜像名:版本
。
上传镜像到Docker Hub:docker push xiemuhou/glpi:latest
登陆Docker Hub就可以看到我们刚刚推送上去的镜像了,所有人都可以通过网络下载我的容器了。
docker pull xiemuhou/glpi:latest
docker-compose.yml文件
docker-compose.yml
version: "3.8"
services:
mysql:
image: mysql:latest
container_name: mysql
restart: always
hostname: mysql
volumes:
- ./storage/mysql:/var/lib/mysql
env_file:
- ./mysql.env
ports:
- "10.10.166.212:3310:3306"
glpi:
image: xiemuhou/glpi:latest
restart: always
container_name : glpi
hostname: glpi
ports:
- "10.10.166.212:9010:80"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./storage/var/www/html/glpi/:/var/www/html/glpi
environment:
- VERSION_GLPI=10.0.15
- TIMEZONE=Asia/Shanghai
部署相关命令
部署的时候只需要写好docker-compose.yml
文件,当然还有一个mysql.env
文件,并在该文件目录下使用命令:docker-compose up -d
即可。
停止并删除有关的容器:docker-compose down -v
。
简直是懒人必备,果然懒才是促进效率提升的第一要素。
指定项目版本
指定项目版本顾名思义就是在镜像文件中就已经确定了GLPI的项目版本,避免了因为没有外网而导致的下载缓慢问题。
和任意项目版本不同的是,在制作镜像时Dockerfile文件中下载GLPI项目文件,start.sh文件在容器启动后执行解压等操作。
start.sh文件
start.sh
#!/bin/bash
#Controle du choix de version ou prise de la latest
if [[ -z "${TIMEZONE}" ]]; then echo "TIMEZONE is unset";
else
echo "date.timezone = \"$TIMEZONE\"" > /etc/php/8.1/apache2/conf.d/timezone.ini;
echo "date.timezone = \"$TIMEZONE\"" > /etc/php/8.1/cli/conf.d/timezone.ini;
fi
#Enable session.cookie_httponly
sed -i 's,session.cookie_httponly = *\(on\|off\|true\|false\|0\|1\)\?,session.cookie_httponly = on,gi' /etc/php/8.1/apache2/php.ini
FOLDER_GLPI=glpi/
FOLDER_WEB=/var/www/html/
#check if TLS_REQCERT is present
if !(grep -q "TLS_REQCERT" /etc/ldap/ldap.conf)
then
echo "TLS_REQCERT isn't present"
echo -e "TLS_REQCERT\tnever" >> /etc/ldap/ldap.conf
fi
#Téléchargement et extraction des sources de GLPI
if [ "$(ls ${FOLDER_WEB}${FOLDER_GLPI}/bin)" ];
then
echo "GLPI is already installed"
else
TAR_GLPI=$(ls /var/www/html/*.tgz)
tar -xzf ${TAR_GLPI} -C ${FOLDER_WEB}
rm -rf ${TAR_GLPI}
chown -R www-data:www-data ${FOLDER_WEB}${FOLDER_GLPI}
fi
#Adapt the Apache server according to the version of GLPI installed
## Extract local version installed
LOCAL_GLPI_VERSION=$(ls ${FOLDER_WEB}/${FOLDER_GLPI}/version)
## Extract major version number
LOCAL_GLPI_MAJOR_VERSION=$(echo $LOCAL_GLPI_VERSION | cut -d. -f1)
## Remove dots from version string
LOCAL_GLPI_VERSION_NUM=${LOCAL_GLPI_VERSION//./}
## Target value is GLPI 10.0.7
TARGET_GLPI_VERSION="10.0.7"
TARGET_GLPI_VERSION_NUM=${TARGET_GLPI_VERSION//./}
TARGET_GLPI_MAJOR_VERSION=$(echo $TARGET_GLPI_VERSION | cut -d. -f1)
# Compare the numeric value of the version number to the target number
if [[ $LOCAL_GLPI_VERSION_NUM -lt $TARGET_GLPI_VERSION_NUM || $LOCAL_GLPI_MAJOR_VERSION -lt $TARGET_GLPI_MAJOR_VERSION ]]; then
echo -e "<VirtualHost *:80>\n\tDocumentRoot /var/www/html/glpi\n\n\t<Directory /var/www/html/glpi>\n\t\tAllowOverride All\n\t\tOrder Allow,Deny\n\t\tAllow from all\n\t</Directory>\n\n\tErrorLog /var/log/apache2/error-glpi.log\n\tLogLevel warn\n\tCustomLog /var/log/apache2/access-glpi.log combined\n</VirtualHost>" > /etc/apache2/sites-available/000-default.conf
else
set +H
echo -e "<VirtualHost *:80>\n\tDocumentRoot /var/www/html/glpi/public\n\n\t<Directory /var/www/html/glpi/public>\n\t\tRequire all granted\n\t\tRewriteEngine On\n\t\tRewriteCond %{REQUEST_FILENAME} !-f\n\t\n\t\tRewriteRule ^(.*)$ index.php [QSA,L]\n\t</Directory>\n\n\tErrorLog /var/log/apache2/error-glpi.log\n\tLogLevel warn\n\tCustomLog /var/log/apache2/access-glpi.log combined\n</VirtualHost>" > /etc/apache2/sites-available/000-default.conf
fi
#Add scheduled task by cron and enable
echo "*/2 * * * * www-data /usr/bin/php /var/www/html/glpi/front/cron.php &>/dev/null" > /etc/cron.d/glpi
#Start cron service
service cron start
#Activation du module rewrite d'apache
a2enmod rewrite && service apache2 restart && service apache2 stop
#Fix to really stop apache
pkill -9 apache
#Lancement du service apache au premier plan
/usr/sbin/apache2ctl -D FOREGROUND
配置解析:
- 29行:匹配符合条件的文件名,将整个文件路径
/var/www/html/glpi-10.0.6.tgz
赋值给TAR_GLPI
。
Dockerfile文件
Dockerfile
#On choisit une debian
FROM debian:11.6
LABEL org.opencontainers.image.authors="github@xiemuhou"
#Ne pas poser de question à l'installation
ENV DEBIAN_FRONTEND noninteractive
#Installation d'apache et de php8.1 avec extension
RUN apt update \
&& apt install --yes ca-certificates apt-transport-https lsb-release wget curl \
&& curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg \
&& sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \
&& apt update \
&& apt install --yes --no-install-recommends \
apache2 \
vim \
php8.1 \
php8.1-mysql \
php8.1-ldap \
php8.1-xmlrpc \
php8.1-imap \
php8.1-curl \
php8.1-gd \
php8.1-mbstring \
php8.1-xml \
php-cas \
php8.1-intl \
php8.1-zip \
php8.1-bz2 \
php8.1-redis \
cron \
jq \
libldap-2.4-2 \
libldap-common \
libsasl2-2 \
libsasl2-modules \
libsasl2-modules-db \
&& rm -rf /var/lib/apt/lists/*
ENV VERSION_GLPI="10.0.6"
WORKDIR /var/www/html/
RUN wget "https://github.com/glpi-project/glpi/releases/download/${VERSION_GLPI}/glpi-${VERSION_GLPI}.tgz"
#Copie et execution du script pour l'installation et l'initialisation de GLPI
COPY start.sh /opt/
RUN chmod +x /opt/start.sh
ENTRYPOINT ["/opt/start.sh"]
#Exposition des ports
EXPOSE 80
配置解析:
- 43行:配置工作目录,和
cd
命令差不多。
- 45行:下载GLPI项目文件压缩包。
创建镜像
docker build -f Dockerfile -t xiemuhou/glpi:10.0.6 .
推送镜像至Docker Hub
docker pull xiemuhou/glpi:10.0.6
docker-compose.yml文件
docker-compose.yml
version: "3.8"
services:
mysql:
image: mysql:latest
container_name: mysql
restart: always
hostname: mysql
volumes:
- ./storage/mysql:/var/lib/mysql
env_file:
- ./mysql.env
ports:
- "10.10.166.212:3310:3306"
glpi:
image: xiemuhou/glpi:10.0.6
restart: always
container_name : glpi
hostname: glpi
ports:
- "10.10.166.212:9010:80"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./storage/var/www/html/glpi/:/var/www/html/glpi
environment:
- TIMEZONE=Asia/Shanghai
部署
部署和上面是一样的,没有太多要说的。
相关链接
DiouxX/docker-glpi: Project to deploy GLPI with docker (github.com)
diouxx/glpi – Docker Image | Docker Hub
elestio-examples/glpi: Deploy GLPI with CI/CD on Elestio (github.com)
elestio/glpi – Docker Image | Docker Hub
小提示:您可以通过
RSS订阅本站文章更新,订阅地址:https://blog.xmhweb.cn/feed
评论