はじめまして、こんにちは!
ローカル環境で作成中の既存アプリケーションをDocker環境に移行する手順について、私自身が実施した内容です。初学者ですが頑張って環境構築しましたので、ふり返りのためにも記録しておきたいと思います!
環境によっては手順どおりには行かないと思います。
またプログラミング初学者で勉強の為に試行錯誤して実施しておりますので、誤っている事、不要なことがあるかもしれません。その際はご指摘頂けるとありがたいです。
環境
- Ruby 2.6.5
- Rails 6.0.0
- MySQL 5.6
事前準備
- Docker Desctopをインストール
- Dokerデーモンが起動している状態
Docker Desctopは「Stable」となっている方をダウンロード(無料、安定バージョン)します。
Dockerデーモンは、mac起動時に自動で立ち上がります。上部のメニューバーのクジラのアイコンが表示されて「Docker Desctop is running」となっていれば大丈夫です。
手順①既存アプリのディレクトリに以下3つのファイルを配置
- Dockerfile
- docker-compose.yml
- entrypoint.sh
アプリケーションのディレクトリ直下に3つのファイルを新規作成する
▼Dockerfile記述内容
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記述内容
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
#!/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
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」コマンドでdbの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に接続
- 標準を選んで、ホストに自身を表す「127.0.0.1」
- パスワードはdocker-compose.ymlに記載のパスワード
- ポートはdocker-compose.ymlに記載のポート番号
以上です!
localhost:3000に接続するとアプリケーションを確認できると思います!