【Docker環境構築/Rails6~,MySQL】ローカル環境で作成中の既存アプリをDocker環境に移行する手順

はじめまして、こんにちは!
ローカル環境で作成中の既存アプリケーションをDocker環境に移行する手順について、私自身が実施した内容です。初学者ですが頑張って環境構築しましたので、ふり返りのためにも記録しておきたいと思います！

環境によっては手順どおりには行かないと思います。
またプログラミング初学者で勉強の為に試行錯誤して実施しておりますので、誤っている事、不要なことがあるかもしれません。その際はご指摘頂けるとありがたいです。

# 環境
- Ruby 2.6.5
- Rails 6.0.0
- MySQL 5.6


# 事前準備
- [Docker Desctop](https://hub.docker.com/editions/community/docker-ce-desktop-mac)をインストール
- Dokerデーモンが起動している状態
 
Docker Desctopは「Stable」となっている方をダウンロード（無料、安定バージョン）します。
Dockerデーモンは、mac起動時に自動で立ち上がります。上部のメニューバーのクジラのアイコンが表示されて「Docker Desctop is running」となっていれば大丈夫です。

# 手順①既存アプリのディレクトリに以下３つのファイルを配置

![スクリーンショット 2020-08-18 0.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630873/1122c48e-d848-7042-27fe-91a702a96666.png)

- Dockerfile
- docker-compose.yml
- entrypoint.sh

アプリケーションのディレクトリ直下に3つのファイルを新規作成する

▼Dockerfile記述内容

```ruby
FROM ruby:2.6.5

APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

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

WORKDIR /myapp
COPY Gemfile ./Gemfile
COPY Gemfile.lock ./Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
```

▼docker-compose.yml記述内容

```yml
version: '3'
services:
  db:
    image: mysql:5.6 #既存アプリとあわせる。ターミナルに「mysqladmin version」で確認
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "4306:3306"  #Sequel ProでDBを確認する為、4306としておく
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
volumes:
  mysql-data:
```

▼entrypoint.sh

```sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

# 手順②config/database.ymlの編集

configディレクトリにあるdatabase.ymlを以下のように編集

▼config/database.yml

```yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db # database.ymlの記述とあわせておく

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

```

# 手順③Dockerイメージの作成

```
% docker-compose build
```

# 手順④MySQLコンテナを起動

```
% docker-compose up -d
```
この時点ではwebは起動してなくてよい。
「docker-compose ps」コマンドでｄｂのStateがUPとなっていればよい。

# 手順⑤DBを作成する

```
% docker-compose run web rails db:create
```
database.ymlをもとにwebコンテナからmysqlコンテナへ接続して、DBを作成する。成功すると下記表示。

```
Created database 'myapp_development'
Created database 'myapp_test'
```

# 手順⑥マイグレーションを実行

```
% docker-compose run web rails db:migrate
```
database.ymlをもとにwebコンテナからmysqlコンテナへ接続して、マイグレーションを実行する。成功していれば下記のような実行結果。

```
== 20200812024158 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0091s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0109s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0120s
== 20200812024158 DeviseCreateUsers: migrated (0.0326s) =======================
```

# 手順⑦webコンテナも起動させる

```
% docker-compose up -d
```

上記実行後、「docker-compose ps」コマンドでweb、db共にUPとなっていれば成功。

# 手順⑧gemのインストール

```
% docker-compose exec web bundle install
```

# 最後に！SequelProに接続

![スクリーンショット 2020-08-18 1.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630873/27b6c3ad-376b-fc59-bea3-f02234b7126a.png)

- 標準を選んで、ホストに自身を表す「１２７.０.０.１」
- パスワードはdocker-compose.ymlに記載のパスワード
- ポートはdocker-compose.ymlに記載のポート番号

以上です！
localhost:3000に接続するとアプリケーションを確認できると思います！

# 参考にさせて頂いた記事

- [既存のRailsアプリにDockerを導入する手順](https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447)
- [既存のRailsアプリをDockerコンテナで動かす方法+sequel proによるDBコンテナ可視化](https://qiita.com/y-suna/items/e52b3af1d80c52b66b31)
- [公式ドキュメント](https://docs.docker.com/compose/rails/)