当前位置: > Linux服务器 > Docker >

深入浅出Docker(五):基于Fig搭建开发环境

时间:2014-12-30 14:21来源:linux.it.net.cn 作者:IT

1. 概述

在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间。而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰。在Docker技术未出现之前,我们可以使用Pupet、Chef、Ansible等配置管理工具把复杂的配置管理起来,这样的管理配置技术仍然是目前比较流行的方式之一。配置管理工具使用的都是自己的DSL语法定义,考虑到环境的复杂性,配置一套通用的开发环境需要针对各个系统定制,对于大部分开发环境这种维护成本仍然是很高的。Docker技术出现之后,系统的依赖问题得到了彻底的解决,我们可以通过镜像的方式简化环境的安装。结合Docker的开发部署工具Fig,我们可以使用fig.yml文件来定义所有的环境,一次定义,多处使用,简单而且高效。

1.1 打包的方式

Docker本省并不能创建一个真实的虚拟机,它只是基于Linux Kernel把额外的系统文件做了封装,并利用Linux Kernel相关的技术如Cgroup、Namespace隔离用户应用。应用Docker技术,团队之间通过共享Image或者Dockefile来复用开发环境。为了简化写Dockerfile的方式 ,Fig提供更加精简的DSL定义文件fig.yml,可以让新成员快速搭建开发环境并将精力投入到开发过程中去,而不是研究如何正确安装并配置诸如PostgreSQL之类的数据库。目前,软件开发需要的环境Image,大部分都可以在Docker Hub中搜索到,需要使用时直接下载就可以使用。

1.2 应用组合的方式

使用Docker之后,我们不再需要在本地机器安装所有的软件包。我们可以根据项目需要在Docker Hub上搜索相关软件的Image,然后使用Fig pull从Docker Hub上直接下载并由Fig调用Docker的Link命令把Image关联起来,这样所有应用都可以直接调用指定端口的服务,比如Mysql的3306端口提供数据库服务。开发者并不需要对Docker有太多的了解,只需要掌握常用的几条Fig命令就可以随时调试自己的环境。

1.3 环境共享的方式

Fig直接定义好了Image,我们不需要过多的关心容器或者镜像。在分享环境时,只需要把对应的Dockerfile和fig.yml文件分享给同事,他们就可以在自己的机器上运行并搭建出需要的环境,且不用再担心环境依赖带来的意外调试烦恼。团队成员在git clone项目代码后,就可以如下图一样使用一条命令启动自己的开发环境:

2. Fig安装指南

首先,我们需要安装Docker Engine,官方针对主流的系统提供了对应的安装手册。这里,我的开发机系统是一台MacBook Pro,所以我需要安装boot2docker来支持Docker。

接下来,我们就可以安装对应系统版本的Fig运行文件。比如在Mac OS或者在64位的Linux上安装Fig:


  1. $ curl -L https://github.com/docker/fig/releases/download/1.0.0/fig-`uname
  2. -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig

当以上的安装方式不能成功的话,我们可以选择使用Python Package的安装方式:


  1. $ sudo pip install -U fig

最后,不管使用什么Linux系统,安装完Fig之后通过运行以下命令来确保环境的一致性。


  1. $ fig --version

如果一切顺利的话,恭喜你,Fig安装成功了。下面请随我一起学习如何使用Fig配置开发环境。



3. Rails开发环境配置详解

我们来配置一套最常用的Rails+PostgreSQL项目。

第一步,确保Fig已经正确的安装到主机系统,如果还没有,请参考上一章节的安装指南。

第二步,在项目根目录下存放一个名为 Dockerfile 文件:


  1. FROM ruby
  2. RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
  3. RUN mkdir /myapp
  4. WORKDIR /myapp
  5. ADD Gemfile /myapp/Gemfile
  6. RUN bundle install
  7. ADD . /myapp

第三步,创建一个 Gemfile 文件用来定义Rails软件包。 内容如下所示:


  1. source 'https://rubygems.org'
  2. gem 'rails', '4.0.2'

第四步,创建一个fig.yml文件,并使用以下配置文件来做最后的环境初始化。


  1. db:
  2. image: postgres
  3. ports:
  4. - "5432"
  5. web:
  6. build: .
  7. command: bundle exec rackup -p 3000
  8. volumes:
  9. - .:/myapp
  10. ports:
  11. - "3000:3000"
  12. links:
  13. - db

第五步,当前你目录下空空如也,使用如下命令可以生成一套Rails项目骨架:


  1. $ fig run web rails new . --force --database=postgresql --skip-bundle

当你跑完以上命令,你就会得到一个崭新的Rails项目。


  1. $ ls
  2. Dockerfile Rakefile config fig.yml public vendor
  3. Gemfile app config.ru lib test
  4. README.rdoc bin db log tmp

编辑一下Gemfile文件,去掉therubyracer包的注释, 让Rails依赖的Javascript的运行时环境。


  1. gem 'therubyracer', platforms: :ruby

所有的文件编辑都做完之后,运行命令创建开发环境image。


  1. $ fig build

运行完build命令后,我们就有了可以立即使用的Image。这两个Image的名字分别是web和db。为了让db能连上web,我们通常还需要修改database.yml来支持数据库连接。


  1. development: &default
  2. adapter: postgresql
  3. encoding: unicode
  4. database: postgres
  5. pool: 5
  6. username: postgres
  7. password:
  8. host: db
  9. test:
  10. <<: *default
  11. database: myapp_test

好了,让我们运行一下:


  1. $ fig up

命令行将显示如下日志:


  1. Recreating figtest_db_1...
  2. Creating figtest_web_1...
  3. Attaching to figtest_db_1, figtest_web_1
  4. db_1 | LOG: database system was shut down at 2014-10-01 23:53:11 UTC
  5. db_1 | LOG: autovacuum launcher started
  6. db_1 | LOG: database system is ready to accept connections
  7. web_1 | [2014-10-01 23:53:16] INFO WEBrick 1.3.1
  8. web_1 | [2014-10-01 23:53:16] INFO ruby 2.1.2 (2014-05-08) [x86_64-linux]
  9. web_1 | [2014-10-01 23:53:16] INFO WEBrick::HTTPServer#start: pid=1 port=3000
  10. db_1 | FATAL: database "myapp_development" does not exist
  11. db_1 | FATAL: database "myapp_development" does not exist
  12. web_1 | 192.168.59.3 - - [01/Oct/2014 23:53:40] "GET / HTTP/1.1" 500 13476 0.5112
  13. web_1 | 192.168.59.3 - - [01/Oct/2014 23:53:40] "GET %2Ffavicon.ico HTTP/1.1" 200 - 0.0067

通过以上日志可以知道开发数据库还没有创建。这时我们可以开启另外一个terminal,创建开发数据库:


  1. $ fig run web rake db:create

当以上所有步骤都成功运行后,就需要来验证开发环境的正确性了。通过访问http://localhost:3000/ 我们应该可以看到熟悉的Rails欢迎页面:



4. Django开发环境配置详解

接下来让我们使用Fig来配置一套运行Django/PostgreSQL的应用程序吧。

首先我们新建一个项目目录,并在目录里创建3个文件。第一个文件是Docker镜像的定义文件: Dockerfile,用来描述安装在Docker容器里软件依赖关系。文件如下:


  1. FROM python:2.7
  2. ENV PYTHONUNBUFFERED 1
  3. RUN mkdir /code
  4. WORKDIR /code
  5. ADD requirements.txt /code/
  6. RUN pip install -r requirements.txt
  7. ADD . /code/

以上文件描述这个Image将安装requirements.txt指定的python依赖包。

第二个文件是requirements.txt,它是python依赖包定义描述文件,内容如下:


  1. Django
  2. psycopg2

最后,Fig需要把所有的环境都连接起来运行。这个文件名为 fig.yml 。它描述项目需要的服务组件、指定镜像的版本、如何连接服务、什么卷可以被载入容器内部、什么端口可以暴露出来等。内容形如:


  1. db:
  2. image: postgres
  3. web:
  4. build: .
  5. command: python manage.py runserver 0.0.0.0:8000
  6. volumes:
  7. - .:/code
  8. ports:
  9. - "8000:8000"
  10. links:
  11. - db

到此处,我们就可以使用 fig run 来创建一个Django项目了:


  1. $ fig run web django-admin.py startproject figexample .

当你运行完之后,可以在当前目录下看到创建的新项目文件:


  1. $ ls
  2. Dockerfile fig.yml figexample manage.py requirements.txt

接下来的事情就是创建数据库链接,修改 figexample/settings.py 的DATABASES = ...部分。


  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.postgresql_psycopg2',
  4. 'NAME': 'postgres',
  5. 'USER': 'postgres',
  6. 'HOST': 'db',
  7. 'PORT': 5432,
  8. }
  9. }

这个配置信息是用来连接postgres镜像服务。

然后,运行命令 fig up来启动容器。


  1. Recreating myapp_db_1...
  2. Recreating myapp_web_1...
  3. Attaching to myapp_db_1, myapp_web_1
  4. myapp_db_1 |
  5. myapp_db_1 | PostgreSQL stand-alone backend 9.1.11
  6. myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: database system is ready to accept connections
  7. myapp_db_1 | 2014-01-27 12:17:03 UTC LOG: autovacuum launcher started
  8. myapp_web_1 | Validating models...
  9. myapp_web_1 |
  10. myapp_web_1 | 0 errors found
  11. myapp_web_1 | January 27, 2014 - 12:12:40
  12. myapp_web_1 | Django version 1.6.1, using settings 'figexample.settings'
  13. myapp_web_1 | Starting development server at http://0.0.0.0:8000/
  14. myapp_web_1 | Quit the server with CONTROL-C.

这个时候,你可以开启浏览器,然后输入 localhost:8000 就可以访问这个Django应用。

注意,当你跑起来应用之后,就可以初始化数据库了。这里,请一定要保证fig up是在运行中,并另外开启一个命令行窗口执行一下命令:


  1. $ fig run web python manage.py syncdb

如果你反复使用了fig up之后,可以体会到它一次性会把web和db两个镜像一起启动,如果你CONTROL-C之后,数据库也会停止服务。你甚至可以fig run web /bin/bash的方式直接进入到容器里看看。

(责任编辑:IT)

------分隔线----------------------------
栏目列表
推荐内容