Rails 版 Worker 開発環境 Docker イメージについて

Getting Started や Worker 開発そのものを手軽に試せるように、Rails 版 Worker 開発環境 Docker イメージを公開しています。

Rails 版 Worker 開発環境 Docker イメージは、Rails 版 Worker の開発に必要な環境一式をパッケージングしています。

Docker の実行環境さえあれば、お使いのマシン環境を汚すことなく、気軽に Worker 開発を試せます。

前提環境

Docker 1.8.1 以降がインストールされていることが前提となります。

公開場所

Rails 版 Worker 開発環境 Docker イメージは、Docker Hubmagellan/development-env-rails リポジトリ で公開しています。

Repository Tag
magellan/development-env-rails 4.2.6-p2

パッケージ内容

OS

項目 バージョン
Ubuntu 16.04 LTS

Ruby on Rails 関連

項目 バージョン
Ruby 2.3.1p112 (2016-04-26 revision 54768)
RubyGems 2.5.1
Bundler 1.12.5
Rails 4.2.6

データベース関連

項目 バージョン
MySQL mysql-client 5.7 / libmysqld-dev 5.7.12
PostgreSQL postgresql-client 9.5 / libpq-dev 9.5.3

MAGELLAN 関連

項目 バージョン
libmagellan 0.2.6
magellan-cli 0.9.1

その他

項目 バージョン
Docker 1.11.1, build 5604cbe
エディタ VIM 7.4.1689 / GNU Emacs 24.5.1 / GNU nano 2.5.3 / Atom 1.7.4
git 2.7.4
Node.js 6.2.0

利用方法

Worker 開発環境コンテナをバックグラウンドで起動します。コンテナ起動後に、ログインして利用します。

データベースを利用する場合は、データベースコンテナを先に起動します。

データベースコンテナの起動

データベースを利用しない場合は、次の「Worker 開発コンテナの起動」へ進んでください。Getting Started を試す場合は、必ず MySQL データベースコンテナを起動してください。

Worker 開発環境コンテナは、MySQL と PostgreSQL に対応(ライブラリとクライアントツールをインストール済み)しています。ここでは、MySQL の利用例を示します。

$ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=s3cret -d mysql

指定した各オプションとその意味は次のとおりです。

  • --name mysql(必須)

    コンテナに、mysql という名前を付けています。名前は、自由に付けてかまいません。違う名前をつけた場合は、コンテナ名 mysql の部分は、その名前に読み替えてください。

  • -p 3306:3306(必須)

    MySQL のポート番号をデフォルトの 3306 のまま公開しています。ポート番号は、自由に設定してかまいません。書式は、「ホストマシンのポート番号 : コンテナのポート番号」です。

  • -e MYSQL_ROOT_PASSWORD=s3cret(必須)

    MySQL の root アカウントのパスワードを s3cret に設定しています。パスワードは、自由に設定してかまいません。

  • -d(必須)

    コンテナをバックグラウンドで起動します。

データベースコンテナが起動しているかどうかを docker ps コマンドで確認します。NAMES の欄に、コンテナ名 mysql と表示されている行があれば成功です。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS                    NAMES
cc338f18608d        mysql:latest        "/entrypoint.sh mysq   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp   mysql

tips用アイコン

CONTAINER ID、CREATED、STATUS の各値は、お使いの環境ごとに異なります。

Worker 開発環境コンテナの起動

Worker 開発環境コンテナをバックグランンドで起動します。データベースコンテナとの連携やホストマシンとコンテナ間でのファイル共有などいくつかのオプションを指定します。

$ docker run --privileged --name worker-dev --link mysql:mysql -v /path/to/directory:/workspace -p 3000:3000 -d magellan/development-env-rails:4.2.6-p2

指定した各オプションとその意味は次のとおりです。

  • --privileged(必須)

    コンテナを特権モードで起動します。Docker を利用するために必須です。

  • --name worker-dev(オプション)

    コンテナに、worker-dev という名前を付けています。名前は、自由に付けてかまいません。

    省略時には Docker が自動的に他と衝突しない名前を付けます。同じ名前のコンテナが存在する時はそのコンテナが終了状態(docker ps -a-a オプションをつけて docker ps を実行した時のみ表示されます)であってもエラーになるため、あらかじめ同じ名前のコンテナは削除しておく必要があります。

    以降の説明では、コンテナに worker-dev という名前をつけたものとしてコマンドライン例を記述しています。別の名前を付けた場合は、適宜読み替えてください。

  • --link mysql:mysql(オプション)

    データベースコンテナとの連携を指定します。データベースを利用しなければ不要です。書式は、「連携するデータベースコンテナ名 : エイリアス名」です。

    Worker 開発環境コンテナ内では、エイリアス名で始まる(この例では、MYSQL)環境変数で連携したいデータベースコンテナの IP アドレスやポート番号などの情報が参照できます。

  • -v /path/to/directory:/workspace(オプション)

    ホストマシンとコンテナ間で、ファイルを共有します。

    コンテナ内で作成したファイルやディレクトリは、コンテナを削除すると消えます。コンテナ削除後も作成したファイルやディレクトリを残しておきたい場合は、この共有機能を使います。

    Worker 開発環境コンテナでは、ホストマシンとの共有目的で、/workspace ディレクトリを用意しています。/path/to/directory は、コンテナとファイルを共有するためのホストマシン側のディレクトリです。

    /path/to/directory は、お使いの環境に合わせて自由に決めてかまいません。あらかじめ準備して、指定してください。

  • -p 3000:3000(必須)

    Rails サーバーのポート番号をデフォルトの 3000 のまま公開しています。ポート番号は、自由に設定してかまいません。書式は、「ホストマシンのポート番号 : コンテナのポート番号」です。

  • -d(必須)

    コンテナをバックグラウンドで起動します。

Worker 開発環境コンテナが起動しているかどうかをdocker ps コマンドで確認します。NAMES に、コンテナ名 worker-dev と表示されている行があれば成功です。

$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                CREATED             STATUS              PORTS                    NAMES
308f9f3582a0        magellan/development-env-rails:4.2.6-p2   "startup"              5 seconds ago       Up 4 seconds        0.0.0.0:3000->3000/tcp   worker-dev
cc338f18608d        mysql:latest                              "/entrypoint.sh mysq   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp   mysql

tips用アイコン

CONTAINER ID、CREATED、STATUS の各値は、お使いの環境ごとに異なります。

tips用アイコン

コンテナ内で参照できる MYSQL で始まる環境変数は、次のとおりです。値は、オプションの指定内容や環境によって異なります。

$ env | grep MYSQL
MYSQL_ENV_MYSQL_ROOT_PASSWORD=s3cret
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.1:3306
MYSQL_ENV_MYSQL_VERSION=5.6.24
MYSQL_NAME=/worker-dev/mysql
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_3306_TCP_ADDR=172.17.0.1
MYSQL_ENV_MYSQL_MAJOR=5.6
MYSQL_PORT=tcp://172.17.0.1:3306

Rails アプリケーションの場合は、config/database.yml の中で、これらの環境変数から必要な情報を参照します。以下は、root アカウントのパスワード(MYSQL_ENV_MYSQL_ROOT_PASSWORD)と、データベースサーバーのアドレス(MYSQL_PORT_3306_TCP_ADDR)を取得している例です。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['MYSQL_ENV_MYSQL_ROOT_PASSWORD'] %>
  host: <%= ENV['MYSQL_PORT_3306_TCP_ADDR'] %>

Worker 開発環境コンテナへのログイン

docker exec を使って、Worker 開発環境コンテナにログインします。

$ docker exec -it worker-dev su magellan

指定した各オプションとその意味は次のとおりです。

  • -it(必須)

    コマンドラインで対話的に作業することを指定します。

  • worker-dev(必須)

    Worker 開発環境コンテナを指定します。

  • su magellan(必須)

    magellan アカウントでログインします。

    magellan アカウントで作業することを前提に、アカウントや /workspace ディレクトリを用意しています。

ログイン後、/workspace ディレクトリに移動します。/workspace 以外で作成したディレクトリやファイルは、コンテナ削除後は残りません。作業場所には、気をつけてください。

$ cd /workspace

Rails アプリを作ってみる

試しに、Rails アプリケーションを作ってみます。

$ rails new trial -B
      create
      create  README.rdoc
      create  Rakefile

      . . . (中略) . . .

      create  vendor/assets/javascripts/.keep
      create  vendor/assets/stylesheets
      create  vendor/assets/stylesheets/.keep

Rails アプリケーションの開発に必要なファイルが生成されました。Rails アプリケーションのルートディレクトリに移動して開発を進めます。

$ cd trial

Gemfile 中でコメントアウトされている therubyracer の行を見つけて、コメントを外してください(# を削除します)。therubyracer は、Google が開発しているオープンソースの JavaScript エンジンである V8 を Ruby から使えるようにする gem パッケージです。これがないと、Web サーバーが起動しません。

(変更前)

# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

(変更後)

# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby

bundle コマンドで、Rails アプリケーションの実行に必要な gem をインストールします。

$ bundle
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...

. . . (中略) . . .

Bundle complete! 13 Gemfile dependencies, 56 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

Web サーバーを起動して、Rails アプリケーションの動作を確認します。

$ ./bin/rails server -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.4 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-25 06:31:35] INFO  WEBrick 1.3.1
[2015-08-25 06:31:35] INFO  ruby 2.2.3 (2015-08-18) [x86_64-linux]
[2015-08-25 06:31:35] INFO  WEBrick::HTTPServer#start: pid=1487 port=3000

ホストマシンのウェブブラウザーから http://localhost:3000/ にアクセスして、Welcome aboard のページが表示されることを確認します。

OS X (Mac) もしくは Windows 環境の方は、localhost の部分を docker-machine ip コマンドで表示される IP アドレスに読み替えてください(例えば、マシン名が default の場合は、docker-machine ip default を実行)。

確認できたら、Ctrl-C(control キーと C キーの同時押し)で、Web サーバーを終了させます。

tips用アイコン

ホストマシンからこの Web サーバーにアクセスする場合は、例示のとおり -b 0.0.0.0 を必ず指定してください。

docker コマンドを試してみる

この環境では、docker コマンドも動作します。

$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from hello-world

a8219747be10: Pull complete
91c95931e552: Already exists
hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Digest: sha256:aa03e5d0d5553b4c3473e89c8619cf79df368babd18681cf5daeb82aab55838d
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

For more examples and ideas, visit:
 http://docs.docker.com/userguide/

Worker 開発環境コンテナからのログアウト

exit コマンドで、Worker 開発環境コンテナからログアウトできます。

$ exit

Worker 開発環境コンテナの終了

Worker 開発環境コンテナを終了させる場合は、docker stop コマンドを使います。

$ docker stop worker-dev

tips用アイコン

この状態は、プロセスが停止しているだけですので、docker start コマンドで再開させることができます。

$ docker start worker-dev

Worker 開発コンテナを削除する場合は、docker rm コマンドを使います。/workspace 以外で作成したディレクトリやファイルは消えてしまいます。よく確認して実行してください。

$ docker rm worker-dev

データベースコンテナの停止や削除も同様です。

$ docker stop mysql
$ docker rm mysql

Getting Started を試す際の留意事項

この Worker 開発環境を使って、「Getting Started 」の「Rails アプリケーションの作成 」を試す際には、いくつかの留意点があります。

MySQL データベースコンテナの起動と連携

MySQL データベースコンテナを起動して、Worker 開発環境コンテナと連携させてください。

tips用アイコン

この時のコンテナ起動例を示します(コマンド実行後に表示される結果は省略しています)。

$ mkdir -p $HOME/workspace/learning_magellan
$ cd $HOME/workspace/learning_magellan
$ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=s3cret -d mysql
$ docker run --privileged --name worker-dev --link mysql:mysql -v $(pwd):/workspace -p 3000:3000 -d magellan/development-env-rails:4.2.6-p2
$ docker exec -it worker-dev su magellan

この例では、Worker 開発環境コンテナとファイル共有する目的で、ホームディレクリ下に、workspace/learning_magellan というディレクトリを作っています(mkdir)。更に、Worker 開発環境コンテナ起動時の -v オプションの指定を簡便にするために、そのディレクトリに移動しています(cd)。

その後、MySQL データベースコンテナの起動と Worker 開発環境コンテナを起動しています(docker run)。

最後に、Worker 開発環境コンテナにログインしています(docker exec)。

Rails のインストールは不要

Rails はインストール済みのため、Rails のインストール(gem install rails)は不要です。

therubyracer のインストール

Rails の起動に therubyracer が必要です。Rails プロジェクト作成直後に、以下の手順で therubyracer をインストールしてください。

まず、Gemfile 中の therubyracer のコメントアウトを外します。

# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby

その後、bundle install コマンドで、therubyracer をインストールします。

$ bundle install

データベースの接続設定をデータベースコンテナに変更

データベースへの接続設定をデータベースコンテナに変更します。

具体的には、config/database.yml 中の passwordhost を次のように環境変数を使って設定します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['MYSQL_ENV_MYSQL_ROOT_PASSWORD'] %>
  host: <%= ENV['MYSQL_PORT_3306_TCP_ADDR'] %>
  # socket: /var/run/mysqld/mysqld.sock

tips用アイコン

Worker 開発環境コンテナ起動時に、--link mysql:mysql として、MySQL データベースコンテナと連携させました。これにより、MYSQL で始まる環境変数を通して、MySQL データベースコンテナの各種情報にアクセスできます。今回この中から以下の環境変数を使っています。

環境変数
MYSQL_ENV_MYSQL_ROOT_PASSWORD MySQL データベースコンテナ起動時に指定した MYSQL_ROOT_PASSWORD 環境変数値(root アカウントのパスワード。今回の場合は、s3cret。)。
MYSQL_PORT_3306_TCP_ADDR MySQL データベースコンテナの IP アドレス。

rails dbconsole を使う

MySQL コマンドクライアント(mysql)を使う代わりに、./bin/rails dbconsole の使用をおすすめします。

この環境で mysql コマンドを使用する場合は、データベースコンテナの IP アドレスを指定する必要があります。./bin/rails dbconsole の場合、config/database.yml の情報が使われるため、その必要がありません。

ただし、パスワードの入力要求がありますので、データベースコンテナ起動時に指定したパスワードを入力してください(例示のとおりであれば、s3cret です)。

$ ./bin/rails dbconsole
Enter password:

mysql> プロンプト以降の操作は、Getting Started の記述どおりです。

$ ./bin/rails dbconsole
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+----------------------------------+
| Database                         |
+----------------------------------+
| information_schema               |
| mysql                            |
| performance_schema               |
| rails-worker-example_development |
+----------------------------------+
4 rows in set (0.00 sec)

mysql> quit;
Bye

Rails 起動時に bind オプションを指定

ホストマシンから Worker 開発環境コンテナ内の Rails サーバーにアクセスできるように、Rails を起動する場合は、bind オプション(-b)を使って、IP アドレス 0.0.0.0 を指定します。

$ rails server -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.4 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-25 06:31:35] INFO  WEBrick 1.3.1
[2015-08-25 06:31:35] INFO  ruby 2.2.3 (2015-08-18) [x86_64-linux]
[2015-08-25 06:31:35] INFO  WEBrick::HTTPServer#start: pid=1487 port=3000