本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)php
本文做者: 苏洋html
建立时间: 2019年04月07日 统计字数: 6261字 阅读时间: 13分钟阅读 本文连接: soulteary.com/2019/04/07/…前端
前一篇 内容介绍了如何使用官方镜像快速搭建 WordPress,可是官方默认是“胖容器”应用,接下来将聊聊一样基于容器搭建的其余选择:Nginx。演示如何改造应用为“瘦”容器应用。mysql
本文将花费十分钟左右,介绍如何在 Docker 容器中搭配 Traefik 使用 WordPress 和 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 的“同类”们将它进行替换。编程
1.15.10-alpine
5.1.1-php7.1-fpm-alpine
10.3.14
Traefik 的具体使用,能够参考以往的文章,好比:使用服务发现改善开发体验、更完善的 Docker + Traefik 使用方案 等,更多内容,能够翻看历史内容的标签,这里不过多赘述。浏览器
本文只须要关注编排文件中的 labels
和 networks
字段配置就足够啦。
对不一样容器服务的 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 前端”,那么这里须要进行适当的调整。
由于使用 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 。
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 便可。
将下面的内容保存为 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
中配置的域名,依旧是熟悉的操做,填写信息,进行著名的“三分钟”安装,以后,即是一个新的站点诞生啦。
咱们使用 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 多见于部署于线上,须要依赖 MySQL
、Mariadb
运行,不适合“随身携带”、或者低配置机器运行。
下一篇内容将聊聊 “如何打造随身携带的 WordPress”。
我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。
在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)