使用 Docker 和 Traefik 搭建 WordPress(Nginx)

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)php

本文做者: 蘇洋html

建立時間: 2019年04月07日 統計字數: 6261字 閱讀時間: 13分鐘閱讀 本文連接: soulteary.com/2019/04/07/…前端


使用 Docker 和 Traefik 搭建 WordPress(Nginx)

前一篇 內容介紹瞭如何使用官方鏡像快速搭建 WordPress,可是官方默認是「胖容器」應用,接下來將聊聊一樣基於容器搭建的其餘選擇:Nginx。演示如何改造應用爲「瘦」容器應用。mysql

本文將花費十分鐘左右,介紹如何在 Docker 容器中搭配 Traefik 使用 WordPress 和 Nginx 。nginx

爲何選擇 Nginx

NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.sql

除了官方對於 Nginx 免費、開源、輕量、高性能的定位以外,當前不論在企業中,仍是我的學習使用,Nginx 的資源的豐富程度遠勝 Apache (前文 WordPress 容器鏡像默認工具)。docker

另外,Nginx 的兩個著名的派生應用,也在企業中普遍開花:Tengine、OpenResty,本文中的內容一樣適用於這兩個版本的「Nginx」。數據庫

容器鏡像清單

本文將使用下面幾個官方鏡像做爲演示,上面有提過,你可使用 Nginx 的「同類」們將它進行替換。編程

  • Nginx: 1.15.10-alpine
    • 做爲替換 Apache 的服務前端
  • WordPress: 5.1.1-php7.1-fpm-alpine
    • 使用僅包含 WordPress 代碼和 PHP 運行時的容器
  • mariadb: 10.3.14
    • 咱們的數據庫,若是有云數據庫,能夠不須要配置

Traefik 的使用

Traefik 的具體使用,能夠參考以往的文章,好比:使用服務發現改善開發體驗更完善的 Docker + Traefik 使用方案 等,更多內容,能夠翻看歷史內容的標籤,這裏不過多贅述。瀏覽器

本文只須要關注編排文件中的 labelsnetworks 字段配置就足夠啦。

對不一樣容器服務的 networks 字段,聲明包含相同的內容,則可讓不一樣應用所處於的網絡一致。

networks:
  - traefik
複製代碼

好比上面的聲明,會讓容器服務都處於名爲 traefik 的網絡環境中。

改寫容器編排配置

下面的配置在上一篇文章中提到過,爲了不篇幅過長,我作了適當精簡。

version: '3'

services:

  wp:
    image: ${WP_IMAGE}
    restart: always
    networks:
      - traefik
    environment:
        WORDPRESS_DB_HOST: ${DB_HOST}
        WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
        WORDPRESS_DB_NAME: ${DB_NAME}
        WORDPRESS_DB_USER: ${DB_USER}
        WORDPRESS_DB_PASSWORD: ${DB_PASS}
    volumes:
    # 若是你有定製上傳文件尺寸的需求
    # - ./config/php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
      - ./wp-app:/var/www/html
    labels:
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:${WP_DOMAINS}"
      - "traefik.frontend.entryPoints=https,http"

  mariadb:
    image: ${DB_IMAGE}
    restart: always
    container_name: ${DB_HOST}
    networks:
      - traefik
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
    volumes:
      - ./data:/var/lib/mysql

networks:
  traefik:
    external: true
複製代碼

若是咱們使用 Nginx 做爲 「Web 前端」,那麼這裏須要進行適當的調整。

改寫 WordPress 容器編排配置

由於使用 Nginx 取代了 WordPress 做爲流量入口,因此 WordPress 服務能夠再也不綁定 Traefik ,註冊請求域名,labels 字段能夠悉數刪除。

另外,由於 WordPress 須要被 Nginx 遠程調用,因此須要給 WordPress 這個服務添加一個固定的 container_name ,以便於調用。如同上面配置中,WordPress 調用 Mariadb 同樣。

services:
  wp:
    image: ${WP_IMAGE}
    restart: always
    container_name: ${WP_HOST}
    networks:
      - traefik
    environment:
        WORDPRESS_DB_HOST: ${DB_HOST}
        WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
        WORDPRESS_DB_NAME: ${DB_NAME}
        WORDPRESS_DB_USER: ${DB_USER}
        WORDPRESS_DB_PASSWORD: ${DB_PASS}
    volumes:
      - ./wordpress:/var/www/html
複製代碼

上面就是改造好的配置啦,數據庫沒有任何變化,咱們略過它,開始配置 Nginx 。

編寫 Nginx 容器編排配置

services:
  nginx:
    image: ${NGX_IMAGE}
    restart: always
    networks:
      - traefik
    expose:
      - 80
    volumes:
      - ./conf:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
      - ./wordpress:/var/www/html
    depends_on:
      - wp
    labels:
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:${NGX_DOMAINS}"
      - "traefik.frontend.entryPoints=https,http"
複製代碼

由於 Nginx 接管了入口流量,因此在 Traefik 上註冊服務發現的任務就非它莫屬了,這裏使用 labels 字段,添加一些 Traefik 支持的指令,進行服務註冊。

另外,這裏須要將 WordPress 掛載到文件系統中的文件也掛載到 Nginx 中,就像這樣。

- ./wordpress:/var/www/html
複製代碼

最後,簡單聲明一個 Nginx 配置,用來描述如何調用 WordPress 便可。

建立簡單的 Nginx 服務配置

將下面的內容保存爲 wp.conf 便可。

server {
    listen 80;

    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wp:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
複製代碼

編寫環境文件

和前文同樣,爲了可維護性,咱們將環境配置信息和應用編排文件進行了分離。

WP_IMAGE=wordpress:5.1.1-php7.1-fpm-alpine
WP_DB_PREFIX=wp
WP_HOST=wp

NGX_IMAGE=nginx:1.15.10-alpine
NGX_DOMAINS=wp.lab.com,wp.lab.io

DB_IMAGE=mariadb:10.3.14
DB_HOST=wp-db
DB_NAME=wordpress
DB_USER=wordpress
DB_PASS=wordpress
DB_ROOT_PASS=soulteary
複製代碼

將上面的文件保存爲 .env 後,咱們能夠開始啓動應用了。

啓動完整的應用

在啓動應用以前,咱們將剛剛修改的編排文件進行彙總。

version: '3'

services:

  wp:
    image: ${WP_IMAGE}
    restart: always
    container_name: ${WP_HOST}
    networks:
      - traefik
    environment:
        WORDPRESS_DB_HOST: ${DB_HOST}
        WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
        WORDPRESS_DB_NAME: ${DB_NAME}
        WORDPRESS_DB_USER: ${DB_USER}
        WORDPRESS_DB_PASSWORD: ${DB_PASS}
    volumes:
      - ./wordpress:/var/www/html

  mariadb:
    image: ${DB_IMAGE}
    restart: always
    container_name: ${DB_HOST}
    networks:
      - traefik
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
    volumes:
      - ./data:/var/lib/mysql

  nginx:
    image: ${NGX_IMAGE}
    restart: always
    networks:
      - traefik
    expose:
      - 80
    volumes:
      - ./conf:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
      - ./wordpress:/var/www/html
    depends_on:
      - wp
    labels:
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:${NGX_DOMAINS}"
      - "traefik.frontend.entryPoints=https,http"

networks:
  traefik:
    external: true
複製代碼

將文件保存爲 docker-compose.yml 後,咱們使用 docker-compose up 啓動應用,驗證應用是否正常。

當你看到下面的日誌時,你的應用就能夠進行訪問啦。

wp-db      | 2019-04-07  3:42:58 0 [Note] Server socket created on IP: '::'.
wp-db      | 2019-04-07  3:42:58 0 [Warning] 'proxies_priv' entry '@% root@2ed5be12f731' ignored in --skip-name-resolve mode.
wp-db      | 2019-04-07  3:42:58 0 [Note] Reading of all Master_info entries succeded
wp-db      | 2019-04-07  3:42:58 0 [Note] Added new Master_info '' to hash table
wp-db      | 2019-04-07  3:42:58 0 [Note] mysqld: ready for connections.
wp-db      | Version: '10.3.14-MariaDB-1:10.3.14+maria~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
wp         | [07-Apr-2019 03:42:59] NOTICE: fpm is running, pid 1
wp         | [07-Apr-2019 03:42:59] NOTICE: ready to handle connections
複製代碼

依舊是使用瀏覽器訪問剛剛 .env 中配置的域名,依舊是熟悉的操做,填寫信息,進行著名的「三分鐘」安裝,以後,即是一個新的站點誕生啦。

久違的 WordPress Dashboard

一些額外的小技巧

咱們使用 Compose 進行應用啓動的時候,若是是第一次調試,建議執行:

docker-compose up
複製代碼

由於能夠在終端中直接看到應用的實際運行日誌,若是出錯,能夠按下 CTRL+C 組合鍵,中斷執行,返回調試。

當你的應用徹底就緒以後,咱們須要長期穩定的運行這個服務的時候,再使用 Compose 的時候,則能夠添加一個 -d 參數,讓應用以 daemon 模式執行。

docker-compose up -d
複製代碼

這時,應用會乖乖的靜默在後臺執行,不會向終端輸出任何有價值的信息,若是應用異常,咱們須要調試,想看到應用日誌該怎麼處理呢?執行下面的命令就能夠了。

docker-compose logs -f
複製代碼

若是發現應用執行出錯,使用 docker-compose down 結束應用運行後,調整編排配置文件,從新使用不帶參數的的 docker-compose up 啓動應用,待應用徹底就緒後,再添加 daemon 參數就能夠了。

最後

感謝各位持續關注、鼓勵我寫做的同窗。是大家的關注讓我能夠在寫做過程當中沒必要重複贅述一堆內容,成文變的高效起來。

常見的 WordPress 多見於部署於線上,須要依賴 MySQLMariadb運行,不適合「隨身攜帶」、或者低配置機器運行。

下一篇內容將聊聊 「如何打造隨身攜帶的 WordPress」。


我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。

在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索