docker容器的兴起,让wordpress的部署变得极为容易,“一分钟部署wordpress”的教程也随处可见。以阿里云容器服务为例,利用一下编排模板,可以一键部署wordpress(详细教程见这里)。
web:
image: registry.aliyuncs.com/acs-sample/wordpress:4.3
ports:
- '80'
environment:
WORDPRESS_AUTH_KEY: changeme
WORDPRESS_SECURE_AUTH_KEY: changeme
WORDPRESS_LOGGED_IN_KEY: changeme
WORDPRESS_NONCE_KEY: changeme
WORDPRESS_AUTH_SALT: changeme
WORDPRESS_SECURE_AUTH_SALT: changeme
WORDPRESS_LOGGED_IN_SALT: changeme
WORDPRESS_NONCE_SALT: changeme
WORDPRESS_NONCE_AA: changeme
restart: always
links:
- 'db:mysql'
labels:
aliyun.logs: /var/log
aliyun.probe.url: http://container/license.txt
aliyun.probe.initial_delay_seconds: '10'
aliyun.routing.port_80: http://wordpress
aliyun.scale: '3'
db:
image: registry.aliyuncs.com/acs-sample/mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
restart: always
labels:
aliyun.logs: /var/log/mysql
在这个编排模板中,会部署一个mysql容器,三个wordpress容器(aliyun.scale: '3'是阿里云容器服务的扩展标签,指定容器数量),wordpress容器通过link访问mysql。更爽的是,阿里云容器服务自带负载均衡功能,通过“aliyun.routing.port_80: http://wordpress”这个标签,实现三个wordpress容器的负载均衡(详细说明点这里)。
乍一看很完美,部署简单,功能齐全。但其实这里有个致命的缺陷。wordpress上传的附件是保存在本地磁盘上的,不同容器之间不能共享。当请求被分配到其他容器时,附件就打不开了。
解决办法有很多,比如添加OSS插件,把附件传到oss上。这里介绍一个更简单的办法——利用阿里云容器服务的OSS数据卷(oss volume),无需改动任何代码。
数据卷(volume)简介
Docker的特性,决定了容器本身是非持久化的,容器被删除后其中的数据也一并被删除了。Docker提供数据卷(Volume),通过挂载宿主机上的目录来实现持久存储。
但宿主机上的数据卷有很大的局限性
- 容器在机器间迁移时,数据无法迁移
- 不同机器之间不能共享数据卷
为了解决这些问题,阿里云容器服务提供第三方数据卷,将各种云存储(比如oss)包装成数据卷,可以直接挂载在容器上,不同容器间可以共享,并在容器重启、迁移时自动重新挂载。OSS数据卷的说明见这里
创建oss数据卷
oss数据卷基于ossfs,ossfs是阿里云官方提供的基于FUSE的文件系统,项目主页见https://github.com/aliyun/ossfs。
打开数据卷管理界面,点击右上角”创建“,创建界面如下:
- 数据卷名:数据卷的id,在集群内唯一。
- AccessKeyId、AccessKeySecret:访问OSS所需的AK,可以从oss控制台获取。
- 访问域名:如果bucket跟ECS在同一个区(Region),选内网域名;否则选外网域名
- 文件缓存:如果需要在不同机器间同步同一个文件的修改(比如在A机器中修改文件,在B机器中读取修改后的内容),请关闭文件缓存。但请注意,关闭文件缓存将导致ls文件夹变得很缓慢,尤其是同一个文件夹下文件比较多时。没有上述需求时,请打开文件缓存,提高ls的速度。
使用oss数据卷
wordpress的附件,默认存放在/var/www/html/wp-content/uploads中,我们只需将oss数据卷映射到该目录,不同wordpress容器之间就共享同一个oss bucket了。新的编排模板如下,假设oss数据卷的名字是wp_upload
web:
image: registry.aliyuncs.com/acs-sample/wordpress:4.3
ports:
- '80'
volumes:
- 'wp_upload:/var/www/html/wp-content/uploads'
environment:
WORDPRESS_AUTH_KEY: changeme
WORDPRESS_SECURE_AUTH_KEY: changeme
WORDPRESS_LOGGED_IN_KEY: changeme
WORDPRESS_NONCE_KEY: changeme
WORDPRESS_AUTH_SALT: changeme
WORDPRESS_SECURE_AUTH_SALT: changeme
WORDPRESS_LOGGED_IN_SALT: changeme
WORDPRESS_NONCE_SALT: changeme
WORDPRESS_NONCE_AA: changeme
restart: always
links:
- 'db:mysql'
labels:
aliyun.logs: /var/log
aliyun.probe.url: http://container/license.txt
aliyun.probe.initial_delay_seconds: '10'
aliyun.routing.port_80: http://wordpress
aliyun.scale: '3'
db:
image: registry.aliyuncs.com/acs-sample/mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
restart: always
labels:
aliyun.logs: /var/log/mysql
唯一的变化是添加了
volumes:
- 'wp_upload:/var/www/html/wp-content/uploads'
重新部署,然后打开wordpress,上传附件,oss bucket里就能看到上传的附件了。是不是很简单?快来试试吧!