Docker Compose 搭建 LNMP 架构的 wordpress 网站

发布时间 2023-08-23 16:38:34作者: m_zhuang

一、项目信息

1. 项目环境

(1)公司在实际的生产环境中,需要使用Docker 技术在一台主机上创建LNMP服务并运行Wordpress网站平台。然后对此服务使用docker-compose管理工作。

(2)环境描述

主机 操作系统 IP 地址 主要软件
Docker CentOS 7.6 x86_64 192.168.23.35 Docker
容器名称 IP地址
Nginx 172.20.0.10
MySQL 172.20.0.20
PhP 172.20.0.30

2. 任务要求

(1)使用Docker构建LNMP环境并运行Wordpress网站平台。

(2)为了方便运维和统一管理使用进行docker-compose编排

(3)将所有容器进行快照,然后将Docker镜像打包成tar包备份到本地。

(4)把docker-compose.yml 复制到文档中

二、安装 Docker

1. 目前 Docker 只能支持 64 位系统

systemctl stop firewalld.service
setenforce 0

2. 安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2 

yum-utils:提供了 yum-config-manager 工具。

device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。

device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

image-20230815161936044

3. 设置阿里云镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

yum-config-manager --add-repo 命令用于在 CentOS 上添加软件仓库。而指定的 https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 是阿里云提供的 Docker CE 镜像仓库。

系统将下载并安装包含 Docker CE 软件源信息的文件(docker-ce.repo),以便使用 yum 包管理器从该镜像仓库中获取 Docker CE 相关的软件包。

image-20230815162044490

4. 安装 Docker-CE并设置为开机自动启动

yum install -y docker-ce docker-ce-cli containerd.io

systemctl start docker.service
systemctl enable docker.service 
  • docker-ce-cli 是 Docker 客户端的命令行工具,用于与 Docker 服务进行交互。它允许您在命令行中执行各种 Docker 命令,例如构建、运行和管理容器。
  • containerd.io 是一个独立的容器运行时,用于管理容器的生命周期。它是 Docker 引擎的一部分,负责处理底层的容器管理操作,如创建、启动、停止和销毁容器等。

image-20230815163141398

image-20230815163156167

4. 镜像加速下载

浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lljqyim2.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker

image-20230815164806925

5. 获取 centos7 镜像

docker pull centos:7
docker images

image-20230823104405681

三、Docker Compose 环境部署

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose

1. 下载

在Linux上我们可以从GitHub上下载它的二进制包来使用,此命令是下载Docker Compose的当前稳定版本

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

image-20230821162458313

2. 安装

chmod +x /usr/local/bin/docker-compose

3. 查看版本

docker-compose --verserion

image-20230821162704051

四、Nginx

1. 上传 Nginx 安装包

mkdir -p /opt/compose_lnmp/nginx /opt/compose_lnmp/nginx/wwwroot
cd /opt/compose_lnmp/nginx
# 上传 nginx 安装包 nginx-1.12.0.tar.gz,wordpress 服务包 wordpress-4.9.4-zh_CN.tar.gz
rz -E

image-20230823123055688

2. 编辑 Dockerfile 脚本

vim /opt/compose_lnmp/nginx/Dockerfile

# 使用CentOS 7作为基础镜像
FROM centos:7
# 维护者信息
MAINTAINER this is lnmp-nginx image <lnmp>  

# Nginx 配置
# 安装编译Nginx所需的依赖包
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
# 创建一个名为nginx的系统用户,用于运行Nginx
RUN useradd -M -s /sbin/nologin nginx     
# 将本地的nginx源码包复制到容器内的/usr/local/src/目录下
ADD nginx-1.12.0.tar.gz /usr/local/src/
# 设置工作目录为nginx源码路径
WORKDIR /usr/local/src/nginx-1.12.0

# 配置Nginx编译选项
RUN ./configure \                        
--prefix=/usr/local/nginx \               # 指定安装路径
--user=nginx \                            # 指定运行Nginx的用户
--group=nginx \                           # 指定运行Nginx的用户组
--with-http_stub_status_module            # 启用HTTP stub status模块

# 编译并安装Nginx
RUN make -j 4 && make install
# 将Nginx可执行文件添加到环境变量中
ENV PATH /usr/local/nginx/sbin:$PATH      
# 将本地的nginx配置文件复制到容器内的/usr/local/nginx/conf/目录下
ADD nginx.conf /usr/local/nginx/conf/
# 将本地的wordpress应用复制到容器内的/usr/local/nginx/html/目录下
ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html   
# 设置/usr/local/nginx/html/目录的权限为777,使其对所有用户可写
RUN chmod 777 -R /usr/local/nginx/html/   
# 暴露容器的80和433端口,供外部访问Nginx
EXPOSE 80
EXPOSE 443
  
# 容器启动后执行的命令,以非守护进程方式运行Nginx
CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]

image-20230823130111866

3. 编辑 nginx 的主配置文件

nginx.conf 文件

vim nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.php;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
            root           html;
            fastcgi_pass   172.20.0.30:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}


image-20230823130214418

五、MySQL

1. 上传 MySQL 安装包

mkdir /opt/compose_lnmp/mysql /opt/compose_lnmp/mysql/backup
cd /opt/compose_lnmp/mysql
# 上传安装包 mysql-boost-5.7.20.tar.gz
rz -E

image-20230823130351699

2. 编辑 Dockerfile 脚本

vim /opt/compose_lnmp/mysql/Dockerfile

# 使用CentOS 7作为基础镜像
FROM centos:7
# 维护者信息
MAINTAINER this is lnmp-mysql image <lnmp>  
# 创建一个无登录权限的mysql用户
RUN useradd -M -s /sbin/nologin mysql
# 安装MySQL的编译环境
RUN yum -y install \
ncurses \
ncurses-devel \
bison \
cmake \
make \
gcc \
gcc-c++
# 将MySQL源代码压缩包复制到/usr/local/src/目录下
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/  
# 设置工作目录为/usr/local/src/mysql-5.7.20/
WORKDIR /usr/local/src/mysql-5.7.20/  
# 运行cmake命令进行编译配置
RUN cmake \  
  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \  # 指定MySQL安装路径
  -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \  # 指定Unix套接字文件路径
  -DSYSCONFDIR=/etc \  # 指定配置文件目录
  -DSYSTEMD_PID_DIR=/usr/local/mysql \  # 指定systemd进程ID目录
  -DDEFAULT_CHARSET=utf8 \  # 指定默认字符集为utf8
  -DDEFAULT_COLLATION=utf8_general_ci \  # 指定默认排序规则为utf8_general_ci
  -DWITH_EXTRA_CHARSETS=all \  # 启用所有额外的字符集支持
  -DWITH_INNOBASE_STORAGE_ENGINE=1 \  # 启用InnoDB存储引擎
  -DWITH_ARCHIVE_STORAGE_ENGINE=1 \  # 启用Archive存储引擎
  -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  # 启用Blackhole存储引擎
  -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \  # 启用Performance Schema存储引擎
  -DMYSQL_DATADIR=/usr/local/mysql/data \  # 指定MySQL数据目录
  -DWITH_BOOST=boost \  # 使用Boost库
  -DWITH_SYSTEMD=1  # 启用systemd支持

# 运行make命令进行编译和安装
RUN make -j 4 && make install  
# 将my.cnf配置文件复制到/etc/my.cnf
ADD my.cnf /etc/my.cnf  
# 开放容器的3306端口,用于MySQL服务
EXPOSE 3306
# 修改MySQL安装目录的所有者为mysql用户
RUN chown -R mysql:mysql /usr/local/mysql/  
# 修改/etc/my.cnf文件的所有者为mysql用户
RUN chown mysql:mysql /etc/my.cnf  
# 设置工作目录为/usr/local/mysql/bin/
WORKDIR /usr/local/mysql/bin/  

# 运行mysqld命令初始化MySQL
RUN ./mysqld \  
  --initialize-insecure \  # 使用不安全的方式进行初始化
  --user=mysql \  # 指定运行MySQL的用户为mysql
  --basedir=/usr/local/mysql \  # 指定MySQL的安装路径
  --datadir=/usr/local/mysql/data  # 指定MySQL的数据目录
  
# 复制mysqld.service文件到systemd目录下
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ 
# 启用mysqld服务
RUN systemctl enable mysqld  
# 设置环境变量PATH,将MySQL的bin和lib目录添加到路径中
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH

# 容器启动时执行的命令为/usr/sbin/init
CMD ["/usr/sbin/init"]  

image-20230823130613031

3. 编辑 mysql 主配置文件

my.cnf 文件

vim my.cnf
 
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
 
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

image-20230823130653550

六、PHP

1. 上传 PHP 安装包

mkdir /opt/compose_lnmp/php /opt/compose_lnmp/php/backup
cd /opt/compose_lnmp/php
# 上传 php 安装包 php-7.1.10.tar.bz2
rz -E

image-20230823130843289

2. 编辑 Dockerfile 脚本

vim /opt/compose_lnmp/php/Dockerfile

# 使用CentOS 7作为基础镜像
FROM centos:7
# 维护者信息
MAINTAINER this is lnmp-php image <lnmp>  
# 使用yum安装一系列依赖包
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel   

# 创建用户nginx,禁止登录且没有家目录
RUN useradd -M -s /sbin/nologin nginx   
# 将php-7.1.10.tar.bz2复制到/usr/local/src/目录下
ADD php-7.1.10.tar.bz2 /usr/local/src/  
# 设置工作目录为/usr/local/src/php-7.1.10/
WORKDIR /usr/local/src/php-7.1.10   
# 运行configure命令进行配置
RUN ./configure \   
--prefix=/usr/local/php \   # 指定PHP安装路径
--with-mysql-sock=/usr/local/mysql/mysql.sock \   # 指定MySQL Unix套接字文件路径
--with-mysqli \   # 启用MySQLi扩展
--with-zlib \   # 启用Zlib扩展
--with-curl \   # 启用CURL扩展
--with-gd \   # 启用GD扩展
--with-jpeg-dir \   # 指定JPEG库的路径
--with-png-dir \   # 指定PNG库的路径
--with-freetype-dir \   # 指定Freetype库的路径
--with-openssl \   # 启用OpenSSL扩展
--enable-fpm \   # 启用PHP-FPM
--enable-mbstring \   # 启用多字节字符串支持
--enable-xml \   # 启用XML支持
--enable-session \   # 启用会话支持
--enable-ftp \   # 启用FTP支持
--enable-pdo \   # 启用PDO扩展
--enable-tokenizer \   # 启用Tokenizer扩展
--enable-zip   # 启用ZIP扩展

# 运行make命令进行编译和安装
RUN make -j 4 && make install   
# 设置环境变量PATH,将PHP的bin和sbin目录添加到路径中
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH   
# 将php.ini配置文件复制到/usr/local/php/lib/目录下
ADD php.ini /usr/local/php/lib/   
# 将php-fpm.conf配置文件复制到/usr/local/php/etc/目录下
ADD php-fpm.conf /usr/local/php/etc/   
# 将www.conf配置文件复制到/usr/local/php/etc/php-fpm.d/目录下
ADD www.conf /usr/local/php/etc/php-fpm.d/  
# 开放容器的9000端口,用于PHP-FPM服务
EXPOSE 9000
# 容器启动时执行的命令是启动PHP-FPM服务
CMD /usr/local/php/sbin/php-fpm -F   

image-20230823131213429

3. 准备 php 配置文件

编辑 php.ini、php-fpm.conf、www.conf 配置文件

(1)php.ini

# 上传 php.ini 模板
rz -E

vim php.ini
# 939 行,取消注释,修改
date.timezone = Asia/Shanghai
# 1170行,修改
mysqli.default_socket = /usr/local/mysql/mysql.sock

egrep -v "^;" php.ini | grep -v "^$"

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket = /usr/local/mysql/mysql.sock
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = On
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = 1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[mcrypt]
[dba]
[opcache]
[curl]
[openssl]

image-20230823131544358

image-20230823131405613

image-20230823131432983

(2)php-fpm.conf

该配置文件位于 /usr/local/php/etc/php-fpm.conf.default

# 上传 php-fpm.conf 文件模板
rz -E

vim php-fpm.conf
# 17行,删除注释符号 “;”
php = run/php-fpm.pid

egrep -v "^;" php-fpm.conf | egrep -v "^$"
[global]
pid = run/php-fpm.pid
include=/usr/local/php/etc/php-fpm.d/*.conf

image-20230823131718960

image-20230823131642252

(3)www.conf

该配置文件位于 usr/local/php/etc/php-fpm.d/www.conf.default

# 上传 www.conf 模板
rz -E

vim www.conf
# 23、24行,修改用户和组
user = nginx
group = nginx
# 36行,修改监听IP和端口为容器IP:9000端口
list = 172.20.0.30:9000

egrep -v "^;" www.conf | egrep -v "^$"
[www]
user = nginx
group = nginx
listen = 172.20.0.30:9000
listen.allowed_clients = 127.0.0.1,172.20.0.10
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

image-20230823131805529

image-20230823131846878

image-20230823131951933

image-20230823132028012

七、编写 docker-compose.yml

vim /opt/compose_lnmp/docker-compose.yml

# 指定docker-compose版本为3
version: '3'

services:
  # 定义一个名为 nginx 的服务
  nginx:
    # 设置容器名称为 nginx
    container_name: nginx
    # 设置主机名为 nginx
    hostname: nginx
    # 构建镜像
    build:
      # 设置上下文路径为 ./nginx,及Dockerfile所在目录
      context: ./nginx
      # 指定 Dockerfile 文件名为 Dockerfile
      dockerfile: Dockerfile
    # 端口映射
    ports:
      # 将主机的 1314 端口映射到容器的 80 端口
      - 1314:80
      # 将主机的 520 端口映射到容器的 443 端口
      - 520:443
    # 网络设置
    networks:
      # 连接到名为 lnmp 的网络
      lnmp:
        # 指定容器的ip地址为 172.20.0.10
        ipv4_address: 172.20.0.10
    # 卷挂载
    volumes:
      # 将主机的 ./nginx/wwwroot 目录挂载到容器的 /usr/local/nginx/html 的目录
      - ./nginx/wwwroot:/usr/local/nginx/html


  # 定义一个名为 mysql 的服务
  mysql:
    # 设置容器名称为 mysql
    container_name: mysql
    # 设置主机名为 mysql
    hostname: mysql
    # 构建镜像
    build:
      # 设置上下文路径为 ./mysql,及 Dockerfile 所在的目录
      context: ./mysql
      # 指定 Dockerfile 文件名为 Dockerfile
      dockerfile: Dockerfile
    # 网络设置
    networks:
      # 连接到名为 lnmp 的网络
      lnmp:
        # 指定容器的ip地址为 172.20.0.20
        ipv4_address: 172.20.0.20
      # 卷挂载
      volumes:
        # 将主机的 ./mysql/backup 目录挂载到容器的 /usr/local/mysql 目录下
        - ./mysql/backup:/usr/local/mysql
      

  # 定义一个名为 php 的服务
  php:
    # 设置容器名称为 php
    container_name: php
    # 设置主机名为 php
    hostname: php
    # 构建镜像
    build:
      # 设置上下文路径为 ./php,及 Dockerfile 所在的目录
      context: ./php
      # 指定 Dockerfile 文件名为 Dockerfile
      dockerfile: Dockerfile
    # 网络设置
    networks:
      # 连接到名为 lnmp 的网络
      lnmp:
        # 指定容器的ip地址为 172.20.0.30
        ipv4_address: 172.20.0.30
      # 卷挂载
      volumes:
        # 将主机的 ./php/backup 目录挂载到容器的 /usr/local/php 目录下
        - ./php/backup:/usr/local/php
        
        
        

# 网络定义
networks:
  # 定义名为 lnmp 的网络
  lnmp:
    # 使用 bridge 网络驱动
    driver: bridge
    # IP 地址管理
    ipam:
      # 配置 IP 地址
      config:
        # 设置子网为 172.20.0.0/16
        - subnet: 172.20.0.0/16


image-20230823133650081

八、部署并运行 compose

1. 部署并运行

cd /opt/compose_lnmp
docker-compose -f docker-compose.yml up -d

docker ps

-f --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p --project-name NAME :指定项目名称,默认使用目录名称
-d 在后台运行

up命令用于根据 Docker Compose 配置文件启动定义的服务。它会创建和启动配置文件中所有的服务容器,并将它们放置在一个共享网络中

2. 查看已启动的容器状态

# 必须在docker-compose.yum 所在目录执行此命令
cd /opt/compose_lnmp/
# 查看已经启动的容器的状态
docker-compose ps

九、验证

浏览器访问:http://192.168.23.35/wordpress/index.php

image-20230823162528823