【网站】如何用Docker容器运行供应商的定制版WordPress

一、一个烂摊子

部门此前寻找网站供应商制作了产品网站,其交付网站架构较为老旧,网站基于WordPress 5.0版本构建,PHP版本要求为不高于7.3,MySQL版本5.7。

就是这种要求在回迁公司服务器时也出现了各种问题。由于公司服务器环境过于杂乱,连mysql5.7的数据库都无法顺利导入。

这里面也有供应商的一些问题,例如交付的WordPress配置文件与数据库表头不匹配,数据库时间配置错误等。

在我的帮助下,数据库和配置文件都得以修改正常,网站终于部署上线,但是系统环境导致包含中文文件名的文件无法被解析,在调整Nginx配置无效后,IT让我修改中文名文件,我。。。

二、服务器和Docker

借由新ECS服务器和公司官网的搭建,考虑把产品网站也纳入部门服务器的管理。

但供应商的环境版本老久,为了避免产品网站潜藏的漏洞影响整体服务器的稳定,我使用了Docker来为产品网站配置环境。

中间也考虑使用LXD来实现,但是网络环境始终无法配置完成,因此不再浪费时间,使用Docker实现功能。

三、Docker的问题

最大的问题是镜像源,国内能搜索到的镜像源很多都停止了服务。因此需要在/etc/docker/daemon.json里配置可以访问的镜像源,这个不再赘述。

四、部署

将供应商的WP文件夹上传到服务器,可以在同位置配置Docker的yml文件。

version: '3.7'

services:
  wordpress:
    build: .
    container_name: wordpress-container
    ports:
      - "8000:80"  # WordPress 端口
    volumes:
      - /# 本地 WordPress 目录 wp:/var/www/html  # 本地 WordPress 目录
    networks:
      - wordpress_network
    depends_on:
      - mariadb  # 依赖 MariaDB 服务
    environment:
      WORDPRESS_DB_HOST: mariadb:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: # 用户名
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}  # 从 .env 读取密码
    restart: always

  mariadb:
    image: mariadb:latest
    container_name: mariadb-container
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}  # 从 .env 读取密码
      MYSQL_DATABASE: wordpress
      MYSQL_USER: # 用户名
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - mariadb_data:/var/lib/mysql  # 使用 Docker Volume 代替宿主机路径
      - # 初始数据库地址:/docker-entrypoint-initdb.d/#初始数据库.sql  # 初始 SQL 数据
    ports:
      - "3307:3306"
    networks:
      - wordpress_network
    restart: always

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin-container
    environment:
      PMA_HOST: mariadb
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}  # 从 .env 读取密码
    ports:
      - "8081:80"
    networks:
      - wordpress_network
    restart: always

networks:
  wordpress_network:
    driver: bridge

volumes:
  mariadb_data:

从.env文件读取密码:

MYSQL_ROOT_PASSWORD=# 密码1
MYSQL_PASSWORD=# 密码2

如果是使用mariadb,则需要在WP的Config文件中修改配置:

define('DB_HOST', 'mariadb');

后端启动之后,我们可以通过IP+端口来进行服务的测试,如果没有问题,就可以通过主机的Nginx代理,来配置域名访问。

server {
    listen 80;
    server_name #域名;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name #域名;

    ssl_certificate /etc/letsencrypt/live/#域名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/#域名/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:8000;#映射docker端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
    }
}

五、其他注意事项:

1、如果WP的重写规则不可用,检查WP文件夹权限。

2、如果配置HTTPS发现页面正常,但是管理界面出现问题,考虑是配置文件问题,参考官方说明配置

define( 'FORCE_SSL_ADMIN', true );
// in some setups HTTP_X_FORWARDED_PROTO might contain 
// a comma-separated list e.g. http,https
// so check for https existence
if( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false )
    $_SERVER['HTTPS'] = 'on';

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注