网络服务器配置与管理教辅书 Help

9-6 Docker 容器编排 docker-compose搭建LNMP动态网站

介绍

LNMP

  • 静态网站:网页中只有html、js、css,浏览器加载后信息不会发生变化,所以是"静态"的。

  • 动态网站:随着互联网的发展,人们对网站有更多的需求,注册、登录、上传文件、实时的图表变化,是"动态"的,依赖数据库,网站内容为html加数据库查询出的内容。

LNMP: 指PHP开发技术栈。

  • L, Linux操作系统

  • N, Nginx网站服务

  • M, MySQL数据库

  • P, PHP编程语言

现状:
其它语言也有类似技术栈,Java+OracleDB+Tomcat+Apache,Python+PostgreSQL+Unicorn+Nginx。 只是有人对LNMP技术栈优化,可以一键安装,自带图形化界面管理程序和数据库图形化管理界面,自带项目初始化、数据库初始化等,相比单独安装体验更佳。
在2015年左右移动互联网兴起和小型企业开始计算机信息化后,有许多企业官网的需求,PHP专为Web开发而生,全家桶安装快、开发快而流行,被人调侃"PHP是最好的编程语言"。

而在后面几年,移动互联网盛行、AI开始流行、代表框架WordPress向js迁移,LNMP专为Web网站开发而生,这种捆绑模式起网站很快,但如果写个爬虫、写个大数据分析脚本、技术栈过于固定反而成为限制。 目前,PHP已不再流行,而Linux、MySQL、Nginx都仍然流行。但本课的LNMP部署依然具有代表性。

WordPress: 一个成熟的博客、内容管理、网站二次开发项目,含有众多插件,是PHP生态的代表性框架之一。 WordPress官方部署文档

容器编排

docker run 运行一个容器。但动态网站有前端、后端、数据库等多个子项目构成,docker-compose可以读取docker-compose.yaml配置文件,按照一定顺序和依赖关系同时运行一组子程序,从而实现复杂项目自动化部署。

(跳过 仅了解)传统方式:单独安装每个软件

(跳过。传统安装方式步骤复杂、耗时长、易出错。仅介绍。) 步骤见课本和网上教程。

  • 安装php、php-rpm(php的cgi通用网管实现软件,用来跟nginx等web服务器通讯)、php-mysql(php与mysql数据库见通信),涉及到先编译再安装。

  • mysql,涉及到初始化、为项目创建库

  • wordpress代码,涉及到修改配置文件使项目与mysql通讯

  • nginx,涉及到修改配置,将请求反代给php-rpm处理

优点:最原始最本质的安装方式,易于排查错误,灵活性最高。
缺点:步骤复杂,耗时长,容易出错,软件版本不匹配也会出问题例如新版wordpress要求php7.x以上。

  1. 安装php-rpm。略。 PHP:一种解释性编程语言 cgi协议:(Common Gateway Interface)通用网关接口。因为解释性语言有好几种java python等,为了让不同编程语言与不同的web服务器(apache httpd、Nginx之类)之间交互的Web服务器识别,规定了通用通信协议cgi,fast-cgi是其继任者。 php-rpm:实现了php的cgi协议的软件。可以类比java生态的tomcat。

    1. PHP官网下载 ,官网下载的是C源代码。

    2. 编译。耗时,容易失败。

    3. 安装

    4. 验证 systemctl status php-fpm.service 看到激活状态并且几个worker等待监听。 netstat -al | grep php

  2. 安装MySQL。略。

  3. 安装Nginx。略。

  4. 安装WordPress代码。略。

结论: 单是编译安装PHP就有一堆参数,经常编译半个小时中间报错。即使官网提供有根据操作系统和主流应用编译好的可执行版本, 安装PHP解释器、数据库、项目,并配置让它们互相通讯也是件麻烦事,需要调试很长时间。
但传统安装方式的好处是,报错明显,易于排查修改,易于开发迭代,是后面封装方式的前置操作示范。

(跳过 仅了解)shell脚本方式:LNMP一键安装

lnmp.org官网 有人写脚本将LNMP生态绑定,自动判断操作系统需要安装的软件包和依赖,自动化安装过程,自动修改配置文件,加入常用工具如mysql图形化客户端,最后暴露出网站接口,安装完即可访问,大大简化部署难度。
但php和mysql仍然需要编译,很久,或是从网上找系统对应的二进制包。经过尝试,耗时达几十分钟且仍部分软件仍安装错误。

结论:
shell方式是传统方式的脚本自动化,是否成功取决环境和写脚本人的水平,脚本开源脚本作者不一定有精力维护各种bug,安装环境千奇百怪,仍很有可能失败,且不如传统方式好排查问题。

以下开始本节实验内容

Docker容器编排

介绍

动态网站,前后端两种编程语言+数据库+web容器+web反代服务器,编译,端口相互对应,上面的方法第一次得折腾两天才能搞好。
这种时候Docker的优势就发挥出来了。

docker-compose: 容器编排工具,一个前后端分离的网站项目有前端nodejs/vue/react,后端java/python/php,数据库mysql/postgresql/oracle,web服务器apache/nginx。 如果要启动多个容器并让容器间相互关联,那么需要在docker-compose.yml配置文件中定义,再由docker-compose up命令启动。

wordpress docker hub主页
WordPress官方docker镜像介绍页面中发现了一个docker-compose.yml配置文件,这个配置文件中定义了两个docker容器, 并且第一个容器wordpress连接第二个容器mysql,我们就不需要一一安装配置软件,也不用操心端口配置,一切都安排好了。当然这个只是测试用,生产用的还要再套个nginx。

准备

  1. 安装docker

tar -zxf ./docker-installer.tar.gz rpm -iv --nodeps --force ./docker-installer/*.rpm systemctl start docker
  1. 加载所需离线镜像包

    docker load -i mysql.tar docker load -i wordpress.tar # 验证 docker image ls
  2. 准备 docker-compose 工具
    桌面版docker自带这个命令行工具,非桌面版的需要独立安装。
    老师提供了docker-compose-for-linux-x64 (实际名字可能与文档略有差异)可执行二进制,宿主机中复制,虚拟机图形文件管理器中粘贴,
    放入到 /bin目录下 或 /usr/bin 目录下,然后重命名为更加短的名字docker-compose

    10 2dockercompose

    或使用命令移动

    cp ./docker-compose /usr/local/bin/docker-compose # 操作完成后可以在任意目录调用 docker-compose -v
  3. 创建一个文件夹wordpress-docker作为项目文件夹。创建一个wordpress的 docker-compose.yml 配置文件。yml是一种缩紧格式的配置文件后缀。 配置文件名docker-compose.yml名字不能随意改动(如果改名还需要在命令中指定配置文件名), docker-compose up命令会自动发现当前文件夹下的配置文件。
    从Wordpress官方的DockerHub主页上发现一个配置文件如下,在本地创建这个配置文件。

    # 创建一个文件夹当作项目文件夹。因为docker-compose.yml配置文件名都一样,靠项目文件夹区分。 mkdir wordpress-docker # ⚠️切换工作目录到项目目录下,再创建容器编排配置文件。 # [localhost ~] cd ./wordpress-docker # [localhost /root/wordpress-docker/] touch docker-compose.yml

    配置文件不是linux基础命令,是docker自己的语法,看懂即可。文字较多简易图形化工具打开然后复制内容过去。

    version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html db: image: mysql:8.0 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db:
    10 2docker compose
  4. docker-compose启动容器编排。

    # ⚠️不加参数的情况下默认读取当前文件夹下的配置文件。注意工作目录在项目文件夹下,保证当前目录下有docker-compose.yml配置文件。 # [localhost /root/wordpress-docker] docker-compose up

    看到日志输出,因为是前台运行中,先不要ctrl+C否则会导致容器关闭,在容器运行状态下在浏览器中测试。
    (可选)打开一个新终端窗口输入docker-compose ps可以查看运行中的两个容器。

  5. 客户端浏览器测试
    虚拟机火狐浏览器访问: http://127.0.0.1:8080
    宿主机浏览器访问: http://你的服务器IP:8080

    10 2

结论:
Dockerfile固化了操作系统环境和应用,构建出了应用镜像,保证后面容器大家运行效果一致性。
docker-compose.yaml固化了多个容器、容器之间协同端口、网络、启动顺序,保证部署复杂项目时的效果一致性。
docker和docker-compose容器编排技术使我们能快速正确部署了之前需要几天才能完成的工作。

(课外)拓展

docker桌面版更直观,几乎所有命令都可以可视化配置。

10 2dockerdesktop wordpress

Kubernates:比docker-compose更加高级大型的工具。

搭建其它服务

15 二月 2026