当Docker遇到数据库:在阿里云容器服务中使用RDS

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker与持久化服务 最近一段时间以来,微服务架构和Docker成为了技术社区的“网红”。其背后的原因是将微服务与Docker的结合在一起对现有的软件生命周期从架构设计、开发测试到运维迭代构成了一种“颠覆性”的力量:微服务鼓励开发者将整个软件解构为较小的功能组件;每个组件能够独立开发、运维、伸

Docker与持久化服务

最近一段时间以来,微服务架构和Docker成为了技术社区的“网红”。其背后的原因是将微服务与Docker的结合在一起对现有的软件生命周期从架构设计、开发测试到运维迭代构成了一种“颠覆性”的力量:微服务鼓励开发者将整个软件解构为较小的功能组件;每个组件能够独立开发、运维、伸缩和容错;组件之间通过标准的服务接口进行通信,而组件可以选择最适合的技术栈来实现。而容器技术进一步拓展了这种解耦性,它能够将软件与其部署环境分离,利用容器敏捷和可移植的使得容器化的组件可以更快地进行创建,在软件流水线不同阶段使用完全相同的镜像部署,不但能够更好的确保软件质量并且更易于维护。

大家在实践中会发现:Docker容器非常适用于无状态的应用,比如Web应用,计算任务等等;利用容器技术,这些应用可以弹性扩展,可以快速部署和回退;然而很多开发者遇到的一个重要的挑战就是:如何对待有状态的服务?这里是指服务本身需要持久化保存某些数据(即状态),不能随便丢弃这些数据。比如,数据库服务器、消息队列、文件存储等等。对于无状态应用,开发者可以像对待牛群(Cattle)那样,可以随时创建、抛弃或替换;而对于持久化服务,很多需要我们像爱护宠物(Pets)那样,精心调优,维护,备份恢复。

当然利用统一的技术解决不同类型工作负载的部署和运维是我们的理想,而且Docker在支持持久化服务的上面已经有了很大进步;比如利用Volume插件和分布式存储技术,Docker容器和它依赖的持久化数据可以更加简单的在不同宿主机节点上迁移。但是在容器环境中对持久化服务进行运维,依然还有很长的道路要走,需要服务的提供商针对容器化部署运维做出调整和简化,才能被社区所接受。

对于开发者而言,他们非常愿意在开发和测试环境中利用Docker容器来创建持久化服务,比如应用中所使用的MySQL数据库,Redis缓存等等。这样的好处是:可以快速构建开发环境,在开发团队中保持一致。然而在生产环境中,他们仍然希望引用外部独立部署的持久化服务,来保证服务质量,采用更加成熟的方式对持久化服务进行运维,比如使用阿里云关系数据库服务(RDS)。

是否有一种方法能够让应用在不同的环境中轻松切换来自不同实现的服务,而且保持行为一致?这样才能够平衡用户对开发和运维不同需求的矛盾。

在阿里云容器服务中,容器编排模板中不但支持容器的链接(Container linking),也非常方便的支持容器到外部服务的链接。这样我们可以在一个应用模板中,轻松地将MySQL容器替换为RDS实例的引用,无需修改任何应用代码。

使用容器Compose模板部署Ghost博客

我们将用之前介绍的Ghost博客应用来完成本次试验。

上文中,我们介绍了一个利用Ghost, MySQL的容器编排模板来部署一个高可用的Ghost博客集群。其Compose模板如下,

ghost: 
  image: registry.aliyuncs.com/acs-sample/ghost:0.7
  links: 
    - db:mysql 
  ports: 
    - "2368"
  environment:
    - GHOST_URL=http://blog.${ACS_DEFAULT_DOMAIN}
    - OSS_BUCKET=acs-sample-ghost
    - OSS_BUCKET=acs-sample-ghost
    - OSS_ACCESS_KEY_ID=***********
    - OSS_ACCESS_KEY_SECRET=***********
    - OSS_PREFIX=http://acs-sample-ghost.oss-cn-beijing.aliyuncs.com
    - OSS_ENDPOINT=http://oss-cn-beijing.aliyuncs.com
  labels:
    aliyun.routing.port_2368: 'http://blog'
    aliyun.scale: '3'
  restart: always 
db: 
  image: registry.aliyuncs.com/acs-sample/mysql:5.6
  environment: 
    - MYSQL_ROOT_PASSWORD=example 
    - MYSQL_DATABASE=ghost
    - MYSQL_USER=ghost
    - MYSQL_PASSWORD=ghost_db_password
  restart: always

注意:

  • 用户需要指定正确的OSS bucket和Access Key信息才能够利用,OSS提供的对象存储在不同的Ghost应用直接共享图片和上传的文件
  • 对于GHOST_URL环境变量需要和aliyun.routing标签定义的路由信息向匹配,除了上文提供的自定义域名的方式,用户还可以通过集群服务提供的二级域名来进行测试;访问地址格式如下,更多信息可参见帮助文档

    • <虚拟主机>.<集群ID>.<集群域名>.alicontainer.com

在Compose模板中,Ghost应用利用容器连接的方法引用MySQL容器提供的数据库服务。通过db:mysql定义的连接,Ghost容器中进程可以利用mysql作为host别名和引用db容器的环境变量,比如MYSQL_USERMYSQL_PASSWORD等,这样就可以实现与数据库的绑定。

使用RDS作为Ghost博客数据库

首先我们需要使用阿里云RDS创建一个MySQL数据库,或使用一个已有的RDS实例。

下图在北京域创建一个MySQL 5.6数据库,并选择与容器集群一致的网络类型(经典网络或VPC),这样使得北京域的部署的Docker应用可以通过内网访问RDS实例。
14530413302576

创建数据库用户“ghost”,数据库“blog”并授权。具体操作请参见RDS帮助文档

配置完成后,需要配置RDS对容器集群的访问白名单,创建一个白名单分组“acscluster”并把集群服务中所有ECS节点添加到列表中,这样就可以在集群中任何一个节点应用访问RDS实例了。

14530422529621
完成白名单配置之后,就可以从界面获得RDS的链接信息

14530424704791
现在我们就修改上文的Docker Compose模板来引用所创建的RDS实例了,修改结果如下

ghost: 
  image: registry.aliyuncs.com/acs-sample/ghost:0.7
  links: 
    - db:mysql 
  ports: 
    - "2368"
  environment:
    - GHOST_URL=http://blog.${ACS_DEFAULT_DOMAIN}
    - OSS_BUCKET=acs-sample-ghost
    - OSS_BUCKET=acs-sample-ghost
    - OSS_ACCESS_KEY_ID=***********
    - OSS_ACCESS_KEY_SECRET=***********
    - OSS_PREFIX=http://acs-sample-ghost.oss-cn-beijing.aliyuncs.com
    - OSS_ENDPOINT=http://oss-cn-beijing.aliyuncs.com
  labels:
    aliyun.routing.port_2368: 'http://blog'
    aliyun.scale: '3'
  restart: always 
db: 
  external: 
    host: rds******.mysql.rds.aliyuncs.com
    ports:
      - 3306
  environment: 
    - MYSQL_DATABASE=blog
    - MYSQL_USER=ghost
    - MYSQL_PASSWORD=***********

我们采用External来定义一个外部服务的引用,我们需要指定它的主机地址(host)和端口列表(ports),之后我们还是像原来的MySQL容器一样利用环境变量提供访问数据库的连接信息。这样当部署之后,容器服务可以让Ghost应用通过容器连接访问RDS实例,而其表现行为和连接MySQL容器完全一致,无需修改任何代码就可以让容器应用享受到专业化的数据服务了。这是不是很简单呢?:-)

注:用户需要根据实际情况确保db中host, MYSQL_PASSWORD等值与RDS配置保持一致

利用容器服务,我们可以方便的部署一个Compose模板, 详见上文,来创建一个利用RDS实现数据库访问的高可用Ghost集群。

访问容器应用中ghost服务提供的访问端点,会打开Ghost博客界面

14530435494315
一个崭新的博客就创建出来了!

14530441543678

总结

目前对持久化服务的容器化部署和运维依然是富有挑战性的工作。在现阶段,比较现实的方法是将成熟的云服务,比如阿里云RDS,MongoDB,Redis服务,和容器化应用结合在一起来简化使用并提高服务质量。

根据12-factor应用的建议:将应用逻辑和所依赖的服务解耦;将外部服务配置存储于环境变量中。这样可以方便地让应用在不同的部署间切换不同服务实现,无需改动一行代码。

之前的文章里,我们为您提供了一些建议,可以构建出符合12-factor原则的云原生容器应用,方便的通过容器链接建立对其他容器的绑定。而阿里云容器服务可以让容器应用统一地使用链接的方式访问容器或外部服务;这个能力可以让用户针对不同场景选择最合适的持久化服务实现。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 关系型数据库 MySQL
RDS MySQL 数据库运维简述
从运维的视角,汇总云数据库RDS MySQL使用的避坑指南。文章初版,维护更新,欢迎指点。
769 3
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
1月前
|
Oracle 关系型数据库 数据库
|
2月前
|
人工智能 运维 Kubernetes
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
269 2
阿里云容器服务ACK AI助手正式上线带来的便利性
|
1月前
|
存储 Linux 数据安全/隐私保护
如何在本地Docker中部署MinIO服务并实现远程访问管理界面
如何在本地Docker中部署MinIO服务并实现远程访问管理界面
200 0
|
1月前
|
Oracle 关系型数据库 数据库
如何利用 Docker 安装 Oracle 数据库
【2月更文挑战第14天】
93 0
|
1月前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
86 1
|
1月前
|
弹性计算 关系型数据库 MySQL
阿里云ECS使用docker搭建mysql服务
阿里云ECS使用docker搭建mysql服务
152 1
|
19天前
|
关系型数据库 MySQL 数据安全/隐私保护
使用docker快速搭建wordpress服务,并指定域名访问
通过以上步骤,你可以使用Docker快速搭建WordPress服务,并通过指定的域名进行访问。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
20 1

相关产品

  • 容器计算服务