用OSS数据卷实现wordpress附件共享

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

打开数据卷管理界面,点击右上角”创建“,创建界面如下:
用OSS数据卷实现wordpress附件共享

  • 数据卷名:数据卷的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里就能看到上传的附件了。是不是很简单?快来试试吧!

上一篇:云计算设计模式(七)——事件获取模式


下一篇:云计算设计模式(十一)——健康端点监控模式