webアプリケーションをDocker化する方法について

## はじめに
お久しぶりです。takimonです。

今回Dockerの勉強をしました。

最近、Dockerについて勉強する機会がありました。

その中で、RailsのWebアプリケーションをDocker化する手順をまとめたので、皆さんに共有したいと思います。

dockerがわからないと言う方はぜひ以下のサイトからDockerの基本を勉強してみてください。

https://y-ohgi.com/introduction-docker/

https://docs.docker.jp/get-started/toc.html

## WebアプリのDocker化の方法
今回はRailsのアプリを例にDocker化していきます。

Docker化したいWebアプリケーションは皆さんの方で準備してください。

### 事前準備
以下のバージョンで動作するRailsアプリを準備します
```
Ruby: 3.2.2
Rails: 7.0.6
PostgreSQL: 12
```

### 1. Dockerfileとdocker-compose.ymlの作成
**Dockerfile**と**docker-compose.yml**という2つのファイルを新規作成します。これらのファイルが、Dockerを使ってアプリケーションを動かすためファイルになります。

####Dockerfileを作成する
Dockerイメージを構築するための手順を記述するファイルです。アプリケーションが動作するOS環境や、必要なライブラリのインストールなどを定義しています。

```
# ベースとなるRubyイメージを指定
FROM ruby:3.2.2

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
  build-essential \
  libpq-dev \
  nodejs

# 作業ディレクトリを作成して、移動
RUN mkdir /rails-docker
WORKDIR /rails-docker

# GemfileとGemfile.lockをコンテナ内にコピーして、Gemをインストール
ADD Gemfile /rails-docker/Gemfile
ADD Gemfile.lock /rails-docker/Gemfile.lock
RUN bundle install

# 残りのファイルをコンテナ内にコピー
ADD . /rails-docker
```

#### docker-compose.ymlを作成する
複数のDockerコンテナを連携させて動かすための設定ファイルです。
```
services:
  web:
    # 現在のディレクトリのDockerfileを使用してイメージをビルド
    build: .

    # コンテナ起動時に実行するコマンド
    command: bundle exec rails s -p 3000 -b "0.0.0.0"

    # 現在のディレクトリをコンテナの/rails-dockerにマウント
    volumes:
      - .:/rails-docker

    # データベース接続に使用するための環境変数を設定。
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

    # ホストOSのポート3000をコンテナのポート3000に設定
    ports:
      - 3000:3000

    # dbサービスが起動してからwebサービスを起動
    depends_on:
      - db

    links:
      - db
  db:
    # Postgre12.0の公式イメージを使用
    image: postgres:12.0
    # データベースの永続化のためにボリュームをマウント
    volumes:
      - "db-data:/var/lib/postgresql/data"

volumes:
  # db-dataという名前のボリュームを定義
  db-data:

```

### 2. database.ymlを修正
PostgreSQLデータベースに接続できるように、config/database.yml を以下のように修正します。

```
default: &default
  adapter: postgresql
  encoding: unicode
  # Docker Composeで定義したDBサービス名に合わせる
  host: db

  # Docker Composeで設定した環境変数からユーザー名とパスワードを取得
  user: <%= ENV.fetch("POSTGRES_USER") %>
  password: <%= ENV.fetch("POSTGRES_PASSWORD") %>

  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV["MYAPP_DATABASE_PASSWORD"] %>

```
### 3. Docker イメージのビルド

作成したDockerfileとdocker-compose.ymlを元に、Dockerイメージをビルドします。
以下のコマンドを実行してください。

```
docker-compose build
```

### 4. Docker コンテナの起動

イメージのビルドが完了したら、以下のコマンドでDockerコンテナを起動します。

```
docker-compose up
```

### 5. データベースのセットアップ

Railsアプリケーションからデータベースをセットアップする必要があります。以下のコマンドを順に実行してください。

#### データベースの作成
まず、データベース自体を作成します。
```
docker-compose run web rake db:create
```

#### マイグレーションの実行
次に、Railsのマイグレーションを実行してテーブルを作成します。
```
docker-compose run web rake db:migrate
```

### 6. ローカルホストでの接続確認

Web ブラウザで以下の URL にアクセスしてアプリケーションが動作していることを確認します。
http://localhost:3000

## おわりに
いかがでしたでしょうか？

初めてDockerを使ったとき、「こんなに簡単に環境構築できるだ！」と感動したのを覚えています。開発環境のセットアップにかかる時間を大幅に削減できるので、ぜひ皆さんも活用してみてください。

今回はDockerfileやdocker-compose.ymlの中身の詳しい解説は割愛しましたが、これらの設定を理解することは、Dockerを使いこなす上で非常に重要です。
ぜひDockerの公式ドキュメントやチュートリアルなどを参考に、さらに深く学んでみてください。

私もこれからもdockerの勉強を続けていきたいと思います！

## 参考URL

https://y-ohgi.com/introduction-docker/

https://docs.docker.jp/get-started/toc.html