LAMP架构

最近全服务从之前KVM架构迁移Docker。回想自己小破站,2017年,腾讯云购买了学生款LVS,1核1G1M的最小小主机,好在提供公网ip。跑老远去的域名备案定点照相馆完成了域名备案,当时还挺激动终于可以通过域名访问自己的服务了。腾讯云购买的域名,当时也才一年10元,现在都40了⌇●﹏●⌇。当然平台也会提供基础免费的DNS域名解析服务(好多人用CF,个人感觉腾讯云提供的目前也够用,就不再折腾CF了)。万事具备可以启动服务了,迫不及待安装LAMP套件,第一个服务程序应该是HEXO吧,有些忘记了。匆匆3年过去,2020年,云服务到期了,平台的数据需要进行备份和迁移了。这是一个麻烦事,服务的数据库文件,配置文件,可执行文件,CRON配置记录等等都需要迁移,而且即使迁移再恢复也不是那么容易,原因有很多,比如PHP版本更新了,执行程序升级了,配置文件可能会有兼容的问题。

KVM架构

有了上面的前车之鉴,就开始寻找方便的可迁移方案。linux下大名鼎鼎虚拟化程序QEMU,类似Virtualbox或者VMWare其实就是操作系统级别的虚拟化技术。KVM通过QEMU软件模拟各种硬件实现完全独立隔离的系统环境。其实云平台的LVS就是这种方案,只是有更完整的计费,配置,迁移系统支持而已比如OpenStack。有了虚拟机这迁移岂不是手到擒来,把虚拟机的qcow2镜像文件备份下来,找一个宿主机配置KVM,直接启动所有的服务都恢复了。这套架构大约也用了差不多3年吧,但是同样也有缺点,就是备份的文件太大了,每次都是全量备份,每个虚拟机文件大约40G(还不知道如何增量备份),而且占用宿主机磁盘空间也比较大。这几年下来磁盘差不多都要90%了(可能和我后面安装zabbix有关,导致占用的空间越来越多了)。最终感觉操作系统级别的虚拟化对备份维护和迁移也是有不小的压力和弊端。

Docker架构

2024.10,既然操作系统级别的虚拟化太笨重,可以考虑将内核抽掉只保留所需要的基本文件系统的内核级别虚拟化技术,毫无疑问那就是Docker了。其实接触Docker也有几年了,对于上面的KVM架构我也是跑了一个Docker专用的虚拟机,zabbix就是用Docker启动的。最开始使用Docker是直接docker run启动容器,配置好自启动规则以后每次主机启动服务也就自己启动了。之所以没有全面使用Docker,使用docker run启动和管理容器是一个很重要的原因。1是因为docker run命令很长,启动的时候需要先在文档中写好命令再复制到主机进行启动,2是需要对命令进行保存和记录,不然下次启动时都不知道当时用的什么启动参数。当然还有一个原因就是docker run没办法启动多个具有启动次序,组合容器方案。因为现有的服务大多都依赖外部数据库,或者redis缓存,所以也没有动力将所有服务全部迁移到Docker

Docker Compose

了解docker run的不足(万事都有两面性,虽然不能进行复杂的编排任务,但是对于参数不多的服务运行还是很方便的),需要一种可以方便完成docker容器的组合启动的方式,轻量级的基本就是docker compose了。docker compose是有两个版本,最早的版本是使用python写的docker-compose这是一个独立于docker的命令,需要独立安装和配置使用,2021年应该是停止维护了。第二个版本是用go进行了重写,作为docker的子命令,使用方式是docker compose中间没有横杠,其他使用方式和原来是一样的。

Docker Rhel系系统下dnf方式安装

Centos已经被招安了,所以需要使用Rhelabi兼容版本系统,我个人使用的是AlmaLinux,还可以选择RockLinux(Centos的创始人),每个版本都有各自的特点根据自己喜好进行安装即可。

自动安装脚本如下,自行食用。亲测是在Rhel8Rhel9对于其他Rhel6或者Rhel7自行修改。

#!/bin/bash
#
# by zhangshuo 2023/07/07

set -e

sh_ver="0.0.1"

# Rhel系发行版类型
Distribution=$(cat /etc/redhat-release | awk '{print $1}')
Release=$(rpm -q --qf %{Version} ${Distribution,,}-release)
ReleaseMajor=${Release%%.*}
ReleaseMinor=${Release##*.}

Green_font_prefix="\033[32m"
Red_font_prefix="\033[31m"
Green_background_prefix="\033[42;37m"
Red_background_prefix="\033[41;37m"
Font_color_suffix="\033[0m"
Info="[${Green_font_prefix}信息${Font_color_suffix}]"
Error="[${Red_font_prefix}错误${Font_color_suffix}]"
Tip="[${Green_font_prefix}注意${Font_color_suffix}]"

AuthUser=${1:-def}
AuthUserPasswd=${2:-def}

# 安装基础软件
RhelInstallBase(){
    echo -e "${Info} 开始安装基础软件 !"
    dnf -y update
    dnf -y install https://packages.endpointdev.com/rhel/$ReleaseMajor/main/x86_64/endpoint-repo.noarch.rpm
    dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$ReleaseMajor.noarch.rpm
    dnf -y install https://rpms.remirepo.net/enterprise/remi-release-$ReleaseMajor.rpm
    dnf -y install git lftp
    if ! command_exists git &> /dev/null;then
        echo -e "${Error} git 安装失败,请检查!" && return 1
    fi
    dnf -y install samba
    echo -e "${Info} 安装基础软件完成 !"
}

# 安装docker
RhelInstallDocker(){
    echo -e "${Info} 开始安装Docker !"
    dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    if [ $ReleaseMajor -eq 8 ];then
        dnf -y install https://download.docker.com/linux/fedora/38/x86_64/stable/Packages/containerd.io-1.6.21-3.1.fc38.x86_64.rpm
        dnf -y remove containerd.io-1.6.21-3.1.fc38.x86_64
        dnf -y install https://download.docker.com/linux/centos/$ReleaseMajor/x86_64/stable/Packages/containerd.io-1.6.21-3.1.el$ReleaseMajor.x86_64.rpm
    fi
    dnf -y install docker-ce docker-ce-cli docker-buildx-plugin docker-compose-plugin
    
    # 替换国内源
    if [ ! -f /etc/docker/daemon.json ];then
        wget --user=$AuthUser --password=$AuthUserPasswd https://h5ai.zhangshuocauc.cn/Linux/Rhel8/daemon.json -P /etc/docker
    fi
    
    systemctl start docker
    systemctl enable docker
    
    echo -e "${Info} 安装Docker完成 !"
}

# 升级脚本
RhelInstallUpgrade(){
    echo -e "${Info} 开始升级脚本 !"
    
    sh_new_ver=$(wget --user=$AuthUser --password=$AuthUserPasswd -qO- -t1 -T3 "https://h5ai.zhangshuocauc.cn/Linux/Rhel8/Rhel8lamp.sh" | grep 'sh_ver="' | awk -F "=" '{print $NF}' | sed 's/\"//g' | head -1)

    [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到服务器 !" && exit 0
    
    wget --user=$AuthUser --password=$AuthUserPasswd -N https://h5ai.zhangshuocauc.cn/Linux/Rhel8/Rhel8lamp.sh && chmod +x Rhel8lamp.sh
    
    echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0
}

# 配置基础环境
RhelConfigBase(){
    echo -e "${Info} 开始配置基础设置 !"
    # 关闭root远程登录
    sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
    # 关闭selinux
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/selinux/config
    
    systemctl set-default multi-user.target
    
    if [ $(hostname) == "localhost.localdomain" ];then
        hostnamectl set-hostname Alma$ReleaseMajor
    fi
    
    if [ $(wc -l /etc/motd | awk '{print $1}') -eq 0 ];then
        echo "Welcom to RedHat(Almalinux$Release) Service!" >> /etc/motd
    fi

    echo -e "${Info} 完成基础配置 !"
}

echo && echo -e " LAMP环境 一键安装管理脚本 ($Distribution $Release) ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} by \033[1;35mRedHat\033[0m
 
 ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本
 ———————————————————————
 ${Green_font_prefix} 1.${Font_color_suffix} 安装 Base
 ${Green_font_prefix} 2.${Font_color_suffix} 安装 Docker
 ———————————————————————
 ${Green_font_prefix} 3.${Font_color_suffix} 配置 Base
 ———————————————————————"
 
echo
read -e -p " 请输入数字 [0-3]:" num
case "$num" in
0)
    RhelInstallUpgrade
    ;;
1)
    RhelInstallBase
    ;;
2)
    RhelInstallDocker
    ;;
3)
    RhelConfigBase
    ;;
*)
    echo
    echo -e " ${Error} 请输入正确的数字"
    ;;
esac

--EOF

最后修改:2025 年 01 月 09 日
如果觉得我的文章对你有用,请随意赞赏