Dockerを利用したRuby/Railsの開発環境の作り方

もちろん、以下にMarkdown形式で記事を出力いたします。

---

# Dockerを利用したRuby/Railsの開発環境の作り方

## 目次

1. [はじめに](#はじめに)
2. [Dockerの基本](#dockerの基本)
3. [Dockerfileの基礎](#dockerfileの基礎)
4. [Dockerfileの作成フロー](#dockerfileの作成フロー)
5. [Ruby/Railsの開発環境の構築](#rubyrailsの開発環境の構築)
6. [付録: 完成したDockerfile](#付録-完成したdockerfile)

---

# Dockerを利用したRuby/Railsの開発環境の作り方

## はじめに

### Dockerのメリット

Dockerを使用する最大のメリットは、環境の再現性です。Dockerを使用することで、開発環境を短時間で構築でき、その環境を他のメンバーや環境で簡単に再現することが可能です。これにより、「私のマシンでは動くけど…」という問題が大幅に減少します。

### この記事の対象読者

この記事は、RubyやRailsでの開発経験はあるものの、Dockerについては初心者で、その利用方法や設定に迷っている方を対象としています。

## Dockerの基本

### 基本的な用語

- **イメージ (Image)**: イメージは、アプリケーションやサービスを実行するための静的なテンプレートであり、必要なファイルや依存関係をすべて含んでいます。一般に、Dockerfileからイメージをビルドします。

- **コンテナ (Container)**: コンテナは、イメージを実行中の状態、つまり動的なインスタンスです。コンテナは軽量で、迅速に起動でき、分離されているため他のコンテナとの干渉はありません。

- **Dockerfile**: Dockerfileは、Dockerイメージを構築するためのスクリプトファイルです。このファイルには、ベースとなるイメージ、インストールするソフトウェア、実行するコマンドなど、イメージの作成に関する指示が書かれています。

- **ボリューム (Volume)**: ボリュームは、コンテナの外部でデータを保持するための仕組みで、コンテナが破棄されてもデータが残るように設計されています。これにより、コンテナ間でデータを共有したり、永続的なデータストレージとして使用することができます。

- **Docker Hub**: Docker Hubは、Dockerイメージの公開リポジトリで、多くのオープンソースやコミュニティのイメージがホスティングされています。自分で作成したイメージを公開したり、他のユーザーが公開しているイメージを取得して使用することができます。

## Dockerfileの基礎

Dockerfileは、Dockerイメージの作成手順を記述するためのファイルです。ここでは、基本的な命令や構文について詳しく見ていきましょう。

### `FROM`

```Dockerfile
FROM ubuntu:latest
```

この命令は、ベースイメージを指定します。ここでは`ubuntu:latest`をベースイメージとして使用しています。

### `ENV`

```Dockerfile
ENV RUBY_VERSION 2.7.6
ENV DEBIAN_FRONTEND=noninteractive
ENV TIMEZONE="Asia/Tokyo"
```

環境変数を設定します。上記の例では、後の命令で使用する`RUBY_VERSION`やタイムゾーン、非対話型インターフェースを指定しています。

### `RUN`

```Dockerfile
RUN apt-get update && apt-get install -y ...
```

RUN命令は、イメージの作成中にコマンドを実行します。この例では、Ubuntuのパッケージを更新し、必要なパッケージをインストールしています。

環境変数はアプリケーションの設定や動作を調整するための重要な要素です。`ENV`を使用して、これらの変数を設定できます。

## Dockerfileの作成フロー

Dockerfileの作成は、実際の手作業のような逐次的なフローで行います。まず、ベースとなるイメージを選択し、その上で必要な設定やソフトウェアのインストールを行いながら、その都度Dockerfileを更新していきます。以下はその具体的な手順です。

1. **ベースイメージの選定**: まず、`ubuntu:latest`のようなベースとなるイメージを選択してDockerfileに記述します。

    ```Dockerfile
    FROM ubuntu:latest
    ```

2. **イメージのビルド**: 下記のコマンドを使用してDockerfileからイメージをビルドします。
   
    ```
    docker build -t myimage .
    ```

3. **コンテナの起動**: ビルドしたイメージからコンテナを起動します。

    ```
    docker run -it --name mycontainer myimage /bin/bash
    ```

    これでコンテナ内のシェルに入ることができます。

4. **ソフトウェアのインストール**: コンテナ内で、例えば`npm`をインストールします。

    ```
    apt-get update
    apt-get install npm
    ```

5. **Dockerfileの更新**: 上記の手順でインストールしたソフトウェアのコマンドをDockerfileに追記します。

    ```Dockerfile
    RUN apt-get update && apt-get install -y npm
    ```

6. **再度イメージのビルドとコンテナの起動**: 新しい設定やソフトウェアをDockerfileに追加した後は、再度イメージをビルドし、新しいコンテナを起動して動作を確認します。

このようなフローを繰り返すことで、RubyやRailsの開発に必要な環境を段階的に整えていくことができます。初めは手間がかかるかもしれませんが、このフローに慣れると、新しい環境の構築や既存の環境の更新が非常にスムーズに行えるようになります。

## Ruby/Railsの開発環境の構築

ここでは、最終的に作成したDockerfileを使用して、Ruby/Railsの開発環境の構築手順を説明します。

### rbenvとruby-buildのインストール

```Dockerfile
RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv && \
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc && \
    echo 'eval "$(rbenv init -)"' >> ~/.bashrc && \
    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build && \
    echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc && \
    . ~/.bashrc && \
    rbenv install $RUBY_VERSION && \
    rbenv global $RUBY_VERSION
```

上記のコードは、`rbenv`と`ruby-build`をインストールし、設定して指定したRubyバージョンをインストールします。これにより、コンテナ内でRubyが利用できるようになります。

## 付録: 完成したDockerfile

以下は、この記事を通じて完成したDockerfileの内容です。このDockerfileを使用することで、Ruby/Railsの開発環境を効率的に構築することができます。

```Dockerfile
# ベースイメージとしての指定
FROM ubuntu:latest

# 環境変数の設定
ENV RUBY_VERSION 2.7.6
ENV DEBIAN_FRONTEND=noninteractive
ENV TIMEZONE="Asia/Tokyo"

# 必要なパッケージのインストールとタイムゾーンの設定
RUN apt-get update && \
    apt-get install -y \
    tzdata \
    curl \
    build-essential \
    default-libmysqlclient-dev \
    nodejs \
    npm \
    imagemagick && \
    ln -fs /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \
    dpkg-reconfigure --frontend noninteractive tzdata && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* 

# Node.jsのパッケージをインストール
RUN npm install -g gulp-cli \
    bower \
    eslint \
    yarn \
    babel-eslint \
    eslint-plugin-angular

# rbenvとruby-buildのインストール、そしてRubyのインストール
RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv && \
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc && \
    echo 'eval "$(rbenv init -)"' >> ~/.bashrc && \
    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build && \
    echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc && \
    . ~/.bashrc && \
    rbenv install $RUBY_VERSION && \
    rbenv global $RUBY_VERSION
```

このDockerfileを自身のプロジェクトにコピーして、`docker build`コマンドを使用してDockerイメージをビルドすることができます。