使用docker快速构建rails开发环境

发现最近国内获取Docker镜像速度明显上升,所以开始正式的玩Docker了,这篇文章介绍使用Docker来快速构建Rails开发环境,系统环境为MAC OSX, Rails依赖于Redis以及Postgresql.所以主要包括Rails以及Redis和Postgres三大组件。 使用的Docker工具为docker-compose.

个人原创,转载请注明原文出处,并保留原文链接:

https://www.embbnux.com/docker_for_rails_development_with_postgresql_and_redis/

参考文章:   Quickstart: Compose and Rails  使用Docker搭建一个Rails开发环境

一、Docker简介

docker其实就是一个容器,把系统的每一部份在不同的虚拟容器中运行,从而提供更安全的运行,以及更方便的部署,保证了不同机器上软件环境的统一。安装的话,我这边就不细说了,mac的话直接官网下载安装就可以了,ubuntu直接apt搞定,由于docker本身只支持linux,所以mac上实际是新建了一个linux虚拟机在运行。

二、拆分Rails系统

开发中Rails主要使用了postgresql当为数据库,redis用来作为session储存、缓存以及异步消息队列等。所以把开发环境拆分为rails环境,数据库,以及redis。三个部分的管理和连接使用docker-compose,相当方便。

目录结构如下:


# rails 根目录
|__ Dockerfile
|__ Gemfile.lock
|__ Gemfile
|__ config
|__ |__ database.yml
|__ |__ docker
|       |__ postgres
|           |__ Dockerfile
|           |__ init.sql
|__ docker-compose.yml

redis直接使用官方镜像,就不为它提供Dockerfile了。Dockerfile主要用来构建docker镜像。

三、rails镜像

rails镜像使用官方的ruby 2.2.3 镜像构建相对简单, Dockerfile如下:


FROM ruby:2.2.3

RUN apt-get update -qq && apt-get install -y build-essential libssl-dev git --fix-missing --no-install-recommends

# postgres
RUN apt-get install -y libpq-dev

# nokogiri
RUN apt-get install -y libxml2-dev libxslt1-dev

# minimagick
RUN apt-get install -y imagemagick libbz2-dev libjpeg-dev libevent-dev libmagickcore-dev libffi-dev libglib2.0-dev zlib1g-dev libyaml-dev

# qt for capybara capybara-webkit
RUN apt-get install -y qt5-default libqt5webkit5-dev gstreamer1.0-plugins-base gstreamer1.0-tools gstreamer1.0-x xvfb --fix-missing --no-install-recommends

# node js for coffee and sass
RUN curl -sL https://deb.nodesource.com/setup_5.x | bash -
RUN apt-get install -y nodejs

ENV APP_HOME /rails_app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ADD Gemfile* $APP_HOME/
RUN bundle install

# postgres 配置
ENV DEV_DB_HOST pgdb
ENV TEST_DB_HOST pgdb
# redis
ENV REDIS_HOST redis
ADD . $APP_HOME

然后配置rails的database地址:


default: &&default
 adapter: postgresql
 encoding: unicode
 pool: 5

development:
 <<: *default
 database: dev_db
 username: dev
 password: dev123
 host: <%= ENV['DEV_DB_HOST'] || 'localhost' %>

test:
 <<: *default
 database: test_db
 username: tester
 password: tester123
 host: <%= ENV['TEST_DB_HOST'] || 'localhost' %>

redis的url也相应变为:”redis://#{ ENV[‘REDIS_HOST’] || ‘localhost’ }:6379″

四、postgres镜像

postgres也使用官方提供的镜像,但是因为rails开发中测试和开发两个环境使用了不同的数据库,所以改写了init.sql

Dockerfile如下:


FROM postgres:9.4

ADD init.sql /docker-entrypoint-initdb.d/

init.sql如下:

CREATE USER dev;
ALTER USER dev WITH PASSWORD 'dev123';
ALTER USER dev CREATEDB;
CREATE DATABASE dev_db;
GRANT ALL PRIVILEGES ON DATABASE dev_db TO dev;
ALTER DATABASE dev_db OWNER TO dev;

CREATE USER tester;
ALTER USER tester WITH PASSWORD 'test123';
ALTER USER tester CREATEDB;
CREATE DATABASE test_db;
GRANT ALL PRIVILEGES ON DATABASE test_db TO tester;
ALTER DATABASE test_db OWNER TO tester;

五、redis

redis直接使用官方镜像,并没有做任何改变,就不用写Dockerfile了

六、组件连接

最终的组件连接使用docker-compose非常方便

docker-compose如下:

pgdb:
  build: ./config/docker/postgres
redis:
  image: redis
web:
  build: .
  command: foreman start
  volumes:
    - .:/rails_app
  ports:
    - "3000:3000"
  links:
    - pgdb
    - redis

docker-compose命令:

# 生成docker镜像
docker-compose build

# rails db migrate
docker-compose run web rake db:create
docker-compose run web rake db:migrate
docker-compose run web rake db:seed
# 启动开发系统
docker-compose up
# 以后的开发命令就得再前面加 docker-compose run web
docker-compose run web bundle i

这样就可以很快速的在不同机器上快速构建开发环境了。

这里有一点得注意就是在mac系统上,docker是运行在虚拟机上的,所以浏览器访问也就不是localhost:3000,而应该是虚拟机的ip.

为了方便使用可以在hosts文件里添加dockerhost解析到虚拟机ip:

# 查看虚拟机ip
docker-machine ip default
# addhost: dockerhost
vim /etc/hosts
192.168.99.100 dockerhost

访问就变成dockerhost:3000了

《使用docker快速构建rails开发环境》上有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据