1. 程式人生 > >使用docker快速構建rails開發環境

使用docker快速構建rails開發環境

發現最近國內獲取Docker映象速度明顯上升,所以開始正式的玩Docker了,這篇文章介紹使用Docker來快速構建Rails開發環境,系統環境為MAC OSX, Rails依賴於Redis以及Postgresql.所以主要包括Rails以及Redis和Postgres三大元件。 使用的Docker工具為docker-compose.

個人原創,轉載請註明原文出處,並保留原文連結:

參考文章

Quickstart: Compose and Rails:https://docs.docker.com/compose/rails/

使用Docker搭建一個Rails開發環境:  http://

williamherry.com/blog/2015/01/22/build-rails-dev-env-using-docker

一、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了