はじめに
学習環境を用意するにおいて、コンテナ上に開発環境が用意できることで、
・ホストPCを汚すことなく環境を構築できる
・異なるPC間で同じ環境を使いまわせる
・格好いいと感じる
といった理由からRailsアプリをコンテナ上で作って動かしてみましたが、ホストからの動作確認で引っかかったのでメモします。
※動かしたのはscaffoldレベルのアプリです
先にまとめ
先に問題と解決をまとめて書いておきます
- 問題
- コンテナ内で起動したRailsアプリにホストからアクセスできない
- 解決方法
- Railsアプリを立ち上げる際に、
-b 0.0.0.0
をオプションとしてつける
- Railsアプリを立ち上げる際に、
以下、やったこと
まとめにたどり着くまでの状況をつらつらと
準備
ポートフォワードの設定をしてコンテナを立ち上げる
(ホスト)$ docker container run -it -p 30000:3000 /bin/bash
コンテナ内でアプリを作る
(コンテナ)# rails new scaffold_sample
(コンテナ)# bin/rails db:create
データベースを作成無事できたことを確認した後にアプリケーションを起動
(コンテナ)# bin/rails server
上記手順で起動したアプリにアクセスできない
ホストからlocalhost:30000(30000はポートフォワードの設定)にアクセスしてもアプリケーションからの応答はなし
ホストのターミナルからcurlを実行してもエラー
コンテナからlocalhost宛にcurlを実行すると正常な(期待する)htmlが返却される
解決手段
アプリケーションの起動時に-b 0.0.0.0
をオプションとしてつける
(コンテナ)# bin/rails server -b 0.0.0.0
するとホスト側のブラウザからアプリケーションにアクセスできるようになった
「localhost:30000」「127.0.0.1:30000」「0.0.0.0:30000」のどれでもlocalhostにアクセスできていた
オプションの値について
上記の通り、-b 0.0.0.0
を指定することでによってホストからのアクセスは可能になったが
-b 127.0.0.1
や-b localhost
ではホストからアクセスできるようにはならなかった
個人的なメモとして
0.0.0.0や127.0.0.1の持つ意味や、コンテナからみた自分のIP、コンテナからみたホストのIP、ホストから見たコンテナのIPなどが、
ネットワークのオプションとともにどのように振る舞うのかを学ばなければならないと感じた