Docker初心者がlocalhostエラーで悩みながらRailsを動かすまで

dockerでlocalhostエラー

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全くわからんって方は漫画で覚えるのが吉。こちらは特にめちゃくちゃわかりやすいです。

created by Rinker
¥2,208 (2020/02/25 00:37:52時点 Amazon調べ-詳細)

ローカルに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が起動しない  ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

mysql.sockを下記コマンドで作成。

$  sudo touch /tmp/mysql.sock

そしてMySQLを再起動

 $ mysql.server start

これでいけました。

サンプルコードをマスターブランチからクローンする

Docker触ったことない方はまずは実際に動かしてみたほうが理解が深まると思います。

教材のサンプルを入れて動かしていきます。

Gitで指定したブランチをcloneする方法については下記URLが参考になりました。

Gitで指定したブランチをcloneする方法

教材通りにすすめると、Dockerファイルを入れるディレクトリを作成後、Dockerファイルを作成して下記のコマンドを打ち込みます。

$ docker-compose build

で、こちらは正常にできました。

続いてdocker-compose up。

$ docker-compose up

ここで、サーバーは起動しているものの、ブラウザでlocalhost:4000にアクセスしても表示されない問題が発生。

エラーが原因??更新してもブラウザから表示されない、、、

ポート番号は間違いなく4000になっているのに。。

ので、コレを試してみました。

参考URL↓

bundle installで躓いた話

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:8080 に接続ができない。

↑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を動かすまででした。