駆け出しエンジニアの気ままブログ

気になったことについて、調べながら投稿するブログです。

Rails×MySQLのDocker環境構築

今回の概要

Dockerを初めて使って、バックエンドの環境を構築してみました。

最初は難しいと抵抗があったものの、作ってみると意外と楽しい。さらにローカル環境を汚さなくて良いという部分は、とても良かったです。

今回、ルートユーザーで作成しているので、何でもできてしまう危ういDocker環境となっていますが、あくまで個人利用を目的としています。

使用技術

  • M1mac環境(Dockerのplatformで指定する必要ある)
  • Ruby
  • MySQL
  • Docker,Docker-compose

詰まったポイント

基本的に、ネットで落ちている記事やDockerのドキュメントを呼んでいけば大丈夫でした。

M1macの部分は、platformを指定して上げる必要があるので、注意!!!

dockerの主なコマンド

実際に実行するためのコマンドをざっくり紹介します。

意外とコマンドってローカル環境で作る場合と異なります。基本的にdocker composeをつけ忘れないで! docker-compose-はversion3からつけなくても良くなったみたいです。

基本的にDBへの接続をすることは最初の頃は無いと思いますが、コマンドを載せておきます。ルートユーザーになっているので、複数人でつかう場合はルートユーザーで入れないようにしたほうが良いと思いました。なんでもできてしまうのでは?と思っています。(実際にやったことがないのでわかりませんが...)

# docker 起動(初回)
$ docker compose build

# 通常起動
$ docker compose up

# バックグラウンド
$ docker compose up -d

# docker 停止
$ docker compose down

# docker 再起動 gem追加などのとき
$ docker compose restart

# gemfile追加
$ docker compose exec web bundle install

# 初回データ作成
$ docker compose exec web rails db:create RAILS_ENV=development

# migrationファイル追加
$ docker compose exec web rails db:migrate RAILS_ENV=development

# rails console使用時
$ docker compose exec web rails c

# DBコンテナに入る
$ docker-compose exec db bash

# rootユーザになっている場合
$ mysql -u root -p

完成形

Dockerfile

FROM ruby:3.2.0
ENV LANG=ja_JP.UTF-8
ENV TZ=Asia/Tokyo

RUN apt-get update -qq && apt-get install -y nodejs

RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

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 3010

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

docker-compose.yml

version: '3'
services:
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3010 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3010:3010"
    depends_on:
      - db-develop
      - db-test
      - redis
    # コンテナ起動を続けるため
    tty: true
    #標準出力とエラー出力を結びつける
    stdin_open: true
  db-develop:
    image: mysql
    # M1 CPUのためにplatform指定
    platform: linux/amd64
    # DBのレコードが日本語だと文字化けするので、utf8をセットする
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - db-develop-volume:/var/lib/mysql
    # 環境変数
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: myapp_development
      TZ: "Asia/Tokyo"
    ports:
      - "3306:3306"
  db-test:
    image: mysql
    # M1 CPUのためにplatform指定
    platform: linux/amd64
    # DBのレコードが日本語だと文字化けするので、utf8をセットする
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - db-test-volume:/var/lib/mysql
    # 環境変数
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: myapp_test
      TZ: "Asia/Tokyo"
    ports:
      - "3307:3307"    
  redis:
    image: redis
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"

volumes:
  db-develop-volume:
  db-test-volume:
  redis-data:

config/database.ymlもこちらに合わせて、設定してください。

注意点

駆け出しエンジニアです。日々の業務や学習から、気になったことをアウトプットしています。

まだ、理解できていない点も多く、間違えている点が多々あるかと思います。

その時は、ご指摘いただけると助かります。よろしくお願いします。