DockerでRuby学習用の環境を構築する

## はじめに:
今回は『プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで』(通称:チェリー本🍒)でRubyの文法などを学習するための学習環境をDockerで構築するにあたって、『せっかくなら自分のアウトプットも兼ねて技術記事を書こう』ということで記事にまとめることにしました。

本記事では環境構築に必要なファイルの準備など実際にどのようにDockerを使って環境構築をしたのかをご紹介します。

初めての技術記事執筆で内容や文章に拙いところがあると思いますがそこはご容赦ください。

## なぜDocker環境での構築を考えたのか？:
Dockerを使うことで、どのマシンでも同じ環境を構築できるというメリットがあります。
Dockerコンテナは、アプリケーションが動作するために必要なソフトウェアやライブラリ、設定をすべて一つのパッケージにまとめているため、環境依存の問題を回避できます。例えば、「自分のマシンでは動くけど、他の人のマシンでは動かない」といたトラブルを避けられます。

# 本文
## 作業用ディレクトリの作成:
```bash
mkdir study_ruby
cd study_ruby
```
- `mkdir study_ruby`：mkdirで作業ディレクトリを作成
- `cd study_ruby`：cdで作業用ディレクトリに移動

## 必要なファイルの準備:
環境構築に必要なファイルを作成します。
```bash
touch Dockerfile docker-compose.yml Gemfile Gemfile.lock # touchでファイルを作成
ls　 # lsでstudy_rubyディレクトリの中身を確認
```
- `Dockerfile`：Dockerイメージを作成するためのテキストファイル
- `docker-compose.yml`：複数のDockerコンテナを一括で管理・起動するための設定ファイル
- `Gemfile`：Railsアプリで必要なライブラリ（Gem）をリスト化した設定ファイル
- `Gemfile.lock` ：Gemfileで指定したライブラリの「正確なバージョン」を記録して、環境を再現するためのファイル

## 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`

　   ：ベースとなるイメージを指定

- `RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs`

　   ：Rubyに必要なパッケージをインストール

- `WORKDIR /app`

　   ：コンテナ内の作業ディレクトリを`/app`に設定

- `COPY Gemfile /app/Gemfile`

　   ：ローカルのGemfileをコンテナの`/app/Gemfile`にコピー

- `COPY Gemfile.lock /app/Gemfile.lock`

　   ：ローカルのGemfile.lockをコンテナの`/app/Gemfile`にコピー

- `RUN bundle install`

　   ：必要なRubyのライブラリ（Gem）をインストール

- `ENV LANG=ja_JP.UTF-8`

　   ：コンテナ内のデフォルトの言語を日本語に設定

- `ENV TZ=Asia/Tokyo`

　   ：タイムゾーンを**東京（日本時間）**に設定

## docker-compose.ymlの作成:
docker-compose.ymlを作成します。
```docker
version: '3'
services:
  web:
    build: .
    ports:
      - 3000:3000
    volumes:
      - .:/app
    tty: true
    stdin_open: true
```
- `version: '3'`

　   ：Docker Composeファイルのバージョンを指定

- `services:`

　   ：セクション名

- `web:`

　   ：アプリケーションのWebサーバーを動かすサービスの名前

- `build: .`

　   ：現在のディレクトリ（**`.`**）にあるDockerfileを使ってコンテナイメージをビルド

- `ports:`
      `- 3000:3000`

　   ：ホスト（自分のPC）のポートと、コンテナ内のポートを対応づける設定

    ホストの3000番ポートにアクセスすると、コンテナの3000番ポートにリクエストが届く

- `volumes:`
      `- .:/app`

　   ：ホストマシンとコンテナでファイルを共有する設定

- `tty: true`

　   ：TTY（ターミナルの仮想セッション）を有効にする設定
      docker-compose up したコンテナを起動させ続ける

- `stdin_open: true`

　   ：標準入力を開いたままにする設定

## Gemfileの作成:
```Gemfile
source "https://rubygems.org"
ruby "3.2.2"
```
- `source "https://rubygems.org"`

　   ：Gemをダウンロードする場所を指定

- `ruby "3.2.2"`

　   ：使用するRubyのバージョンを指定

## Gemfile.lockについて:

Gemfile.lockは空白でOK！

Gemfileとセットで必要となってくるので用意します。

## コンテナの構築・起動:
作成したディレクトリ(study_ruby)で下記のコマンドを入力し、コンテナをバックグラウンドで構築・起動します。
```bash
docker compose up -d
```
:::note warn
ポイント
必ずDockerが起動していることを確認してください。
:::

## コンテナに入る:
コンテナの構築・起動が完了したら、下記のコマンドを入力しコンテナに入ります。
```bash
docker compose exec app bash
```

## 動作確認：
test.rbを作成してコンテナ内で実行してみましょう。
```test.rb
def hello_world
  puts 'Hello World!!'
end

hello_world
```
```bash
ruby test.rb
```
Hello World!! と返ってきたら動作確認は完了です。

## コンテナの停止・削除・破棄:
コンテナから出て、削除・破棄をします。
```bash
exit
docker-compose down
```
- exit：コンテナから出る
- docker compose down：コンテナを停止・削除・破棄する

## 終わりに:
最後までご覧いただきありがとうございました。
Dockerではコンテナ内でアプリケーションを動作させるため、ホストの開発環境を汚すことなく、複数の異なる環境を簡単に切り替えて管理することができます。
これからも技術のアウトプットで技術記事を定期的に執筆しようと思います。