转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/128.html?1455808640

当听到很多人在说Docker是多么多么的棒,很多新潮的孩子都在使用它时,我决定在我的开发环境上也来尝试下。在下面的这篇文章中,我将讲解在Mac OS X怎样建立Postgres,Elasticsearch和Redis。

什么是Docker

Docker用轻量容器把一个APP从它运行的OS中隔离开。它把APP放入到一个孤立的盒子中,对外只呈现需要使用的文件夹和端口。

这样,基于建立和使用APP的容器是可重用,共享的。目前,在Docker集中已经存在了15,000种以上的容器。Docker就像一个商店的存储库,当你需要建立一个你想要的APP时,你首先去挑出它,然后把它下载下来打开即可。

在OS X上安装Docker

Docker不是天生就能运行在OS X上的,它需要一个包含LINUX容器的Linux内核。因此,当你想像我一样要安装OS X时,你将需要一套虚拟器。

不要使用boot2docker

当试图让docker工作时,我发现“非常容易”安装。这将使用一个称之为boot2docker的工具,该工具是一个像virtualBox的虚拟机上的瘦包装。

我马上发现,这个工具有一些严重的问题,例如:在一个稳定状态下将会终止任何获取Docker的进程。我不想在这方面浪费太多的体力和脑细胞,所以我继续寻找了一个可替代的解决方案。

使用Vargrant

自从Vagrant的1.6版本之后,已经集成了支持Docker的配套组件。Vargrant是一种类似于VirtualBox的虚拟软件,它采用一种声明Ruby DSL的方法来描述你的环境。

我非常喜欢这种定义虚拟环境的方式,因为当你的环境发生故障时,你可以记录下来当时的信息,再次开始使用,而不用遗漏下大量的类似环境变量的信息。
安装Stuff

首先,让我们浏览下我们需要安装的各种事宜。

Homebrew安装:

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"#p#分页标题#e#

Cask安装:

brew tap caskroom/homebrew-cask brew install brew-cask

Vagrant 和 VirtualBox安装:

brew cask install virtualbox brew cask install vagrant

Vagrant文件

一个vagrant文件来描述一个使用Ruby DSL虚拟机环境的需求。当描述Docker容器时,Vagrant使每一个容器都好像在使用自己独有的虚拟机一样。事实上这是一个假象,因为每一个Docker容器实际上是允许在各种的代理虚拟机上的。

因此,两个vagrant文件是非常必须的,一个文件是用来定义代理虚拟机(Provisioner),另外一个文件是用来定义Docker容器的(Providers)。
代理虚拟Vagrant文件

代理虚拟Vagrant文件被叫做:Vagrantfile.proxy

VAGRANTFILE_API_VERSION = "2"Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|  config.vm.box = "hashicorp/precise64" config.vm.provision "docker" config.vm.provision "shell", inline:  "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"  config.vm.network :forwarded_port, guest: 6379, host: 6379 config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 9200, host: 9200end

这使用hashicorp/precise64 Ubuntu 12.04的64位来处理代理虚拟机。它也提供Docker和一些神奇的shell命令来让Docker工作。

最后的事情就是设置转发端口了。它使用config.vm.network来为Redis, Elasticsearch 和Postgres来进行配置,用代理虚拟机映射到OS X。#p#分页标题#e#

Docker 容器的 Vagrant 文件

这是Vagrantfile的主要内容:

VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|  config.vm.define "redis" do |v|  v.vm.provider "docker" do |d|   d.image = "dockerfile/redis"   d.volumes = ["/var/docker/redis:/data"]   d.ports = ["6379:6379"]   d.vagrant_vagrantfile = "./Vagrantfile.proxy"  end end  config.vm.define "elasticsearch" do |v|  v.vm.provider "docker" do |d|   d.image = "dockerfile/elasticsearch"   d.ports = ["9200:9200"]   d.vagrant_vagrantfile = "./Vagrantfile.proxy"  end end  config.vm.define "postgres" do |v|  v.vm.provider "docker" do |d|   d.image = "paintedfox/postgresql"   d.volumes = ["/var/docker/postgresql:/data"]   d.ports = ["5432:5432"]   d.env = {    USER: "root",    PASS: "abcdEF123456",    DB: "root"   }   d.vagrant_vagrantfile = "./Vagrantfile.proxy"  end endend

这个文件定义了三个容器: Redis , Elasticsearch, 和 Postgres 带有图片 dockerfile/redis , dockerfile/elasticsearch 和 paintedfox/postgresql 。

每个文件定义 vagrant_vagrantfile 作为 proxy VM 文件,这使得它们在同一个 proxy 虚拟机上运行。

Redis 和 Postgres 的 volumes 定义是为了它们的信息可以存储在 proxy VM 上,而不是在容器中。这也是容器可以更删除或升级而数据不会丢失的原因。下一步是映射这些文件从proxy VM 到 OS X ,但是没必要让其运转着。

每个容器上的 ports 定义哪个端口转到 proxy VM 。这些需要匹配 proxy VM 到 OS X 的端口。

Postgres 容器也定义了需要设置它的服务器的环境变量。这些可以用来在OS X 里设置缺省的Postgres 服务器,通过设置环境变量 PGHOST=localhost PGUSER=root PGPASSWORD=abcdEF123456 来实现。

使用Vagrant工作

在你的Vagrant文件相同的目录内,你可以运行:

vagrant up --provider=docker#p#分页标题#e#

第一次运行这个时,Vagrant将下载然后启动proxy VM,然后下载并启动Docker容器。在这些初始化下载之后每次运行Vagrant都将重复使用现有的图片。

可以查看Docker容器的状态:

vagrant status

应该输出一些东西类似:

代码如下:

Current machine states:
 
redis                     running (docker)  
elasticsearch             running (docker)  
db                        running (docker)

要测试Docker容器是否正确运行,可以使用 Redis 和 Postgres 客户端, 和 curl for Elasticsearch。只需要检查redis-cli和psql到服务器的连接,和curl http://localhost:9200响应。

如果需要连接到proxy VM(非常有助于调试),运行vagrant global-status,这将列出所有VM,包括proxy。然后调用vagrant ssh <ID>,ID为proxy的ID。建议不要手动改变这个proxy VM,使用一个Chef(或类似的)脚本,这样改变可以更容易的测试和分布。

性能

使用虚拟化时,第一个问题总是会问“性能的影响有多少?”。要找出性能影响是多么的糟糕,我的同事和我都做了一个Postgres,在相同的硬件上做了Elasticsearch 和 Redis 加强测试。唯一的区别是一个测试有本机安装的软件而另一个有Docker自定义容器。带有本机软件的运行了2分钟,而带有容器的运行了3分钟。

这个性能影响并不像我想象的那样小,甚至可能会更糟。即使这样,我将继续使用Docker做开发,但并不推荐大家将它作为所有开发环境问题的灵丹妙药。

#p#分页标题#e#
注意:一些其他使用Vagrant 和 Docker的限制在 这里 列出
总结

我还看不到"Vagrant with Docker"的路在哪里。不过,在看过可能的情况后,我不禁思考它可以用于什么其他地方。另外,它是我遇到过的最好玩的虚拟化,乐趣就在于编程。

在Mac OS上安装Vagrant和Docker的教程的更多相关文章

  1. mac os 上安装mysqldb血泪史

    昨天下午在mac上安装mysql-python一直未遂今天查了很多资料终于成功了 最后还是在stackoverflow点击打开链接(好网站啊,一般有什么技术问题在这都能找到)上找到了答案,废话少数: ...

  2. Mac OS 下安装 Vagrant

    Vagrant是一款用来构建虚拟开发环境的工具,它其实算是一个跨平台的虚拟机管理工具 1 安装 1.1 安装Vagrant 下载好pkg文件后,下一步安装即可 1.2 安装Virtualbox Vag ...

  3. Mac OS 上安装 PostgreSQL

    PostgreSQL Database Download https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 下载 ...

  4. 在 Mac OS 上使用 TypeScript 编写 ASP.NET Core 1.0 应用

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  5. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  6. 在 Mac OS 上创建并运行 ASP.NET Core 1.0 网站

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  7. Mac OS 上设置 JAVA_HOME

    Mac OS 上设置 JAVA_HOME 原文链接:http://han.guokai.blog.163.com/blog/static/136718271201301183938165/ 由于需要, ...

  8. 在 Mac OS 上编译 FFmpeg

    本文转自:在 Mac OS 上编译 FFmpeg | www.samirchen.com 安装 Xcode 和 Command Line Tools 从 App Store 上安装 Xcode,并确保 ...

  9. wget Mac OS 下安装

    wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理. 下面介绍如何在Mac OS 下安装Wget 下载最新版的 ...

随机推荐

  1. js中的单体对象

  2. swift 获取控件位置 大小

    var SearchBtn = uibutton() SearchBtn.frame.origin.x   //获取坐标x SearchBtn.frame.origin.Y  // 获取坐标Y Sea ...

  3. afterTextChanged() callback being called without the text being actually changed

    afterTextChanged() callback being called without the text being actually changed up vote8down votefa ...

  4. Looping Techniques

    [Looping Techniques] 1.When looping through dictionaries, the key and corresponding value can be ret ...

  5. Hosting static website on AWS

    http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html#root-d ...

  6. [原创]PCB知识补充

    近期又要使用Altium进行PCB板的绘制,算起来从大学课上第一次接触Protel99SE到现在已经算是半个熟练工了.不过现在想来还是能回忆起第一次使用的情景,对着一幅简单的原理图使用着自动连线的功能 ...

  7. html file控件选择文件后立即预览 js实现

    //上传图片后立即预览 file对象,图片容器id function showImg(fileObj,imgId) { var file=fileObj.files[0]; var r = new F ...

  8. linux系统中scp命令的用法(Permission denied排错二例)

    原文链接: 这里需要注意,当往远程主机拷文件时,必须当前用户对远程主机的对应目录具有写权限 http://www.360doc.com/content/13/0929/13/6496277_31784 ...

  9. 30、准确计算CoreText高度的方法

    http://ios-iphone.diandian.com/post/2012-03-29/18389515 - (int)getAttributedStringHeightWithString:( ...

  10. java.lang.OutOfMemoryError: PermGen space及其解决方法(转载)

    java.lang.OutOfMemoryError: PermGen space及其解决方法 分类: java2007-09-11 12:34 162242人阅读 评论(51) 收藏 举报 gene ...