はじめに
先日リリースした弊社のリニューアルされたiOSアプリのサーバーサイドはDockerで環境構築されております。
Dockerはとても便利で、設定されていば簡単なコマンドを叩くだけであっという間に開発環境が整ってしまいます。
しかし、その便利さ故にDockerを特に意識することなく時だけが過ぎてしまいました、、、
先日何気なく弊社のDocker周りの設定をふと見てみたら、何が書いてあるか全く理解できず(TдT)
これはまずいと思いDockerの勉強をはじめることにしました。
今回はDocker初心者が勉強がてらRails+MySQLの環境構築ができるか試してみました。
環境
今回構築するのは以下の環境です。
- Ruby 2.5.1
- Rails 5.2.0
- MySQL 5.7
参考(事前勉強)
Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント
クイックスタート・ガイド:Docker Compose と Rails — Docker-docs-ja 17.06.Beta ドキュメント
Dockerfile作成
Dockerfileとは、Dockerコンテナの構成内容をまとめて記述しておくファイルです。
ここに書かれた内容をもとに、Dockerイメージが構築されます。
以下を記述します。
FROM ruby:2.5.1 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential mysql-client nodejs RUN gem install bundler WORKDIR /tmp ADD Gemfile Gemfile ADD Gemfile.lock Gemfile.lock RUN bundle install ENV APP_HOME /myapp RUN mkdir -p $APP_HOME WORKDIR $APP_HOME ADD . $APP_HOME
Dokerfileで使用している命令について軽く説明します。
FROM(必須)
コンテナのベースとなるイメージを指定します。
DockerHubで公開されているイメージや、自作のイメージも指定できます。
ENV
環境変数を設定します。
RUN
FROMで指定したイメージ上で、コマンドを実行します。
パッケージのインストールなどに用います。
WORKDIR
作業するディレクトリを変更します。
ADD
指定したファイルやディレクトリをコンテナ内にコピーします。
※上記以外にも命令はいくつかあるのでご興味があれば公式ドキュメントを参照ください。
Gemfile作成
今回はversion:5.2.0を指定しています。
source 'http://rubygems.org' gem 'rails', '~> 5.2.0'
Gemfile.lockを作成
Gemfile.lockが必要なので、空のファイルを作成しておきます。
$ touch Gemfile.lock
docker-compose.yml作成
複数のコンテナを一括管理するための構成管理ファイル。
docker-compose up
コマンドで記述したサービスが全て立ち上がります。
今回はRubyとMySQLの2つのコンテナの設定をします。
version: '3.4' services: db: image: mysql:5.7.17 ports: - "3306:3306" volumes: - ./docker/mysql/volumes:/var/lib/mysql env_file: .env.dev web: build: context: . dockerfile: ./docker/rails/Dockerfile command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" ports: - "3000:3000" volumes: - .:/myapp environment: RAILS_ENV: development env_file: .env.dev depends_on: - db
上の記述について軽く解説します。
version
Compose ファイルのバージョンを指定できます。
image
ベースイメージを指定します。
ports
ホスト側とコンテナ側の両方のポートを指定できます。(ホスト:コンテナ)
コンテナポートのみを指定した場合は、ホスト側のポートはランダムで指定されます。
volumes
ボリュームをマウントするときに指定します。
env_file
指定したファイルから環境変数を追加します。
depends_on
コンテナの作成順序と依存関係を決められます。
※開始の順序を制御するだけで、コンテナ上のアプリケーションが利用可能になるまで待つという制御は行いません。
※上記以外にも命令はいくつかあるのでご興味があればこちらについても公式ドキュメントを参照ください。
.env.dev作成
パスワードは別で管理したいため、.env.devを作成します。
ここに任意のユーザーとパスワードを設定します。
MYSQL_USER=**** MYSQL_PASSWORD=**** MYSQL_ROOT_PASSWORD=****
Railsアプリケーション作成
docker-compose run
コマンドでweb
コンテナの中でrails new
コマンドを実行します。
ここでdatabaseにMySQLを指定します。
$ docker-compose run --rm web rails new . --force --database=mysql --skip-bundle
イメージをビルド
$ docker-compose build
config/database.ymlを編集
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: <%= ENV['MYSQL_ROOT_PASSWORD'] %> host: db development: <<: *default database: development
コンテナを起動
下のコマンドでRailsサーバーとMySQLサーバーを起動してくれます。
$ docker-compose up
データベースを作成
最初はデータベースがまだ作られていないので、以下のコマンドでデータベースを作成します。
$ docker-compose run --rm web rake db:create
http://localhost:3000 にアクセス
なんとかRailsが動いていることが確認できました。
まとめ
今回はDockerを用いて、Rails+MySQLの環境構築を試してみました。
Dockerに関しての知識があまりなくても、最低限ですがRails+Mysqlの環境構築はできました。
個人的にはDockerの学習は、コンテナを立ち上げるまでは学習コスト低めだと思いますが、実際の運用にはもっと多くのノウハウが必要なので、総合して学習コストは高いのかなと感じました。
しかしその反面、他の作業者と同じ環境が簡単に用意できるのはとても魅力的だと感じました。
まだDockerを触ったことがない方はぜひ触ってみてはいかがでしょうか。
ハウテレビジョンでは絶賛エンジニア採用中です!
ここまで読んで頂きありがとうございます。
Docker、Rails、ReactNative、Goなどを業務で使ってみたいエンジニアの方がいらっしゃいましたら、ぜひとも一度オフィスに遊びに来てお話しましょう!
ご連絡はこちらからお願いします!