Deploy WordPress with Docker and Traefik 2

一年半前我写了一篇使用Docker和Traefik来搭建WordPress的文章。现在回过头看里面的一些信息难免有些过时。想着借Traefik 2新版本的东风再写一篇如何用Traefik 2来部署WordPress,这次要加上SSL了。

从本篇文章开始我不会再重复性地复制粘贴Traefik的配置文件。我把默认的Traefik配置放在了这里。各位请自取

视频已经更新,请点击阅读全文查看视频。

就让我先贴上WordPress的docker-compose.yml文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: '3.7'

services:
db:
image: mariadb
container_name: wp-db
volumes:
- db-data:/var/lib/mysql
networks:
- default
restart: always
environment:
MYSQL_ROOT_PASSWORD: supersecretpassword
MYSQL_DATABASE: db
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpassword

wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: db
WORDPRESS_DB_USER: dbuser
WORDPRESS_DB_PASSWORD: dbpassword
volumes:
- ./wp-data:/var/www/html/wp-content
networks:
- proxy
- default
restart: always
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.wordpress-secure.entrypoints=websecure"
- "traefik.http.routers.wordpress-secure.rule=Host(`blog.yourdomain`)"
- "traefik.http.routers.wordpress-secure.service=wordpress-service"
- "traefik.http.services.wordpress-service.loadbalancer.server.port=80"

volumes:
db-data:
name: db-data
networks:
proxy:
external: true

DB

Image:

WordPress可以使用的database选择有两个,要么MySQL:5.7 ,要么MariaDB。因为MySQL新版本的密码验证方法做了改变,因此如果想要使用MySQL新版本的话需要手动添加一个command^1。command如下

1
2
image: mysql:8
command: '--default-authentication-plugin=mysql_native_password'

我就不费这个事直接用MariaDB好了。

Service : Volume

我在这里创建了一个named volume叫db-data[^2]。这样我们database里面的数据不会因为WordPress版本升级而发生改变,即使是container被移除的时候数据库也不会被删除。

Network:

请注意我在这里只加入了default这一个network,docker会根据文件夹的名称来创建一个新的default network,比如说如果我的文件夹叫~/wordpress,那么新创建的network的名字就是wordpress_default。我这样的写法是把WordPress的database和其他的container分离开来,只有WordPress这个container才能接触到这个database。

Environment

这个就是简单的设置一下数据库名字,用户名和密码,各位可以随自己喜好随意设置。

切记:请不要在production的环境使用如此简单的用户名和密码

Service : WordPress

depends_on:

WordPress会在db这个service运行之后才运行。在停止containers的时候也会先停止WordPress然后再停止db

Image:

这里我选择用WordPress最新的官方image

Environment

数据库的入口就是db这个service的3306端口,其他的数据库名字,用户名密码等跟上面的设置一致即可。

Volumes

我这里把WordPress这个container里面html(也就是网站内容的文件夹)挂载了主机下的./wp-data,这样做的好处是我可以随时修改这个文件夹下面的文件,比如说上传图片,管理插件和皮肤等。有的时候会遇到某个插件更新之后整个网站就down了,这个时候只需要登录到服务器把对应的插件删掉就可以了。

Network

我在这里让WordPress的container在两个Network里面。其中的一个是proxy,这是为了Traefik可以找到这个container;另外一个是default。这是为了让WordPress可以接触到wordpress_default这个network里面的数据库。

Label

这里就是有意思的地方了。根据官方对于Docker Service的定义

  1. If a label defines a router (e.g. through a router Rule) and a label defines a service (e.g. implicitly through a loadbalancer server port value), but the router does not specify any service, then that service is automatically assigned to the router.
  2. If a label defines a router (e.g. through a router Rule) but no service is defined, then a service is automatically created and assigned to the router.

换成人话就是

  1. 如果用户不想在router里连接service,但是却定义了service(比如说通过定义负载军和到服务器的端口),那么这个service会自动被分配给这个router。
  2. 如果用户既不想在router里连接service,又不想定义任何的service,那么service会自动生成并分配给这个Router。

说白了就是咱们其实可以偷懒只定义一个hostname,其他的就交给Traefik就行了。

有的时候官方文档写的又绕又细,真是让人头晕😵

一切就绪之后,我们只需要docker-compose up -d就可以完成WordPress的部署。

感谢收看,希望本文对您有所帮助。

[^2]: 请注意我们必须定义这个named volume。我这里也手动指定了volume的名字,不然的话自动生成的volume名字前会添加文件夹名称,比如说wordpress_db-data