WordPress迁移到docker教程
去年的差不多这时候买了个服务器把我的博客从github上搬到了这里用上了wordpress,当时也没考虑多就直接在安装在服务器上,后来经人提醒最好是使用docker安装wordpress,一来是日后容易迁移,二来是wordpress被日了也不会影响到服务器。拖了大半年时间,寒假在家没事就鼓捣一下吧。
备份
首先是wordpress的备份,这里使用了一款插件 All-in-One WP Migration
选项默认直接导出到文件即可,这样就完成了备份操作得到一个wpress文件。
docker部署wordpress
接下来就直接在docker部署wordpress,需要docker-compose,没有安装的自行百度。docker已经有wordpress的官方镜像供我们直接使用,因此还需要一个 mysql 数据库即可。
这里推荐在用户目录下建一个wordpress文件夹用来存储文件,首先新建一个 docker-compose.yml 文件:
version: '3.3'
services:
db:
image: mysql:5.7
container_name: db_example
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: test # 随便起
MYSQL_DATABASE: test # 这三行设定需要和下面一致
MYSQL_USER: test
MYSQL_PASSWORD: test
wp:
depends_on:
- db
image: wordpress:latest
container_name: example_site
ports:
- "80:80"
- "443:443" # 可以根据需要改成其他端口,但下文的实例将使用1234
restart: always
links:
- db:mysql
environment:
WORDPRESS_DB_NAME: test
WORDPRESS_DB_USER: test
WORDPRESS_DB_PASSWORD: test
volumes:
- ./src:/var/www/html
- ./ssl:/ssl
volumes:
db_data:
ports
指令这里需要注意提前把443端口也开出来,为后面的HTTPS协议准备volumes
指令是将容器中的文件夹内容映射到本机上,如./src:/var/www/html
就是将容器的/var/www/html
路径下的文件映射到本机的./src
中,当我们需要修改容器中的内容时就可以直接在本机上修改,省去了进入容器的步骤,十分方便。link
指令将 mysql 容器和 WordPress 联系起来,这样 WordPress 实例就可以访问数据库了。请注意,虽然我们用 Docker-compose 可以协调多个 Docker 容器之间的合作,但每个容器之间仍然是互相独立的。也就是说,除非是你把 Docker 容器暴露给外部世界(通过port
或volumes
等指令映射),它们是完全“绝缘”的。当然我们也可以给 MySQL 实例创建端口映射(一些教程也是这么做的),但在我们这个范例中是完全没必要的。毕竟,端口开得越多一个,安全威胁就多一分。
然后执行:
$ docker-compose up -d
-d
是后台静默运行
等待docker拉取镜像和开启容器,完成后请注意wordpress容器有没有把443端口也映射出来,访问 IP:80
就应该能看到wordpress的5分钟安装界面了。
快速安装一遍然后使用 All-in-One WP Migration 插件进行还原。这里会遇到上传文件大小限制在2M以下的问题,根据插件的提示,我们应该修改wordpress容器的 .htaccess 文件,添加以下内容:
php_value upload_max_filesize 128M
php_value post_max_size 128M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300
由于建立镜像的时候我们已经把容器的 /var/www/html
路径下的文件映射到本机的 ./src
中,因此这里我们就能直接享受这种好处,直接修改 ./src
下的 .htaccess 文件即可。
还原后就能看到原来熟悉的网站啦!!
部署HTTPS
接下来就是部署HTTPS来加强网站安全性问题了
开启ssl模块
首先进入wordpress容器,加载apache的ssl模块,修改证书和私钥路径。
- 进入容器
$ docker exec -it example_site bash
- 开启ssl模块
# a2enmod ssl
编辑容器中的ssl文件
vim /etc/apache2/sites-available/default-ssl.conf
找到SSLCertificateFile和SSLCertificateKeyFile这两个配置项,改成把私钥和证书挂载进容器里面后的路径,这里需要提前把证书和密钥放到本机的 /ssl/ 目录下。
在容器中或许不能使用vi/vim,可以将文件从容器中拷贝出来改,再拷贝进去
- 导出到本机
$ docker cp example_site:/etc/apache2/sites-available/default-ssl.conf default-ssl.conf
- 修改后再导回去
$ docker cp default-ssl.conf example_site:/etc/apache2/sites-available/default-ssl.conf
- 完成后重启容器即可
$ docker restart example_site
这时候访问 https://域名 就可以看到安全的小锁了。
强制http请求转到https
最后一步是将HTTP协议的请求跳转到HTTPS协议,编辑 /etc/apache2/sites-available/000-default.conf,找到<VirtualHost *:80> </VirtualHost>
标签中增加下面的配置:
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
这里同样是用不了 vim,因此还是用docker cp复制出来在放回去的方法,修改后保存重启容器就大功告成了。