Moving to Docker(一)

本文迁移至Docker系列的第一篇,这个系列介绍了我所在的公司是怎么把基础设施从PaaS迁移到Docker上的。如果你对基础已经很了解了,可以直接看本文底部的几个技术专题。

上个月,我一直在折腾开发环境。这是我个人的经验和故事,关于如何在Docker上简化Rails项目的部署工作。

当我开始创建Touchware的时候,我还是个独立开发者。项目比较小,也不复杂,也不需要维护,甚至不需要部署到很多机器。经过去年一年的发展,我们成长为有10名员工的公司了,同样在增长的还有我们的服务端程序和API。

Step1 Heroku

虽然我们还是个小公司,但是我们还是需要让事情尽可能的便捷。当我们在寻找解决方案时,我们希望找到可以帮助我们减轻对硬件依赖负担的工具。由于我们主要开发RoR项目,而Heroku不仅对RoR有很好的支持,而且还提供常用的数据库(Postgres/Mongo/Redis等),于是我们就明智的使用了它。

Heroku有很好的技术支持和文档说明使得部署工作非常轻松。唯一的问题是,当你的公司还处于发展阶段,开销很多,而用Heroku也不是很划算。

Step2 Dokku

为了尝试并降低成本,我们决定试试Dokku,引用GitHub上的一句话来说,Dokku是迷你版本的Heroku。

Docker powered mini-Heroku in around 100 lines of Bash

我们在DigitalOcean上购买了很多台机器,都预装了Dokku。Dokku大多时候跟Heroku很像,但是当有的项目需要调整配置参数或者是需要特殊的依赖时,它就无能为力了。我们有一个应用,它需要对图片进行多次转换,这导致我们找不到一个适合版本的imagemagick运行在安装了Dokku的Docker容器内。尽管我们还有很多应用运行在Dokku上,但我们还是不得不迁移一些到Heroku。

Step3 Docker

几个月前,由于开发环境和生产环境的问题,几个项目需要重新调整,我决定使用Docker。Docker简单来说就是用于容器化应用,简化部署工作。由于一个Docker容器已经包含项目运行所需要的所有依赖,只要它能在你的笔记本上运行,就能在任何一个别的远程服务器的生产环境上运行,包括Amazon的EC2和DigitalOcean上的VPS。

Docker IMHO特别有意思的原因是:

  • 它促进了模块化和关注点的分离:你只需要去考虑应用的逻辑部分(负载均衡:1个容器;数据库:1个容器;web服务器:1个容器)
  • 在部署的配置上比较灵活:容器可以被部署在大量的HW上,也可以容易地重新部署在不同的服务器或者服务提供者上。
  • 它允许非常细粒度的优化应用的运行环境:由于你可以为你的容器自己创建镜像,就可以自己去配置环境。

它也有一些缺点:

  • 它的学习曲线非常的陡峭(这是从一个软件开发者的角度来看,而不是经验丰富的运维人员)。
  • 搭建环境不见得,尤其是还需要自己搭建一个私有的Registry。

在接下来的几篇文章中,将会介绍如何搭建一个半自动化的Docker部署系统。

  • 搭建一个私有Registry(翻译中)
  • 配置Rails项目的半自动化部署方案(翻译中)
时间: 2024-11-05 02:18:48

Moving to Docker(一)的相关文章

Moving to Docker(三)基于Docker的Rails自动化部署

这是本系列的第三篇,整个系列介绍了我们公司如何把基础框架从PaaS移植到Docker上. 第一篇:介绍了我们在接触Docker之前的探索过程. 第二篇:介绍了如何搭建一个内网安全的私有registry. 在这最后一篇,我们用一个真实的例子来介绍如何自动化整个部署过程. 基本的Rails应用 我们来进入主题并启动一个基本的Rails应用.在这个Demo中,我将使用Ruby 2.20 和Rails 4.11. 在终端中运行: $ rvm use 2.2.0 $ rails new  && cd

MacOS Docker 安装

使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装: $ brew cask install docker ==> Creating Caskroom at /usr/local/Caskroom ==> We'll set permissions properly so we won't need sudo in

enabel docker on minnowmax board

1.清空minnowmax kernel以后,从头编译的.config保存一份 2.make -c menuconfig linux-yocto保存新的.config 3.diff old_config new_config 得到配置段,添加到kernel配置中 4.在PC上跑docker时,载入了3个模块,一个是bridge,还有两个,找到这2个对应的kernel config 5.In general, however, the Yocto Project maintainers take

Docker学习总结之Docker与Vagrant之间的特点比较

以下内容均出自Vagrant作者(Mitchell Hashimoto)与Docker作者(Solomon Hykes)在stackoverflow上面一个问题讨论.在这个问题中,双方阐述了vagrant和docker的特点和使用范围,对于深入理解vagrant和docker很有意义,因此笔者翻译出来,以供大家讨论学习. Mitchell作为vagrant的作者,其在DevOps的世界里面沉浸多年,接触了很多类似docker的虚拟化软件.他目前接触了很多使用vagrant和docker的场景,所

Docker: How to configure Docker with devicemapper

Background: Device Mapper is a kernel-based framework that underpins many advancedvolume management technologies on Linux. Docker's devicemapper storage driverleverages the thin provisioning and snapshotting capabilities of this frameworkfor image an

Docker与Vagrant之间的特点比较

以下内容均出自Vagrant作者(Mitchell Hashimoto)与Docker作者(Solomon Hykes)在stackoverflow上面一个问题讨论.在这个问题中,双方阐述了vagrant和docker的特点和使用范围,对于深入理解vagrant和docker很有意义,因此笔者翻译出来,以供大家讨论学习. Mitchell作为vagrant的作者,其在DevOps的世界里面沉浸多年,接触了很多类似docker的虚拟化软件.他目前接触了很多使用vagrant和docker的场景,所

mesos无执行器启动docker

生成taskInfo task = mesos_pb2.TaskInfo() task_id = name task.task_id.value = task_id task.slave_id.value = offer.slave_id.value task.name = name task.data = "Hello from task {}!".format(task_id) cpus = task.resources.add() cpus.name = 'cpus' cpus.

我使用 Docker 部署 Celery 遇到的问题

问题1 - Sending due task 本机测试时没有问题的,但是在线上 docker 中,任务一直显示 "Sending due task".超时的任务是 Django ORM update 操作. 猜测 - 是否与其他 Celery 公用了 redis db? 其他 Celery 也使用了这个 redis db 作为 broker,有很多其他 Celery 的任务在队列中,轮不到我的任务.于是我将 redis db 设置为 13,但没有修复这个问题. 使用队列 那么我是否能够

Docker学习笔记——Mongo Dockerfile及容器运行

1.创建项目目录mongo,在目录下上传下载的Mongodb安装文件及mongo.conf配置文件,创建Dockerfile文件,项目结构如下: mongo - Dockerfile - mongo.conf - mongodb-linux-x86_64-3.4.9.tgz - data - logs Dockerfile内容如下: # mongo # SOURCE_IMAGE FROM centos # MAINTAINER_INFO MAINTAINER bluemooder [email