いまさら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
立ち上がった
終わり!わーい
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のエラー
このへんかと思います。
間違ってるところがあれば教えて下さい👳