Docker上でRailsを使ってみたい。
そんな野望が湧き上がってしまい手を出してしまいました。
結論からいいますと、エラーを出しまくりながらもどうにかDocker環境にRailsを構築しローカルから確認することができました。
・・・といっても、私は自分のローカル環境のエラーを探しただけでソースはほぼコピペ状態。なので、今後docker-compose.ymlやDockerfile等を一つ一ついじっていこうかと思います。
今回やったことの事前知識および前提はこんな感じです。
- macOS Mojave 10.14.6
- Rails環境はローカルで構築したことがある
環境を構築していく中で、「エラー出たからこれやったらこうなったよ」というのを延々と書いてみました。チュートリアル形式ではありませんが内容は初心者向けです。
初心者の方が作業途中に出てしまったエラーの参考になればいいかなと思います。
使った教材は『RailsとMySQLをDockerizeしてみよう!』
まず使用教材から。
Webエンジニアのウシジマさんが書かれているnoteである、『RailsとMySQLをDockerizeしてみよう!』を購入し教材として使わせていただきました。
ウシジマさんの解説はわかりやすい例えが多いので初心者にも非常にとっつきやすく、難易度の高いDockerの勉強を手を動かしながら覚えるのにオススメです。
ちなみにこちら、GitHubから自分のローカル環境にクローン(ダウンロード)できるのでめっちゃわかりやすくて便利!
マスター(環境を自分でいじる前)とブランチ(正常に環境構築後)でそれぞれ分かれていて、GitHub自体初めて使うよーって人にもオススメです。
GitHub全くわからんって方は漫画で覚えるのが吉。こちらは特にめちゃくちゃわかりやすいです。
ローカルにMySQLを入れる
MySQL 5.7をまずインストールします。
$ brew install mysql@5.7 $ brew link mysql@5.7 --force
ここで確認したらエラー。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
「/tmp/mysql.sock」が無いよといわれました。
ググってみたらこちらのURLが参考になりました。
mysql.sockを下記コマンドで作成。
$ sudo touch /tmp/mysql.sock
そしてMySQLを再起動
$ mysql.server start
これでいけました。
サンプルコードをマスターブランチからクローンする
Docker触ったことない方はまずは実際に動かしてみたほうが理解が深まると思います。
教材のサンプルを入れて動かしていきます。
Gitで指定したブランチをcloneする方法については下記URLが参考になりました。
教材通りにすすめると、Dockerファイルを入れるディレクトリを作成後、Dockerファイルを作成して下記のコマンドを打ち込みます。
$ docker-compose build
で、こちらは正常にできました。
続いてdocker-compose up。
$ docker-compose up
ここで、サーバーは起動しているものの、ブラウザでlocalhost:4000にアクセスしても表示されない問題が発生。
エラーが原因??更新してもブラウザから表示されない、、、
ポート番号は間違いなく4000になっているのに。。
ので、コレを試してみました。
参考URL↓
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
を↓のように変更。
gem 'tzinfo-data'
あと、Gemfile.lockを削除しました。
↑をやって再度docker-compose buildしたらエラーがなくなりました。
しかしブラウザから表示ができない。
「このサイトにアクセスできません」としか出てきません。
いろいろググってみたら、「ポートのバインド」というのが怪しいか??
コンテナのIPを知らべてみることに。
Dockerコンテナで起動したサーバにアクセスできないときの確認と対処方法
docker psで確認していきます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br> dcc80e4a9c89 trash_app "bash -c '\n yarn in…" 29 minutes ago Up 14 minutes 0.0.0.0:4000->4000/tcp, 4306/tcp trash_app_1<br> 0afed8a756cf mysql:5.7 "docker-entrypoint.s…" 29 minutes ago Up 14 minutes 33060/tcp, 0.0.0.0:4306->3306/tcp trash_database_1
コンテナのIDは「dcc80e4a9c89」と判明しました。このコンテナに入っていきます。
$ docker exec -it dcc80e4a9c89 bash bash-4.4# curl http://localhost:4000/
すると下記のように正常にレスポンスが返ってきました。
<!DOCTYPE html> <html> <head> <title>TaskManagerApp</title> <meta name="csrf-param" content="authenticity_token" /> 以下略
レスポンス返ってきたということはwebサーバーは起動している様子。
ローカルホストの設定を調べてみることにしました。
参考URLはこちら。
↑localhostだとNGだけど127.0.0.1だとOK、ということは、localhostの設定が怪しいということですよね。
macOSであれば、ターミナルから、
$ dig localhost +short
でlocalhostが指すIPアドレスが分かります。これが127.0.0.1になっていなければ変な設定がされているということ。
$ dig localhost +short 127.0.0.1
こちらも正常でした。
しかし、これでもブラウザに反映されません。
プロキシ関連も調べてみたのですが使ってないのでますます謎が深まるばかり。
セキュリティソフトのESETを調べてみる
現在使用しているMacにはセキュリティソフトのESETをインストールしていて、これがなにか障害になっているのではないかと予測してみました。
参考URLはこちら。
MacでローカルWeb開発しようとしてたらhttp://localhostに繋がらなかった件
どうやらDockerとESETセキュリティソフトとの相性が悪いらしいです。深堀りしてみたらこちらもめっちゃ参考になりました。
DockerとESETセキュリティソフトとの相性が悪いみたい
ESETの設定をして、もう一度試してみます。
しかしここであらたなエラーが出てきました。
Dockerコンテナが起動しないで止まる問題
ようやくできたと思ったらDockerが途中で止まってしまうエラーに直面。
docker-compose upのあと、下記の部分で止まってしまってました。
docker-study-for-rails_app_1 exited with code 1
何分待ってもターミナルの画面が動かない、、、。コンテナが起動しないで途中で終わってしまう現象に陥りました。
【Rails, Docker】コンテナが起動後すぐに落ちてしまうトラブルの原因とその対処法
そこで以下のコマンドで一旦コンテナを削除してみることにしました。
$ docker rm $(docker ps -q -a)
削除後、dockerの状況を調べます。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
無事削除できました。
しかし起動しない??ので、もう一度エラーを確認。
Caused by:<br> app_1 | Could not load database configuration. No such file - ["config/database.yml"]
database.ymlがなかった、、、凡ミス。
どうやら、再度GitHubからクローンをしていろいろ試している間に忘れてしまっていた模様。
ということで、再度database.ymlを入れてチャレンジ。
コンテナを起動してブラウザから確認したら表示できました!
全ての元凶はESETでした。。。
まとめ
ローカルからDockerが確認できない原因がまさかセキュリティソフトだとは思っていませんでした。
ちなみに私はコレ以前に別にUdemyの教材を使っていて、そちらでも同様の現象が起きていました。
そこで他の方法を試してみようと思い今回の教材にたどり着いたわけですが、詰まったら教材を変えてみるという選択肢は非常のアリだなと思いました。
教材によってインストールするバージョンや内容はバラバラなので、もう一つ教材を購入して試してみると差分がわかるので、エラー対策の勉強に役立ちます。
今回の件でいうと、
Dockerを使わない環境ではRailsは動いていた、他の教材と違う部分はどこか、といったあたりから予測を立てることができました。
Docke初学者の参考になれば嬉しいです!
以上、Docker初心者がlocalhostエラーで悩みながらRailsを動かすまででした。