为什么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 大会上同与会者进行互动,一同讨论容器和容器平台。我们与不同的客户讨论了其在容器化进程中的不同阶段所遇到的问题......
1860 0
|
关系型数据库 Linux Docker
学习docker on windows (1): 为什么要使用docker
为什么要用Docker? 如果我们想使用某种pc软件, 那么在互联网上查找并安装软件的流程大致如下图: 那么这就有几个问题要弄清楚: 从哪里获得软件 App Store Linux的包管理 从某些网站直接下载 软件是否提供了相关信息和数据 例如流行度, 下载次数, 存在的bug, 上次的更新时间等等.
1333 0
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
运维 测试技术 开发者
《循序渐进学Docker》——1.3 为什么使用Docker
本节书摘来自华章出版社《循序渐进学Docker》一书中的第1章,第1.3节,作者李金榜 尹烨 刘天斯 陈纯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.3 为什么使用Docker 当深入了解Docker后,你想在公司或部门推广Docker,就需要给大家讲明白为什么要使用Docker。
3600 0
|
11天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
4天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
26 5
|
5天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
5天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
15 1
|
11天前
|
JavaScript 开发者 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
下一篇
无影云桌面