目次
前提
以下の環境でDockerを使用する。またDockerHubのアカウントについては既に準備しているものとする。
要素 | バージョン |
---|---|
debian | 8.6 |
docker | 1.13.0 |
概要
Mac上に立ち上げたDebian内でDockerを用いてRuby on railsの開発環境を構築する。railsについても学習用の環境にすぎないので、細かいバージョンなどはあまり気にしない方針。
構築にあたっては、rails環境用のDockerイメージをDockerHubから探すだけでも済むが、今回はDocker及び環境構築の学習を含めて以下の手順で構築する。
- DockerHubからUbuntuのベースイメージをpull
- コンテナを作成し、コンテナ内で環境構築(=Dockerfileは使わない)
- コンテナをコミット
- 作成したイメージを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にアクセスすると、イメージがアップロードされていることが確認できる。