VagrantとDockerでRails5とMySQLな開発環境を立ち上げる

いまさらDocker??Rails5???MySQL5.7????
など、いろいろ聞こえてきそうですが、YoutubeやQiitaに先人が残されたお導きをなぞってみるとエラー↓

Mysql2::Error::ConnectionError
Unknown MySQL server host 'db' (-2)

が出てMySQLとの接続がうまくいかなかったので一応まとめておきます。

はじめに

  • 便宜上、Vagrant上の仮想マシン専用にIP(192.168.10.205)を割り振っています。
  • MySQLは5.7。パスワードはGIUlbj431b2re9!pwuivlbwjkに設定しています
  • VagrantとDockerのファイル共有はsyncフォルダで行います。(勝手に作ります)

Rails6の立ち上げはこちらの記事が完璧です

【Docker】開発環境構築 Rails6 / Ruby2.7 / MySQL8 – Qiita

さっそくやっていく

仮想サーバを立ち上げていきます。ここではUbuntuを使っていますが好きに変えてください。

$ vi Vagrantfile
Vagrant.configure('2') do |config|
config.vm.box = 'ubuntu/xenial64'
config.vm.hostname = 'hoge'
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "public_network", ip:"192.168.10.205", bridge: "en0: Wi-Fi (AirPort)"
config.vm.provider :virtualbox do |vb|
vb.gui = false
vb.cpus = 4
vb.memory = 4096
vb.customize ['modifyvm', :id, '--natdnsproxy1', 'off']
vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'off']
end
config.disksize.size = '30GB'
config.vm.synced_folder "./sync", "/home/vagrant/hoge", create: "true"
config.vm.provision :docker, run: 'always'
config.vm.provision :docker_compose
end

:wq

$ vagrant up
$ vagrant ssh

ここからはVagrantゲストOS

ここ(hoge)をキャンプ地とする

$ cd hoge
$ vi Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

:wq

gemsとdbの永続化をしておきます。
パスワードは複雑なものにしておけば文句は言われません

$ vi docker-compose.yml
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: "root"
      MYSQL_ROOT_PASSWORD: "GIUlbj431b2re9!pwuivlbwjk"
    volumes:
      - mysql-db:/var/lib/mysql
    ports:
      - "3306:3306"
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - gem_data:/usr/local/bundle
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
volumes:
  gem_data:
  mysql-db:
    driver: local

:wq

$ vi Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.2'
:wq

Gemfile.lockは作るだけでOK

$ touch Gemfile.lock

Railsをnewしていきます。ここでbundleをskipするとmysqlがないよって怒られます。databaseにmysqlを指定しておきます。

$ docker-compose run web rails new . --fource --database=mysql

自動で作られたdatabase.ymlを書き換えます。

$ vi config/database.yml
password: GIUlbj431b2re9!pwuivlbwjk
host: db

に変更

buildします。

$ docker-compose build

upします。コンテナはバックグラウンドで起動させときます。

$ docker-compose up -d

db:createとmigrateも忘れずに。ここでエラーでる場合は次章。成功した人はお疲れ様でした。

$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate

立ち上がった

http://192.168.10.205:3000

終わり!わーい


Mysql2::Error::ConnectionError Unknown MySQL server host ‘db’ (-2)が出る理由

database.ymlのhostをdbに書き換えたのにこのエラーが出る人は、おそらくDockerのdbコンテナが立ちあがっていません。

$ docker-compose ps

これで起動中のコンテナを確認してください。dbコンテナが立っていない理由は

  • rails newの時にbundle installがすっ飛ばされてmysqlがインストールされていない
  • 永続化のためのvolumesのエラー

このへんかと思います。

間違ってるところがあれば教えて下さい👳

公開日