DockerでRailsの開発環境を構築する

前提

以下の環境でDockerを使用する。またDockerHubのアカウントについては既に準備しているものとする。

要素 バージョン
debian 8.6
docker 1.13.0

概要

Mac上に立ち上げたDebian内でDockerを用いてRuby on railsの開発環境を構築する。railsについても学習用の環境にすぎないので、細かいバージョンなどはあまり気にしない方針。

構築にあたっては、rails環境用のDockerイメージをDockerHubから探すだけでも済むが、今回はDocker及び環境構築の学習を含めて以下の手順で構築する。

  1. DockerHubからUbuntuのベースイメージをpull
  2. コンテナを作成し、コンテナ内で環境構築(=Dockerfileは使わない)
  3. コンテナをコミット
  4. 作成したイメージをDockerHubにpush

元となるDockerイメージを取得

今回は使い慣れているUbuntuを用いてrails環境を構築するので、DockerHubからubuntuのイメージをpullする。

$ docker pull ubuntu

イメージが手に入ったら、コンテナを生成してアクセスする。以降の項ではコンテナ内で作業を行う。後々動作確認でコンテナにWebブラウザでアクセスするので、ポートフォワーディングの設定(8081→3000)も指定しておく

$ docker run -it -p 8081:3000 -name my_ubuntu ubuntu

Railsの環境構築

開発環境の前準備

まずはapt-getを更新

$ apt-get update
$ apt-get upgrade

日本語が使えない状態だったので日本語化作業

$ apt-get install language-pack-ja
$ update-locale LANG=ja_JP.UTF-8
$ echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc

開発に必要になる基本的なツールをインストール

$ apt-get install vim git git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libpq-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev aptitude

後々必要になりそうなのでnodejsも適当に入れておく

$ curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
$ apt-get install -y nodejs

Rubyのインストール

Rubyについては、最新版をサクッと入れたいのでapt-getでなくrbenvを用いてインストールする

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

rbenv用の初期化コマンドをbashrcに追加。これでrbenvディレクトリ経由でrubyを実行できるようにする。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ exec $SHELL

rbenvのプラグインで、rubyをインストールするためのruby-buildをインストール

$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
$ exec $SHELL

rbenvを用いて、現在の最新の安定版であるRUby2.4.1をインストール

$ rbenv install 2.4.1

rbenvで利用するRubyのバージョンを、先程インストールした2.4.1にする

$ rbenv global 2.4.1

Rubyのパッケージ管理ツールであるgemをインストール

$ apt-get install gem

gemがドキュメントもインストールするのを抑止するため、.gemrcに以下を記述

install: --no-document
update: --no-document

gemをインストールする度に自動でrbenbをrehashしてくれるrbenv-rehashをインストール

$ gem i rbenv-rehash

gemの依存管理をしてくれるbundleをインストール

$ gem i bundle

Ruby on railsの導入

railsをインストール

$ gem install rails

5.1.0がインストールできたことを確認

$ rails -v
Rails 5.1.0

mySQLをインストール

$ apt install mysql-server mysql-client

なんか以下も必要らしいのでインストール

$ sudo apt-get install libmysqld-dev

mysqlserverを起動

$ /etc/init.d/mysql start

railsアプリケーションの雛形を作成

$ rails new myapp -d mysql

雛形がデキていることを確認

$ ls
Gemfile  Gemfile.lock  README.md  Rakefile  app  bin  config  config.ru  db  lib  log  package.json  public  test  tmp  vendor

rails用のDBを作成

$ rake:db

DBがデキていることを確認

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myapp_development  |
| myapp_test         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

railsアプリケーションを起動

rails s -b 0.0.0.0 -p 3000

が、何故かエラーが出る。gemライブラリが足りない的なエラーだがどうみても足りている。ググってもどうしても解決できなかったので、該当するコードをコメントアウト。調べてみるとタイムゾーン関係に必要になるそうなので、学習段階では大きな影響を受けないと判断。

myapp/vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.0/lib/active_support/railtie.rb

 19       #begin
 20       #  TZInfo::DataSource.get
 21       #rescue TZInfo::DataSourceNotFound => e
 22       #  raise e.exception "tzinfo-data is not present. Please add gem 'tzinfo-data' to your Gemfile and run bundle install"
 23       #end
 24       #require "active_support/core_ext/time/zones"
 25       #zone_default = Time.find_zone!(app.config.time_zone)
 26
 27       #unless zone_default
 28       #  raise "Value assigned to config.time_zone not recognized. " \
 29       #    'Run "rake time:zones:all" for a time zone names list.'
 30       #end
 31
 32       #Time.zone_default = zone_default

改めてrailsアプリケーションを起動。無事に起動。

=> Booting Puma
=> Rails 5.1.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.1-p111), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000

Railsアプリケーションの起動をブラウザで確認する

  • rails用のWebサーバはコンテナ内の3000番ポートで起動している
  • コンテナ起動時に、Dockerホストの8081番ポートをコンテナの3000番ポートにポートフォワーディングするように指定している
  • Macの8081番ポートをDebian(Dockerホスト)の8081番ポートにポートフォワーディングするように設定している(Vagrantfileにて)
    以上より、Macのブラウザでlocalhost:8081にアクセスすることで、コンテナ内で起動しているWebサーバにリクエストを送ることができる。

実際にブラウザを用いてアクセスしてみると、以下のようにrailsのウェルカムページが表示され、Dockerコンテナ側でもアクセスログが表示されているので、環境構築が成功したことがわかる。

Started GET "/" for 10.0.2.2 at 2017-05-03 14:19:10 +0000
Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Rails::WelcomeController#index as HTML
  Rendering vendor/bundle/ruby/2.4.0/gems/railties-5.1.0/lib/rails/templates/rails/welcome/index.html.erb
  Rendered vendor/bundle/ruby/2.4.0/gems/railties-5.1.0/lib/rails/templates/rails/welcome/index.html.erb (2.7ms)
Completed 200 OK in 115ms (Views: 5.4ms)

Dockerイメージのコミット

※ 以降ではコンテナから切断し、Dockerホスト側で作業を行う

4の項で、rails用の環境が構築されたコンテナが出来上がったので、このコンテナを元に新たなイメージをコミットする。

DockerHubにpushするためには、イメージ名が”DockerHubのユーザ名/イメージ名”である必要があるので、ここではそれに従ってコミットする

$ docker commit my_ubuntu sa2knight/rails

イメージ一覧に新しいイメージが追加されていることを確認。元のUbuntuとくらべて、様々なツールをインストールしたので容量が増大していることがわかる

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sa2knight/rails     latest              519638e57a05        22 hours ago        1.55 GB
ubuntu              latest              f7b3f317ec73        8 days ago          117 MB

DockerHubへのpush

ここでは、DockerHubに作成したイメージをpushするが、既にDockerHubアカウント及びリポジトリは作成済みで、ログインも完了しているものとする。

DockerHubへのpushは以下のコマンドで行う

$ docker push sa2knight/rails
The push refers to a repository [docker.io/sa2knight/rails]
d675a105e8a6: Pushing [========================================>          ] 1.153 GB/1.431 GB
d675a105e8a6: Pushed
08f405d988e4: Pushed
511ddc11cf68: Pushed
a1a54d352248: Pushed
9d3227c1793b: Pushed

latest: digest: sha256:2c8b2bb969347c41be37d8bb788e9c5a531b6478c8f4089039692d28bd74ec5d size: 1570

1.5HBをアップロードするのでかなり時間がかかるが、気長に待ってたらいつのまにか終わった。

DockerHubにアクセスすると、イメージがアップロードされていることが確認できる。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です