Create docker cluster by fig
figでdockerのクラスタを作成するチュートリアルをやった!
Macでやった
webとdbで別々のコンテナを使って、railsを動かす
boot2dockerインストール・起動
インストール
$ brew install boot2docker
boot2docker立ち上げ
$ boot2docker init
$ boot2docker start
$ $(boot2docker shellinit)
figインストール
$ brew install fig
Dockerfile作成
- rubyのイメージを使う
- 必要なパッケージ入れる
- myappディレクトリ作成
- ワーキングdirectoryを設定
- ローカルのGemfileをコンテナに配置
- bundle installする
- myappディレクトリをコンテナに配置
FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp
Gemfile作成
↑で指定しているGemfileを作成
rails入れてるだけ
# A sample Gemfile
source "https://rubygems.org"
gem 'rails', '4.0.2'
fig.yml作成
これがコンテナを管理するファイルだよ
- サービス名ごとに設定をする
- イメージを指定できる
- ポート指定
- buildはDockerfileがあるディレクトリを指定
- volumesはコンテナにマウントするディレクトリを指定(マウントって表現はあっているのか?)
- linkでコンテナ間の通信を可能にする 通信したいサービス名を指定している
- commandで実行したいコマンド書いてる Dockerfileと違ってサービス系のコマンド書く場所な気がする
db:
image: postgres
ports:
- "5432"
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
rails new
fig.ymlのvolumeでディレクトリをコンテナと共有しているので、ローカルにもrails newしたファイルが生成される
$ fig run web rails new . --force --database=postgresql --skip-bundle
Creating fig_db_1...
Pulling image postgres...
bf872395e1d4: Pulling dependent layers
2a6a21c5b94c: Download complete
262bbf3bc01d: Pulling dependent layers
ccfd853359a6: Pulling dependent layers
6dc733527d22: Pulling dependent layers
rebuild
Gemfileにtherubyracer
を追加
+ gem 'therubyracer', platforms: :ruby
GemfileやDockerfileを変更した場合は再度イメージをbuildする
$ fig build
fig up
upする前にrailsのデータベース設定ファイル修正
production
-development:
+development: &default
adapter: postgresql
encoding: unicode
- database: myapp_development
+ database: postgres
pool: 5
- username: myapp
+ username: postgres
password:
+ host: db
test
- adapter: postgresql
- encoding: unicode
+ <<: *default
database: myapp_test
- pool: 5
- username: myapp
- password:
起動する
$ fig up
Recreating fig_db_1...
Creating fig_web_1...
Attaching to fig_db_1, fig_web_1
db_1 | LOG: database system was shut down at 2015-02-26 11:44:02 UTC
db_1 | LOG: database system is ready to accept connections
db_1 | LOG: autovacuum launcher started
web_1 | /usr/local/bundle/gems/activesupport-4.0.2/lib/active_support/values/time_zone.rb:282: warning: circular argument reference - now
web_1 | [2015-02-26 11:44:07] INFO WEBrick 1.3.1
web_1 | [2015-02-26 11:44:07] INFO ruby 2.2.0 (2014-12-25) [x86_64-linux]
web_1 | [2015-02-26 11:44:07] INFO WEBrick::HTTPServer#start: pid=1 port=3000
動作確認
$ curl $(boot2docker ip):3000
<!DOCTYPE html>
<html>
<head>
<title>Ruby on Rails: Welcome aboard</title>
…
psしてみる
$ fig ps
Name Command State Ports
----------------------------------------------------------------------------
fig_db_1 /docker-entrypoint.sh postgres Up 0.0.0.0:49154->5432/tcp
fig_web_1 bundle exec rackup -p 3000 Up 0.0.0.0:3000->3000/tcp
linksを設定すると、コンテナ内の/etc/hosts
にlink先のコンテナの情報が追記される
$ fig run web /bin/bash
root@2d6b9cf36416:/myapp#
root@2d6b9cf36416:/myapp# cat /etc/hosts
172.17.0.15 2d6b9cf36416
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.12 fig_web_1
172.17.0.12 web
172.17.0.12 web_1
172.17.0.11 db
172.17.0.11 db_1
172.17.0.11 fig_db_1