📖
Dockerを使ってRubyの開発環境を構築してみました
はじめに
こんにちは!ご訪問いただきありがとうございます!
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」の間に「-」が抜けてるかもしれません。
しんやさん✨
初コメントありがとうございます!とっても嬉しいです!
実は僕もコマンドに関しては不安な部分がありましたので、執筆前に公式ドキュメントなどを確認しました。
結論としては、意図的に
docker compose
の記述をしています。というのも、2021年後半に
compose
コマンドをサポートしたdocker Compose V2のリリースにともない、以前まで主流であったdocker-compose
の代替として、docker compose
での実行が可能になりました。最初は互換性の問題でエラーなどが発生することもありましたが、現在では公式のドキュメントでも
docker compose
を使用しており、Docker社としてもcompose
コマンドを使うことを推奨しているようです。公式ドキュメント
Compose V2の方針について
ありがとうございます。恥ずかしながら存じませんでした。composeコマンド使うようにします。