ばらしーぶろぐ

開発のメモぶろぐ

Docker for MacでRails5の「Yay! You’re on Rails!」を表示する

今回やりたいこと

  • Dockerの基礎学習として、Rails5の「Yay! You’re on Rails!」をDockerを使って表示する

開発環境

対象の読者

  • Rails newしたアプリケーションをローカルで確認できる
  • Railsアプリケーションの実行環境をOSごとに整備するのが億劫になってきた人(筆者)
    • 異なるMacSQLアプリケーション入れる、みたいなのが面倒になってきた

やり方のまとめ

  • Docker for Macここから dmgをDLしてインストー
  • DockerFileをRails newしたプロジェクト直下に配置する
  • DockerFileにRailsアプリケーションを動かす環境の構築内容を記述する
  • $ docker build イメージ名 . を実行して、イメージ作成
  • $ docker run -d -p 3000:3000 イメージ名 を実行して、コンテナを立ち上げる
  • localhost:3000で「Yay! You’re on Rails!」が見れる

Dockerの簡単な説明

覚えておきたい事柄

  • Dockerを使うと、「言語やフレームワークの実行環境」をコマンド1つで立ち上げてアプリケーションを実行できる
  • 動作中の環境はコンテナ、コンテナの元になるものはイメージと呼ぶ

  • イメージ

    • 読み取り専用にした実行環境のひな形的なもの
    • すでにあるものを使ったり、派生したイメージを作って使ったりできる
  • コンテナ
    • イメージを元にして動作する実行環境的なもの
    • コンテナを動作させるときは元とするイメージと、コンテナ化したときのコマンドを指定する
    • コマンドで /bin/bash を指定すればコンテナに対してコマンド打ったりできる
  • DockerFile
    • イメージを作る手順書的なもの
    • イメージの元になるイメージを指定して、Dockerの設定やイメージ構築時に実行するコマンドを記述できる
      • 例:rubyのイメージを元に、railsをbundle installしたイメージを作成する

Docker for Mac のインストール手順

Homebrewを使う方法について

  • 2017/6 現在では、Homebrew Caskが必須。
  • Caskでインストールしたアプリケーションはアップデートの仕方に難がある
  • 今回は公式dmgでインストール。

公式のdmgでのインストール手順

  • https://docs.docker.com/docker-for-mac/install/
  • Get Docker for Mac [Stable] を押して dmg をダウンロード
  • ダブルクリックしてdmgを開き、appをapplicationsに入れる
  • Docker.appを開く
  • 初回メッセージが出る。
    • Docker needs privileged access.と出る。ネットワークアクセスなどが必要なので、OSから出る権限要求にパスワードを打ってねというメッセージ。
    • 承認するとポップアップが出るが、閉じて良い

Railsを実行できるイメージの作り方

  • $ docker run すると localhost:3000 で「Yay! You’re on Rails!」が見れるイメージを作ります

DockerFileを定義する

FROM ruby:2.4.1
MAINTAINER User Name <user@example.com>
ENV APP_ROOT /usr/src/rails-hello-world
WORKDIR $APP_ROOT
EXPOSE 3000

RUN apt-get update \
&& apt-get install -y \
  nodejs \
  sqlite3 \
  && rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT
RUN bundle install

COPY . $APP_ROOT
CMD ["rails", "server", "-b", "0.0.0.0"]

解説

  • FROM ruby:2.4.1
    • 元になるイメージを指定します
  • MAINTAINER User Name user@example.com
    • 新しく作られるイメージのメンテナ名を定義します。なくても良さそう
  • ENV APP_ROOT /usr/src/rails-hello-world
  • WORKDIR $APP_ROOT
    • Dockerfile で RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令実行時の作業ディレクトリを指定します
  • EXPOSE 3000

    • このイメージが使うネットワークポートを定義します
  • RUN

    • イメージ環境に対して記述したコマンドを打ちます
    • 今回のDockerFileの場合、 apt-get で必要なアプリケーションのインストールをしています
  • COPY コピー元 コピー先
    • イメージ作成元のファイルをイメージに転送します
  • CMD [“rails”, “server”, “-b”, “0.0.0.0”]
    • コンテナ実行時のデフォルト挙動を定義できます
    • 1行しか実行されません。最後に記述したCMDがコンテナ実行時にデフォルトで動作します。
    • 今回の場合、何も指定しないとrails serverを起動するようにしています

実際にRails環境を立ち上げる

  • 上記DockerFileをRails newしたプロジェクトへ追加
  • DockerFileが置いてあるディレクトリへ移動
  • $ docker build -t username/rails-hello-world . を実行してイメージを作る
  • $ docker images で作ったイメージが完成していることを確認(下記は例)
    • username/rails-hello-world latest 6a09890be648 15 minutes ago 799 MB
  • $ docker run -d -p 3000:3000 username/rails-hello-world でイメージを元にコンテナを立ち上げる
    • -d でデーモンとして立ち上がる
    • -p はホストOSとコンテナ間のネットワークポート関係を定義する
  • $ docker ps でコンテナが存在してることを確認

    • cda6478b59cd username/rails-hello-world "rails server -b 0..." 17 minutes ago Up 17 minutes 0.0.0.0:3000->3000/tcp determined_cray
  • $ docker stop コンテナ名 でコンテナを終了できる

    • 上記の場合の例: docker stop determined_cray

Docker コマンド備忘録

  • $ docker run -d -p 80:80 --name コンテナネーム イメージネーム
    • コンテナを動かす
    • -d はデーモン化
    • -P はネットワーク割当
    • 0.0.0.0:32768->5000/tcpPORTSにある場合、ホスト上の32768ポートをコンテナの5000ポートにつなげている
  • $ docker stop コンテナネーム
    • 一時停止
  • $ docker start コンテナネーム
    • 再開
  • $ docker rm コンテナネーム
    • コンテナ削除(イメージは消えない)
  • $ docker rmi イメージネーム
    • イメージ削除
  • $ docker ps
    • コンテナの一覧を表示。
  • $ docker logs
    • コンテナの標準出力を表示。
  • $ docker stop
    • 実行中のコンテナを停止。
  • $ docker top
    • 内部のプロセスを確認
  • $ docker port
    • コンテナに割り当てられた公開ポートがわかる
  • $ docker images
    • ローカルのイメージを確認

次の目標

今回作ったものを動かすことで、アプリケーションの実行環境が作れることはわかりました。

以下の課題を今後解決していこうと思います

  • PostgreSQL使いたい等、アプリケーションの連携をしたい
  • docker build を実行する頻度を把握・少なくしたい
  • 他の開発者と共有したい
  • Alpine Linuxなどを使ってイメージサイズを小さくしたい
    • Mastodonなどを参考にしていく

などなど。取り掛かっていきます。

参考