为什么Docker还不够

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文讲的是为什么Docker还不够,【编者的话】使用Docker和Delphix我们研究了一个简单快速备份生产应用的流程,对各种应用都普遍适用的流程。
本文讲的是为什么Docker还不够 【编者的话】使用Docker和Delphix我们研究了一个简单快速备份生产应用的流程,对各种应用都普遍适用的流程。

测试生产应用上的改动是艰巨的。这是因为复制是一项非常繁琐且缓慢的流程。通常的复制应用的流程是快照备份/恢复还原一个虚拟机,压缩、远程复制、解压文件,备份、还原数据库和其他可能需要通过IT执行的步骤。这个问题与数据驱动的应用混合在一起,导致需要更加频繁备份应用,以避免出现构建过旧测试状态的应用。

测试生产环境的应用看起来是不合理,但是当时间和人力紧张时,这样需求就会产生。使用Docker和Delphix,我们实践了一种简单快速的复制生产应用的处理流程,这流程通常适用于大多数的各种应用,例如:

对于我们实践,Chris Kast、Dan Tehranian、Rahul Nair、Srini Dandu和我改进了缺陷跟踪工具 JIRA 的备份流程,

概述

一个常用的JIRA安装包含三部分: PostgreSQL 数据库、JIRA_HOME目录、JIRA二进制文件。大部分的bug数据存储在数据库中,而一些bug的元数据像截图附件则是存储在JIRA_HOME目录中,还有初始化的配置文件也在该目录下。备份JIRA大体需要两步:
  1. 建立具有jira用户和必须的二进制文件的运行环境
  2. 复制数据源和相关的配置文件

这需要耗时数小时。

解决方案概述

01.png

我们使用Docker和Delphix可以在几分钟内提供一个生成环境备份的JIRA。像升级测试这样艰巨的任务将会变得极其容易和可靠。除了备份,这二者结合使用的技术使我们能具有更新、快照和回滚每一个JIRA应用的能力。

Docker和数据

Docker 是一个令人称奇的工具,它面向开发者封装了友好接口的 Linx Containers(LXC) 和配置管理。它允许开发加快构建出包含所有依赖的一致运行时环境,所以应用只需在上面运行即可……而且应用还很快。所有容器共享同一个操作系统内核,并且新的容器能够在一秒内创建。简单的 docker run jira 命令能构建出一个干净的JIRA测试应用的基本环境。但是一个空白的JIRA实例有多用呢?你需要真实的数据来验证应用运行时所期望的行为,并且覆盖生成环境中的边界情况,正是这些情况经常会导致一次失败的更新或者升级。

换句话说,在干净的环境中你无法测试覆盖到任何问题。
Chris想在测试实例中验证他的改动,为了这个目的他需要一个有真实数据的类生产环境。

持久化存储是对于Docker开发者来说是一个活跃的区域。Docker数据既可以是私有的(存在容器内),也可以是共享的(存在主机上)。私有数据存在于 Docker统一文件系统 。Docker存储的底层抽象是基于分层的,它有好多个实现例如vfs(基于目录的实现,创建一个子层次相当于创建一个子目录并且深度拷贝父目录),btrfs(使用快照来实现分层的文件系统)。关于底层实现的一个很好的概述,参考 该链接
docker-filesystems-multilayer.png

我们想在容器间共享两个数据源,并且保持与生产环境的同步。我们采用直接解决问题的方法,建立负责保持JIRA_HOME目录和PostgreSQL数据同步的容器,但是即使如此,Docker没有与其他测试容器共享数据的概念,像每一个容器获得各自进行读写的数据备份。

Delphix就是为这个而生的。

Delphix-Docker工作流

使用Delphix,我们把生产环境的PostgreSQL数据库和JIRA_HOME目录都通过拉取数据方式连接到Delphix引擎。我们然后将这些数据源分区为新主机上的虚拟数据库(VDB)和虚拟文件(vFiles)。使用我们的关联工具套件,我们自动化构建了一个JIRA容器,而且配置变化跟这些紧密结合在一些。

耗时从小时到分钟

单独使用Delphix界面即可将耗时数小时的备份流程降至仅仅3分钟,而且其中两分钟是在等待JIAR应用启动!开发人员需要做的是使用Delphix界面提供VDB(可以在任何网络上通过JDBC url访问的主机上),并且提供JIRA_HOME vFiles给Docker主机。

想知道我们如何做到的和实践过程中的问题

工具箱内部细节

大多数处理流程都是通过使用自定义的数据平台工具箱来实现自动化的。最终的处理流程如下:
  1. 通过Delphix界面工具提供PostgreSQL虚拟数据库
  2. 通过Delphix界面工具提供JIRA_HOME目录的虚拟文件(vFiles)给Docker主机
  3. 通过工具套件的钩子自动配置虚拟JIRA_HOME的变化
    1. 在dbconfig.xml文件中更新JDBC连接,数据库名字,用户和虚拟数据库的密码
    2. 删除.jira_home.lock文件
  4. 运行Docker容器(通过工具箱钩子自动运行)
    1. 挂载vFiles到容器中作为JIRA_HOME目录

使用的Dockerfile和docker 运行命令请参考附录。

问题1:NFS和Docker后台程序

在名副其实的文章《 NFS shares and volumes don’t mix 》,我们发现一个问题:Docker后台程序没有注册新建的NFS挂载点,在容器中只有一个空的挂载点。一个解决方法是重启Docker后台程序,强制解析已经存在的挂载点。然而,很幸运的是我们工作的CentOS上使用的是systemd(组成Linux系统的一个基本模块组件),当启动Docker服务时候有个MountFlag可选。我们可以使MountFlag=private来解决该问题。
MountFlag选项控制Docker挂载点相对于全部挂载空间的可见性(更多信息参见 这里 ),但是通常很难找到描述这个标志的信息。

问题2:NFS和Docker权限

我们遇到在容器中挂载时的权限问题。使用Docker的特权模式,会开放很多内核功能和设备驱动给容器访问,我们在底层设备映射器上绕过这个问题(其他底层存储实现可能实现方式不同)。是的,我们在特权模式下失去了一些优雅的安全限制,但是它在测试和开发环境是完全可以的。

附录

Dockerfile

FROM durdn/atlassian-base
MAINTAINER Coen Hyde <coen.hyde@gmail.com>
ENV JIRA_VERSION 6.3.15
RUN curl -Lks http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-${JIRA_VERSION}.tar.gz -o /root/jira.tar.gz
RUN /usr/sbin/useradd –create-home –home-dir /opt/jira –groups atlassian –shell /bin/bash jira
RUN tar zxf /root/jira.tar.gz –strip=1 -C /opt/jira
RUN chown -R jira:jira /opt/jira
RUN echo “jira.home = /opt/atlassian-home” > /opt/jira/atlassian-jira/WEB-INF/classes/jira-application.properties
WORKDIR /opt/jira
EXPOSE 8080
USER jira
CMD ["/opt/jira/bin/start-jira.sh -fg"]

Docker Command

docker run –privileged=true -p ${PORT}:8080 -v ${vJIRA_HOME}:/opt/atlassian-home jira/jira


原文链接:Why Docker Is Not Enough(翻译:姜俊厚)

原文发布时间为: 2016-06-05 
本文作者:whole 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:为什么Docker还不够
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
安全 虚拟化 Docker
为什么要使用 Docker ,5问5答帮你理清思路!
上周,Docker 团队有幸在 Vmworld 大会上同与会者进行互动,一同讨论容器和容器平台。我们与不同的客户讨论了其在容器化进程中的不同阶段所遇到的问题......
1853 0
|
关系型数据库 Linux Docker
学习docker on windows (1): 为什么要使用docker
为什么要用Docker? 如果我们想使用某种pc软件, 那么在互联网上查找并安装软件的流程大致如下图: 那么这就有几个问题要弄清楚: 从哪里获得软件 App Store Linux的包管理 从某些网站直接下载 软件是否提供了相关信息和数据 例如流行度, 下载次数, 存在的bug, 上次的更新时间等等.
1330 0
|
运维 测试技术 开发者
《循序渐进学Docker》——1.3 为什么使用Docker
本节书摘来自华章出版社《循序渐进学Docker》一书中的第1章,第1.3节,作者李金榜 尹烨 刘天斯 陈纯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.3 为什么使用Docker 当深入了解Docker后,你想在公司或部门推广Docker,就需要给大家讲明白为什么要使用Docker。
3587 0
|
17天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
14天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
192 69
|
2天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
15天前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
10天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
29 4
|
8天前
|
Kubernetes Linux 开发者
深入探索Docker容器化技术的奥秘
深入探索Docker容器化技术的奥秘
16 1
下一篇
无影云桌面