webアプリをDocker化する方法

## はじめに
今回はdocker-composeで既存のrailsアプリをDocker化する方法をまとめました。
Dockerの学習がメインのためRubyやRailsに詳しくなくても実施できます！

### docker-composeとは
複数のコンテナを組み合わせて１つのアプリケーションとして構成を定義するファイルです。
`docker-compose`を使用ことで以下のメリットがあります。
1. docker run コマンドを短くすることができる
1. 複数のコンテナをまとめて起動できる
`docker run`コマンドは複数のオプションを使用する場合があるためどうしても長くなってしまいます。それをdocker-composeが解消してくれます！
※docker-composeには`docker-compose.yml`が必要です。

### 環境
以下の環境で構築してます。
```
Rails 7.0.6
ruby  3.2.2
postgres 12
```

### 手順
Docker化するのにRailsとpostgres２つのコンテナを立てるためdocker-composeを使用しています。
はじめに一通りの流れを説明します。
1. `Dockerfile`の作成
1. `docker-compose.yml`の作成
1. `database.yml`の編集
1. コンテナを起動
1. ブラウザ上で動作確認を実施



### 事前準備
- 既存のrailsアプリの準備
- Dockerを起動させておく



## Dockerfileの作成
Dockerfileとはアプリケーションのビルドに必要な設定(動作させるのに必要なサーバー等の)が書かれたファイルです。以下がファイルの中身です。
[こちらの記事](https://qiita.com/kkyouhei/items/653760627bf9d4bc9e71)を元に作成しています。
```ruby:dockerfile
# ベースイメージの指定
FROM ruby:3.2.2

# パッケージのインストールと更新
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y postgresql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# 作業ディレクトリの指定
WORKDIR /myproject

# fileの追加
ADD Gemfile /myproject/Gemfile
ADD Gemfile.lock /myproject/Gemfile.lock

# gemをインストールする際のコマンド
RUN bundle install　　　

ADD . /myproject

```
※Dockerfileで指定するベースイメージは、プロジェクトのRubyバージョンに合わせておく必要があるため`Gemfile`(Railsアプリで利用するgemの一覧を管理するファイル)を確認しましょう。

```ruby:gemfile
ruby "3.2.2"gem 
"rails", "~> 7.0.6"
```

## docker-compose.ymlの作成
次はdocker-composeを使用するために`docker-compose.yml`を作成します。これはアプリケーションを構成するサービスを記載し、それらを一括で実行してくれるものです。


```docker-compose.yml
# バージョンを指定
version: '3'

services:
# dbコンテナの設置
  db:
    container_name: rails-docker-db
    image: postgres:12
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
    volumes:
      - type: volume
        source: rails-docker-db-volume
        target: /var/lib/postgresql/data
# webコンテナの設置
  web:
    build:
      context: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
    volumes:
      - type: bind
        source: .
        target: /myapp
    ports:
      - '3000:3000'     
    depends_on:
      - db

volumes: 
  rails-docker-db-volume:
```

## database.ymlの編集
```ruby:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>
  port: 5432  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development
```
デフォルトではなかった`host` `username` `password`を今回追加しています。
usernameとpasswordは環境変数に置き換えています。


## コンテナの作成と実行
ここまでできたらいよいよコンテナを立ち上げます。
以下の順でコマンドを実行してください。
イメージの作成
```
docker-compose build
```
 コンテナの作成と起動
```
docker-compose up -d
```
コンテナの中に入る
```
docker-compose exec web bash
```
dbの作成
```
rails db:create
```
dbの更新
```
rails db:migrate
```
ブラウザ上で`lacalhost:3000`にアクセス

ブラウザ上でアプリケーションが確認できれば完成です。
これでrailsアプリをDocker化する手順は以上です。

## さいごに
最後まで読んでいただきありがとうございました。
自己学習用の記事ではありますが、同じくdockerやrailsを学習している方の参考になれれば幸いです。

以下、参考教材・記事になります。
[Udemy「米国AI開発者がゼロから教えるDocker講座」](https://www.udemy.com/course/aidocker/)
[実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本](https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59)
[既存のRailsアプリにDockerを導入する手順](https://qiita.com/kenz-dev/items/b9e716204e0cd0cea447)