猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

Dockerイメージを使ってRuby on Railsの開発をすすめる

もくじ

f:id:yoshiki_utakata:20180314182124j:plain

Dockerを使ってRuby on Railsの開発を進められる環境を整えたいと思います。

ディレクトリを共有

hostのmacとdockerでディレクトリを共有して、mac上でコードを変更したらdockerにすぐに反映されて動作確認できるようにしたい。

アプリケーションを動かすユーザーを作成

ユーザーはなんでもいいです。Dockerfileに以下を追記

RUN apt-get -y install sudo
RUN useradd -m -d /home/insta -s /bin/bash insta

instaユーザーが作成されます。sudoも同時にインストールしないとinstaユーザーにsudo su -できません。

いつも通り docker build -t insta . とかでイメージを作成します。

ファイルを同期してみる

以下のコマンドでdocker runをします。

docker run -d -p 3000:3000 -v /Users/yoshiki-utakata/ruby/instagramapp/app:/home/insta/app -t insta
  • -p 3000:3000 でhostのポート3000をdockerのポート3000にフォワーディングさせます。(Rails用)
  • さらに -v xxx:yyy でhostのxxxファイルをdockerのyyyファイルに同期できます。

確認してみます。

$ docker exec -it 52dbd3862f91ccf6f9b3328de0d86012ca0e3cd53586e59a40460b46e7a29fd6 /bin/bash
root@52dbd3862f91:/# sudo su - insta
insta@52dbd3862f91:~$ ls
app
insta@52dbd3862f91:~$ cd app
insta@52dbd3862f91:~/app$ ls
insta@52dbd3862f91:~/app$

instaユーザーになれてlsするとappディレクトリができているはずです。

rails new してみる。

これで環境はだいたい整ったといえます。ゲストの方でrails newすればhostの方でも同じディレクトリができるはず...!

insta@52dbd3862f91:~/app$ rails -v
-su: rails: command not found

instaユーザーだとpathが通ってなくてrailsコマンドが実行できませんでした...

ということで、adduserしたあとUSERコマンドでinstaユーザーに変わって(ついでにWORKDIRも/home/instaにして)railsのインストールをするようにDockerfileを変更。

RUN useradd -m -d /home/insta -s /bin/bash insta
USER insta
WORKDIR /home/insta
RUN gem install bundler
RUN gem install rails -v 5.1.5

この状態でdocker execするとinstaユーザーで/home/instaディレクトリから始まるようになり、rubyもrailsもコマンドが使えるように。

$ docker exec -it 15361f80b1e2ed951af0f98fbfe7138ad136bdc052a6486c119a0f03d967d4eb /bin/bash
insta@15361f80b1e2:~$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
insta@15361f80b1e2:~$ rails -v
Rails 5.1.5
````

# Railsプロジェクトを作成してみる

あくまでも手元のMacにrubyを入れたくないということでdocker上で実行してみます。

insta@15361f80b1e2:~$ cd app insta@15361f80b1e2:~$ rails new insta (略) Bundle complete! 16 Gemfile dependencies, 70 gems now installed. ...

ということで手元のMacの方のディレクトリを見てみると、こちらにもちゃんとapp/instaディレクトリができていることがわかります。

# Rails serverを動かしてみる

Rails serverを動かしてみて、アクセスできるか試してみます。

insta@15361f80b1e2:~/app$ cd insta insta@15361f80b1e2:~/app/insta$ bundle install insta@15361f80b1e2:~/app/insta$ rails server => Booting Puma => Rails 5.1.5 application starting in development => Run rails server -h for more startup options Puma starting in single mode... * Version 3.11.3 (ruby 2.5.0-p0), codename: Love Song * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop

ということで、Macのポート3000がdockerのポート3000につながる設定にしていたので、つなげてみましょう。

http://localhost:3000/

つながりました。