webアプリをdocker化する方法

<h3>1.はじめに</h3>
これからwebアプリをdockerとdocker composeでwebアプリをdocker化する方法をについて紹介します。
<br>今回はGitHabにあるtemplateを使ったdocker化の方法を見ていきましょう。
<br>大まかな流れは以下になります。

<ol>
<li>rails_docker_tempateリポジトリ(https://github.com/ihatov08/rails7_docker_template)を使ってリポジトリを作る。</li>
<li>git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORYコマンドを実行してローカルクローンを作成する。</li>
<li>Dockerfileとdocker-compose.ymlを作成する</li>
<li>Dockerfile、docker-compose.yml、database.ymlを編集する</li>
<li>docker-compose upを実行後、別のターミナルで、docker-compose run web rake db:migrateを実行する。</li>
<li>Rails上でアプリが起動する</li>
</ol>

この手順でdocker化をしていきます。
<h3>2.git cloneしてみよう！</h3>
git cloneすることで既存のrailsアプリを自分のローカルリポジトリに持ってくることができます。やり方はすごく簡単です。<br>rails_docker_tempateに移動して

`Use this template`を選択して `Create a new repository` 
を押してください。

![レポジトリテンプレ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994039/deb65916-c0a2-446d-a62e-b2f6a140a40a.png)

すると、リポジトリの作成画面が出てくるので`Repository name*`のところに名前を入力してリポジトリを作成してください。
作成したらリポジトリに移動してcodeを押してHTTPSのところのURLをコピーします。そして、ターミナルに移動してgit clone と入力してその後にURLを貼り付けます（このように、[git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY]になっていればOK！）

![git clone　イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994039/805825cb-93b0-4d54-a350-5a1c8067adb0.png)

実行するとローカルリポジトリにtemplateがクローンされます。
rails-dockerリポジトリに移動してlsコマンドで全てファイルがクローンされていれば成功です。

<h3>3.必要なファイルを作成して編集しよう！</h3>
まず、touchコマンドでDockerfileとdocker-compose.ymlを作成します。
<br>そして、Dockerfileの内容を以下のように編集します。

```Docker:Dockerfile
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /rails-docker
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
RUN bundle install
ADD . /rails-docker

```
Dockerfileを書くときに気をつけることはrubyのバージョンです。
バージョンが古いと上手くdocker-imageが作られずにコンテナが起動できないといったことが起きるので注意が必要です。
<br>次にDocker-compose.ymlの編集です。
```Docker:Docker-compose.yml
 services:
  db:
    image: postgres:12
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails-docker
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    tty: true
    stdin_open: true 
    ports:
      - "3000:3000"
    depends_on:
      - db
```

ここで気をつけることは、dbの`eniroment`に- `POSTGRES_PASSWORD=postgres`を追加してパスワードを指定することです。Web側だけ指定していてもエラーが出るので両方に指定しましょう。
<br>次にdatabase.ymlの編集です。
```Docker:database.yml
 default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: postgres
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
  <<: *default
  database: postgres
test:
  <<: *default
  database: postgres
production:
  <<: *default
  database: postgres
  username: rails-docker
  password: <%= ENV["RAILSDOCKER_DATABASE_PASSWORD"] %>

```
ここで気をつけることはデータベースの接続設定を追加することとデータベースの名前の設定です。データベースの接続設定を追加しないとアプリが動きません。
また、データベースの名前を一致させることで`docker-compose up`をするとデータベースが作られます。ここでデータベースができていなかった場合はlocalhost:3000の画面にエラーが出て`create`ボタンが表示されます。(`docker-compose up` コマンドを実行するとlocalhost:3000にアクセスできます。)

![db create エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994039/125968e4-e169-4c22-9a40-2a5c681db4f7.png)

ボタンを押すとデータベースは作成されますが、docker-compose up を実行した段階ではデータベースは作成されていません。
データベースを作成するには、名前を一致させることが必要です。

<h3>4.rails上でwebアプリを起動させよう！</h3>
まず、docker-compose upコマンドをターミナルで実行します。
<br>検索の欄にlocalhost:3000と入力します。すると

![migrate エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994039/006486d0-d76e-441f-bf4a-8a8ceb78c617.png)

になると思いますが、この後にターミナルを別で開いて、`docker-compose run web rake db:migrate`を実行すると

![rails アプリ　top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994039/35eb7159-fcea-472f-904a-650b34e28c9c.png)
アプリが開きます！　New taskをクリックすると

![railsアプリ　add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994039/38d80abb-62e9-4fed-be0e-51b581f98919.png)

taskの作成画面が開きます。
編集や削除も簡単にできるので実際に操作して体験してみてください！

<h3>5.最後に</h3>
初めてDockerを触ってDockerfileからコンテナやイメージを作った時はエラーの連続で解決しないんじゃないかと思うエラーもたくさんありました。その時はdockerのエラー文に修正箇所や内容が丁寧に記載されているので読んでみてください。慣れてくるとだんだんエラーの内容も具体的にすぐ分かるようになってきます。私が使っていて驚いたのはrailsとrubyのバージョンを指定していて互換性がない時は、変更するべきバージョンまでエラーに書いてくれているのがすごく助かりました。これからもDockerを使っていく中でエラーがたくさん出ると思いますが、一つずつ丁寧に解決していきます。皆さんもDockerをインストールしてDockerの便利さを体感してみてください！