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