注意Docker自身的安装和命令,并非本笔记的内容。
镜像准备
WordPress镜像准备
1. 拉取官方镜像
你可以直接使用官方镜像。
docker pull wordpress:latest
2. 配置
官方镜像有一个问题,php的默认配置限制了文件上传。 所以我们可以自己做一个简单镜像,只需修改php文件上传配置。
现在创建新目录,创建一个uploads.ini
文件,用于配置php属性:
file_uploads = On
memory_limit = 320M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 360
属性名 | 参数 | 含义 |
---|---|---|
file_uploads | On | 允许上传文件 |
memory_limit | 320M | 单个PHP脚本最大320MB |
upload_max_filesize | 64M | 允许的最大文件尺寸64MB |
post_max_size | 64M | POST方法的数据最大64MB |
max_execution_time | 360 | 单脚本最长运行360秒 |
你可以根据需要,自行调整这些参数。
然后创建一个Dockerfile
,内容非常简单,只需要拉去镜像和复制配置脚本:
FROM wordpress:latest
COPY uploads.ini /usr/local/etc/php/conf.d/uploads.ini
3. 创建镜像
然后可以创建镜像,镜像名任意,这里以mysvac/wordpress
为例:
docker build -t mysvac/wordpress .
MySQL镜像准备
1. 拉取官方镜像
docker pull mysql
2. 编辑镜像
MySQL镜像的问题在于,时区可能不正确,以及没有初始数据库和用户。
现在创建新目录,创建一个init.sql
文件用于初始化数据库。
这里举个例子,创建db_base
数据库,然后创建baseAdmin
用户操作db_base
数据库。
再创建一个healthUser
用户用于监听数据库是否正常运行:
-- init.sql
CREATE DATABASE IF NOT EXISTS db_base;
CREATE USER IF NOT EXISTS 'baseAdmin'@'%' IDENTIFIED BY 'baseAdminPwd';
GRANT ALL PRIVILEGES ON db_base.* TO 'baseAdmin'@'%';
CREATE USER IF NOT EXISTS 'healthUser'@'localhost' IDENTIFIED BY '';
GRANT PROCESS ON *.* TO 'healthUser'@'localhost';
FLUSH PRIVILEGES;
账号密码和数据库名请自行调整。这里假设数据库端口不对外开放,所以可以明文存放。
然后编写Dockerfile
,处理时区问题,载入刚刚编写的初始脚本:
FROM mysql:latest
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV MYSQL_ROOT_PASSWORD=xxxpassword
COPY init.sql /docker-entrypoint-initdb.d/
这里甚至明文存放了ROOT账号密码,请你自行更改。实际上我们后面用不到这个ROOT密码。
3. 创建镜像
镜像名依然以mysvac/mysql
为例,可以自行修改。
docker build -t mysvac/mysql .
编排容器
下面我们通过Docker-compose配置网络/命名卷/容器名,我们需要完成这些任务:
- 创建一个专用网络,提供给Mysql和Wordpress使用
- 添加健康检测,保证Mysql先启动,Wordpress后启动
- 添加命名卷,存放二者的持久化数据,便于本地修改配置
- 让两个容器自动重启
配置
现在创建新目录,创建一个docker-compose.yml
文件,样例代码如下:
services:
mysql:
image: mysvac/mysql:latest
container_name: blog-mysql
volumes:
- "blog_mysql:/var/lib/mysql"
networks:
- blog-net
healthcheck:
test: ["CMD", "mysqladmin", "-u", "healthUser" ,"ping"]
interval: 40s
timeout: 8s
retries: 4
start_period: 16s
restart: unless-stopped
wordpress:
image: mysvac/wordpress:latest
container_name: blog-wordpress
volumes:
- "blog_wordpress:/var/www/html"
ports:
- "14080:80"
networks:
- blog-net
depends_on:
mysql:
condition: service_healthy
restart: unless-stopped
networks:
blog-net:
name: blog-net
volumes:
blog_mysql:
blog_wordpress:
注意我们将wordpress的端口映射到了14080,你可以选择自己喜欢的端口号。
创建容器
现在可以使用刚才的编排配置创建容器了:
docker compose up -d
创建完成后可以查看命名卷列表,事实上我们没有指定完整名称,生成的命名卷应该是XXX_blog_mysql
和XXX_blog_wordpress
的形式。
初始化Wordpress
现在可以通过浏览器访问Wordpress了,如果你在本地,且没有修改上面的配置,那URL应该是http://localhost:14080
,云服务器则是http://yoursite:14080
。
注意,不要使用
https
访问,否则无法正常显示网站。HTTPS的配置后面会讲。
1. 选择语言
拉到最下方有中文,最上方是英文,你也可以选择其他语言。
选择后点击继续即可。
2. 配置数据库信息
如果你完全按照上面的样例配置,那么表格信息应该如下。如果不是,请参考下方表格自行调整。
项目 | 内容 | 说明 |
---|---|---|
数据库名 | db_base | 是SQL初始化脚本中创建的那个数据库 |
用户名 | baseAdmin | 是SQL初始化脚本中创建的用户 |
密码 | baseAdminPwd | 是SQL初始化脚本中设置的用户密码 |
数据库主机 | blog-mysql | 是docker-compose.yml中设置的容器名 |
表前缀 | wp_ | 这是默认值,无需修改 |
3. 运行安装程序
此时需要填写网站名,网站后台账号密码以及邮箱。
网站名随意,后面可以修改。账号密码和邮箱也可以更改,但需要先登录,所以请牢记账号信息。
对搜索引擎的可见性随意。
然后点击安装即可。
4. 登录
点击安装后,很快就会安装完成,然后使用刚才的账号密码登录。
如果你关闭了浏览器再打开,再访问http://localhost:14080
,很可能是游客状况。
请访问网址http://localhost:14080/wp-admin
登录网站后台。
若非本地部署,请将
localhost
改成你的服务器IP或者域名,但暂时不要使用https访问。
进阶内容
博客部署已经完成,剩下的内容可以选择性观看。
Argon美化主题
Argon主题的官方仓库:点我
Argon – 轻盈、简洁、美观的 WordPress 主题
建议在官方仓库的release中下载最新版的压缩包,这里给一个v1.35版本的链接:点击下载
然后返回Wordpress的后台,点击左侧栏中的“外观”->“主题”,页面左上角有“添加主题”->“上传主题”按钮。 我们将刚刚下载的压缩包上传即可。
注意,官方wordpress镜像可能不允许文件上传,但我们的镜像使用相关配置文件允许了文件上传。
这里提供一些Argon的文档/教程:
配置SSL证书与开启HTTPS支持
WordPress配置HTTPS支持并没有你想的那么轻松,一旦操作失误,网站很可能无法访问,需要修改配置文件才能恢复。
下面我将介绍如何使用Nginx配置SSL证书,让网站支持HTTPS访问。
前提条件:
- 博客部署于云服务器而非本地
- 拥有执行服务器IP的域名
- 有SSL证书(可用阿里云或腾讯的免费测试证书)
1. 配置Nginx反向代理
Nginx可以直接安装也用docker安装,这里不介绍。
下面要配置nginx.conf
,大致需要如下内容:
- 将http请求301转发到https
- 将https请求反向代理到本地端口,并附带证书
- 允许Nginx代理时传输文件,并设置最大文件大小
样例如下(下面使用yoursite
代指你的域名):
# ......................
http {
# ......................
# 允许传输文件并设置最大数据量
client_max_body_size 64M;
sendfile on;
# ......................
# 将http请求转发到https
server {
listen 80;
server_name yoursite.com www.yoursite.com;
return 301 https://yoursite.com$request_uri;
}
# 将https请求代理到本地端口
server {
listen 443 ssl;
http2 on;
server_name yoursite.com;
# 证书位置
ssl_certificate /etc/nginx/ssl/yoursite.com.pem;
ssl_certificate_key /etc/nginx/ssl/yoursite.com.key;
location / {
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-Proto $scheme;
# 代理到本地的14080端口
proxy_pass http://127.0.0.1:14080;
}
}
# ......................
}
# ......................
阿里云/腾讯云等平台提供免费测试证书,申请后下载Nginx的版本,内含
pem
和key
两个文件,
2. 设置网站URL
进入WordPress后台,点击左侧栏的“设置”,里面有WordPress 地址(URL)
和站点地址(URL)
。
将他们都修改成https://yoursite.com
,然后下方保存修改。
注意
yoursite
指的是你的域名,别真改成yoursite
,此处操作错误后的修复非常繁琐。
保存后,你可能就无法使用IP访问了,只能通过域名访问,后台网址还是熟悉的https://yoursite.com/wp-admin
。
现在通过域名和https访问你的网站,你会发现网站排版完全乱了,打开F12开发者工具就能发现问题所在: 现在开启了https,但是有很多资源请求依然使用http发送,这些请求都被拦截了。
3. 修改配置文件
为了使请求统一采用https发送,我们需要修改wordpress的php配置。
我们在创建容器时,我们为Wordpress分配了命名卷,它的名字大概是XXX_blog_wordpress
。
进入这个命名卷,在根目录可以找到一个wp-config.php
文件,我们需要修改它。
现在打开这个文件,在第一段注释之后、数据库代码之前,加上这三条语句:
/**
* .........这是文档开头的注释
* @package WordPress
*/
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);
$_SERVER['HTTPS'] = 'on';
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
FORCE_SSL_ADMIN
和FORCE_SSL_LOGIN
分别表示后台和登录页面启用https。
$_SERVER['HTTPS'] = 'on';
指令告诉PHP/WordPress当前使用的是HTTPS协议。
现在保存修改,然后重启Wordpress容器。
4. 最后
容器重启完后,再通过https和域名访问,网站就恢复正常了。
注意https的网页内不应该出现http资源,所以你链接外部资源时也请使用https请求。
评论测试