📖

Dockerを使ってRubyの開発環境を構築してみました

2023/04/19に公開
3

はじめに

こんにちは!ご訪問いただきありがとうございます!
Dockerを使った環境構築シリーズ第1弾です!

先日、Rubyの学習のためにDcokerを使って環境構築をしました。
本記事では、環境構築に必要なファイルの準備からHello Rubyの出力まで、実際にどのようにDockerを使って環境構築をしたのかをご紹介します。

Dockerを使っての環境構築に関心をお持ちで、情報が足りず困っているという方のヒントになれば嬉しいです。

作業用ディレクトリの作成

まずは、任意の階層に作業用ディレクトリを作成します。

bash
mkdir ruby_study
cd ruby_study
  • mkdir ruby_study
    作業用ディレクトリ(ruby_study)を作成
  • cd ruby_study
    作業用ディレクトリ(ruby_study)に移動

必要なファイルの準備

環境構築にあたり必要なファイルを準備します。

bash
touch Dockerfile docker-compose.yml Gemfile Gemfile.lock
ls
code .
  • touch Dockerfile docker-compose.yml Gemfile Gemfile.lock
    各ファイルをまとめて作成
  • ls
    ファイルが作成されているかディレクトリの中身を確認
  • code .
    VSCodeを開く(設定していない方はいつも通りの手順で開いてください)

Dockerfileの作成

Dockerfileを作成します。

Dockerfile
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
ENV LANG=ja_JP.UTF-8
ENV TZ=Asia/Tokyo
  • FROM ruby:3.2.2
    Dockerイメージとバージョンを指定
  • RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
    Rubyの実行に必要なパッケージをインストール
  • WORKDIR /app
    コンテナ内で作業するディレクトリを指定
  • COPY Gemfile /app/Gemfile
    ホストマシンからGemfileをコンテナ内にコピー
  • COPY Gemfile.lock /app/Gemfile.lock
    ホストマシンからGemfile.lockをコンテナ内にコピー
  • RUN bundle install
    bundle installコマンドを実行
  • ENV LANG=ja_JP.UTF-8
    環境変数LANGを設定
  • ENV TZ=Asia/Tokyo
    環境変数TZ(タイムゾーン)を設定

docker-compose.ymlの作成

docker-compose.ymlを作成します。

docker-compose.yml
version: '3.7'
services:
  app:
    build: .
    tty: true
    ports:
      - 3000:3000
    volumes:
      - .:/app
  • version: '3.7'
    Docker Composeのバージョンを指定
  • services:
    セクション名
  • app:
    サービスの名前を設定
  • build: .
    ビルドするDockerfileのPathを指定
  • tty: true
    コンテナの起動時にttyを有効化する設定
  • ports:
     - 3000:3000
    ホストマシンのポート3000をコンテナのポート3000にマッピングする設定
  • volumes:
     - .:/app
    ホストマシンとコンテナでファイルを共有する設定(同期みたいなイメージ!)

【参考】DBを使用する場合

docker-compose.yml
version: '3.7'
services:
  app:
    build: .
    tty: true
    ports:
      - 3000:3000
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres:14.4-alpine
    ports:
      - 5432:5432
    volumes:
      - ../ruby_study_db/postgres/init.d:/docker-entrypoint-initdb.d
      - ../ruby_study_db/postgres/pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
      TZ: "Asia/Tokyo"
    hostname: ${DB_HOSTNAME}
    restart: always
    user: ${DB_USER}
  pgadmin:
    image: dpage/pgadmin4
    restart: always
    ports:
      - 81:80
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
    volumes:
      - ../ruby_study_db/pgadmin:/var/lib/pgadmin
    depends_on:
      - db

コンテナの構築・起動

docker-compose.ymlファイルがあるディレクトリで下記のコマンドを入力し、コンテナをバックグラウンドで構築・起動します。

bash
docker compose up -d

コンテナに入る

コンテナの構築・起動が完了したら、下記のコマンドを入力しコンテナに入ります。

bash
docker compose exec app bash

Hello Ruby!

コンテナに入った状態で、app.rbを作成し、ターミナルから実行してみましょう。

app.rb
def hello_ruby
  puts "Hello Ruby!"
end

hello_ruby
ruby app.rb

コンテナの停止・削除・破棄

コンテナから出て、削除・破棄をします。

bash
exit
docker compose down
  • exit
    コンテナから出る
  • docker compose down
    コンテナを停止・削除・破棄する

終わりに...

ここまでご覧いただき、ありがとうございました。
Dockerを使用することでローカルマシーンをクリーンに保ちつつ、最適なRubyの開発環境を手間なく構築することができます。
ぜひ、Dockerでの環境構築に困った時は、またこの記事まで戻ってきてください。

Discussion

しんやしんや

「docker」と「compose」の間に「-」が抜けてるかもしれません。

Ren IchinoseRen Ichinose

しんやさん✨

初コメントありがとうございます!とっても嬉しいです!
実は僕もコマンドに関しては不安な部分がありましたので、執筆前に公式ドキュメントなどを確認しました。

結論としては、意図的にdocker composeの記述をしています。

というのも、2021年後半にcomposeコマンドをサポートしたdocker Compose V2のリリースにともない、以前まで主流であったdocker-composeの代替として、docker composeでの実行が可能になりました。

最初は互換性の問題でエラーなどが発生することもありましたが、現在では公式のドキュメントでもdocker composeを使用しており、Docker社としてもcomposeコマンドを使うことを推奨しているようです。

公式ドキュメント
https://docs.docker.com/get-started/08_using_compose/

Compose V2の方針について
https://www.docker.com/blog/announcing-compose-v2-general-availability/

しんやしんや

ありがとうございます。恥ずかしながら存じませんでした。composeコマンド使うようにします。