基于docker stack部署wordpress
· 3 min read
1. Docker Hub 上有关于 wordpress 部署方式的说明,我们使用 docker stack 方式部署 wordpress,为便于部署其它应用,在 wordpress 前面部署了 nginx 进行反向代理,docker-compose.yml 文件内容如下:
-
- nginx 处在 frontend 和 backend 网络中
- wordpress 处在 backend 网络中
- mysql 处在 backend 网络中
- nginx 的配置文件夹,html 目录内容,log 文件夹镜像到主机上(文件夹映射会自动在 host 与 container 之间同步,文件则不会,所以 volumes bind 最好用文件夹)
- mysql 的数据文件夹镜像到主机上
- wordpress 的完整目录(/var/www/html)镜像到主机上
- wordpress 安装目录下的 wp-content 文件夹保存了所有的插件及上传文件,但主程序(.php 文件)在上层文件位中,为了以后的主 程序升级,我们把整个目录镜像出去备份
version: "3.3"
services:
nginx:
image: nginx:1.13.8
deploy:
mode: "global"
labels:
- "position=frontend"
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: any
ports:
- "80:80"
volumes:
- type: "bind"
source: "/etc/nginx/"
target: "/etc/nginx/"
read_only: true
- type: "bind"
source: "/var/www/html/"
target: "/usr/share/nginx/html"
read_only: true
- type: "bind"
source: "/var/log/nginx/"
target: "/var/log/nginx/"
networks:
- frontend
- backend
mysql5_7:
image: mysql:5.7
deploy:
labels:
- "position=backend"
placement:
constraints:
- "node.role == manager"
restart_policy:
condition: any
volumes:
- type: "bind"
source: "/var/lib/mysql5_7"
target: "/var/lib/mysql"
#restart: always
environment:
MYSQL_ROOT_PASSWORD: "**********"
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: "**********"
networks:
- backend
wordpress:
depends_on:
- mysql5_7
image: wordpress:4.9.5-apache
deploy:
labels:
- "position=backend"
restart_policy:
condition: any
volumes:
- type: "bind"
source: "/var/lib/wordpress"
target: "/var/www/html"
environment:
WORDPRESS_DB_HOST: mysql5_7:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: "***************"
networks:
- backend
networks:
frontend:
backend:2. nginx 中配置转发
nginx.conf 内容
http {
server {
listen 80;
location / {
proxy_pass http://wordpress:80;
proxy_set_header Host www.blog.org;
proxy_pass_request_headers on;
}
}
}3. 以 stack 方式部署, stack 名称为 web
#docker stack deploy -c docker-compose.yml web4. 问题解决
wordpress 实例在 docker container 中以 www-data 用户运行,用户 id 为 33,如下图,在文件上传或插件更新时会提示没有文件夹写权限


通过修改主机上的镜像文件夹 owner 解决,虽然该用户 id 在主机上 并不存在:#chown -R 33:33 /var/lib/wordpress/5. 不提供 FTP 信息自动完成 WordPress 更新
WordPress 默认更新时需要提供 FTP 信息远程更新, 通过配置可能设置自动更新:
修改 wp-config.php, 添加如下内容:
define('FS_METHOD','direct');
同时确保 wordpress 根目录的 Owner 已经修改为 33
