Skip to main content

基于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 web

    4. 问题解决

    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

ClustrMaps