Docker Composeを使って既存のRailsアプリのDocker化する方法

## はじめに
今回はDockerとDocker Composeの学習をして、既存のRailsアプリをDocker化する手順をまとめてみました。
なるべくわかりやすくまとめていきたいと思いますのでよかったら最後まで見ていってください。


### 開発環境について
今回動作確認が取れた環境は以下になります。
**各種バージョン**
```
rails-7.0.6
ruby 3.2.2
PostgreSQL 12
```

**開発環境**
- CPU Apple M2
- OS MacOS 13.4.1

ターミナルおよびテキストエディタは`VScode`を使用しています。
また、上記記載以外のバージョンやOSなどでは動作確認を行なっていないため、予めご了承ください。


### Docker化の手順
まず大まかにDocker化する手順から見ていきたいと思います。

:::note info
今回はGitHubにあるDocker化されていないrailsアプリのリポジトリをクローンしてきてDocker化する手順を記載していこうと思います。
:::

##### 手順
1.GitHubにあるリポジトリをクローンしてローカル環境に置く　
2.新規Dockerfileを作成する
3.新規Docker-compose.ymlを作成する
4.database.ymlファイルを編集する
5.Docker Composeを使用してコンテナを作成し実行する
6.ブラウザ上でlocalhost:3000にアクセスして動作確認をする


上記のような流れに沿ってDocker化を進めていきます。

それでは早速手順ごとに細かく説明していこうと思います。


###### 1.GitHubにあるリポジトリをクローンしてローカル環境に置く　
GitHubで使いたいコードをクローンします。
```
$ git clone <使いたいリポジトリのSSH key.>
```

使用したいリポジトリに移動する
```
$ code <使用したいリポジトリ名>
```

##### 2.新規Dockerfileを作成する
`touch`コマンドを使って新規Dockerfileを作成する
```
$ touch Dockerfile
```

作成したDockerfileを使ってDocker imageを作成する
Dockerfileの中はこんな感じになります

```Dockerfile
FROM ruby:3.2.2

RUN apt-get update -qq && apt-get install -y \
  build-essential \
  libpq-dev \
  nodejs \
  postgresql-client \
  yarn

WORKDIR /rails-docker

COPY Gemfile Gemfile.lock /rails-docker/

RUN bundle install

```

##### 3.新規docker-compose.ymlを作成する
2と同様に`touch`コマンドを使ってdocker-compose.ymlファイルを作成する
```
$ touch docker-compose.yml
```
作成したファイルの作成をしていきます。
docker-composeを使うことによって、複数のコンテナの管理を効率的に行う事ができるメリットがあります！
```docker-compose.yml
# Docker Composeのバージョンを指定する
version: '3'

volumes:
  db-data:

services:
  # webコンテナの設定
  web:
    # カレントディレクトリのDockerfileでビルドする
    build: .
    # railsサーバーの起動時の設定を行う
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    # ポートの設定を行う(railsのデフォルトのポートは3000番)
    ports:
      - '3000:3000'
    # カレントディレクトリのファイル・フォルダを/rails-dockerにマウントする
    volumes:
      - '.:/rails-docker'
    # 環境変数の設定を行う
    environment:
      - 'DATABASE_PASSWORD=postgres'
    # 出力をプリティーにする
    tty: true
    # 標準入出力とエラー出力をコンテナと結びつける
    stdin_open: true
    # コンテナの依存関係を指定する
    depends_on:
      - db
    # リンクの指定をする
    links:
      - db

  # データベースコンテナの設定
  db:
    # postgresの12を指定する
    image: postgres:12
    # db-dataを/var/lib/postgresql/dataにマウントして永続化させる
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    # 環境変数の設定をする
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
      - 'POSTGRES_HOST_AUTH_METHOD=trust'
```

##### 4.database.ymlファイルを編集する
config/database.ymlの編集をする

```database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```
##### 5.Docker Composeを使用してコンテナを作成し実行する
docker imageをbuildする
```
$ docker-compose build
```
コンテナを作成し起動する
```
$　docker-compose up -d
```
作成したコンテナの中に入る
```
$ docker-compose exec web bash
```
DBの作成をする
```
$ rails db:create
```
DBの更新をする
```
$ rails db:migrate
```

##### 6.ブラウザ上でlocalhost:3000にアクセスして動作確認をする
最後にブラウザ上でlocalhost:3000にアクセスできれば成功になります。
![スクリーンショット 2023-07-28 22.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335067/3dc6135b-a4fb-1cb2-3fa3-a7b48356df5c.png)


### よく使うdockerとdocker-composeのコマンド一覧
よく使うコマンドの一覧をまとめておきます。
必要に応じてお使いください。

```
# イメージを作成する
$ docker-compose build 

# コンテナを作成して起動する
$ docker-compose up

# コンテナを停止する
control + c

# コンテナの起動(バックグラウンド)
$ docker-compose up -d

# コンテナを停止する(バックグラウンド)
$ docker-compose stop

# コンテナを停止して削除する
$ docker-compose down

# webコンテナにログインする
$ docker exec -it appname_web_1 bash

# イメージの一覧を出力する
$ docker images

# コンテナの一覧を出力する
$ docker ps -a

```

### 最後に
今回はDocker Composeを使ってRailsアプリのDocker化の方法についてまとめてきました。
Dockerを使用することによって簡単に環境を構築することができます。
今回は簡単なアプリでしたが、複雑なアプリになるともっとファイルの中身も複雑になっていくのかなと思いますので、しっかりと書けるようにしていきたいです。

最後までご覧いただきありがとうございました。


### 参考文献
[クィックスタート: Compose と Rails](https://docs.docker.jp/compose/rails.html)
[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)