まずはコンテナでの開発においてよく使われる概念を再確認します。Dockerfile
を記述することで、Ruby on Rails のアプリケーションを含んだ イメージ
を作成し、それを元に コンテナ
を起動する準備が本ページでの目標です。
Cloud9 上で Docker のコマンドを確認します。新しくターミナルを開きます。
次のコマンドをターミナルに入力して docker のバージョンを確認しましょう。
docker --version
systemctl status docker.service
次のように表示されることを確認することで、Cloud9 にはデフォルトで Docker がインストールされていることが確認できます。
Cloud9 は php や Python といったメジャーなプログラミング言語に加えて Docker や git のように開発でよく用いるソフトウェアが入っています。例えば次のようなコマンドを打って確認をしてみましょう。
aws --version && git --version && mysql --version && python -V && php -v && java -version
コンテナの元となるイメージ作成の手順を記述したものが Dockerfile です。必要なパッケージやアプリ、各種設定を記述しイメージ化することで、軽量でポータブルなコンテナが出来上がります。
はじめに、Dockerfile を格納する /handson フォルダを作成します。
つぎに、Dockerfile 本体を作成します。
拡張子なしの Dockerfile
というファイルを用意することで、イメージの build 時にファイル名の指定を省けます。
エディタを使って Dockerfile に次の内容を記述します。右上のボタンからコピーできます。
# ruby:2.6.5 というベースイメージを取得
FROM ruby:2.6.5
# 必要なパッケージ群を取得
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list\
&& apt-get update -qq && apt-get install -y nodejs postgresql-client yarn && mkdir /myapp
WORKDIR /myapp
# local にあるファイルをイメージ内にコピー
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
# rails を 3000 番ポートで起動
RUN rails new . -O&& sed -i -e "52a\ config.hosts.clear" config/environments/development.rb
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]
コピーが終わりましたら、画面上のタブの 「File」→「Save」を押して保存をします。
各コマンドの意味や Dockerfile の書き方についてのベストプラクティスはリファレンスを御覧ください。http://docs.docker.jp/engine/articles/dockerfile_best-practice.html
7,8 行目では local にある Gemfile
と Gemfile.lock
をイメージ内にコピーしています。このイメージをビルドする前に、コピーする元となるファイルを Cloud9 で作成します。
Dockerfile と同様に、右クリックしてNewfile から新規ファイルを作成します。ファイル名をダブルクリックして Gemfile
という名前に変更し、エディタで次の内容を記入します。
source 'https://rubygems.org'
gem 'rails', '6.0.0'
先程と同様に、コピーが終わりましたら、画面上のタブの 「File」→「Save」を押して保存をします。
次に、空のGemfile.lock を作成します。コマンドライン上で touch Gemfile.lock
と入力することでもファイルの作成ができます。中身は何も記述しないままで問題ありません。
Dockerfile
の記述が終わったのでコンテナの イメージ
をビルドする準備ができました。
早速ビルドを行って、イメージを確認してみます。
デフォルトの状態ではCloud9環境はディスク容量の残りが少ないため、以下のコマンドを発行して不要なdocker imageファイルを削除して下さい。 以下のコマンドではイメージ名 ‘lambci’で始まるイメージを全て削除します。
docker rmi $(docker images | awk '/^lambci/ { print $3 }')
Linux環境のディスクの利用状況はコマンド df -h
で確認できます。
次のコマンドをコンソール上で実行して Dockerfile と同じ場所に移動します。
cd ~/environment/handson
ビルドは、次のコマンドですることができます。最後の半角スペースとピリオドに注意しましょう。
docker build -t rails-container:latest .
しばらく待つと、ビルドが完了します (数分かかります)。完成したイメージは以下のコマンドで確認できます。
docker image ls
次のように rails-container
というイメージが作成されていることがわかります。
これで、コンテナの元となるイメージを作成したことで、Docker の動作環境さえあれば、ruby などのミドルウェアを設定しなくとも、Ruby on Rails のウェブアプリケーションを実行できるようになりました。
このように、Docker を使うと動作環境を固定できるためアプリケーションのポータビリティが増します。これが、Docker でアプリケーションを開発するメリットのうちの 1 つとなります。
早速、今作ったイメージをいろいろな環境でコンテナとして実行してみます。