MacやWindowsのローカル環境で、LaravelやRubyonRailsを使う場合、php artisan serve
やrails s
を起動すればすぐにブラウザで表示できるのですが、docker環境にプロジェクトを作成した場合、コマンドだけではブラウザに表示されません。
dockerで立ち上げたローカルサーバがどのような仕組みでブラウザ表示されるのかをまとめていきたいと思います。
localhostで立ち上げたら基本的にうまくいかない
docker環境でrails s
をすると、http://localhost:3000
の表示が出るかと思います。
(Laravelならhttp://localhost:8000
だったかな)
そのままlocalhostをブラウザに入力しても表示はされません。
なぜなら、localhostは127.0.0.1
だと判断されるからです。
dockerコンテナにはIPが設定されていて、172.22.0.x
のようなIPが確か動的に設定されます。
これらを指定しなければなりません。
各フレームワークごとに設定の仕方は異なるのですが、Railsなら、rails s -B 0.0.0.0
でdocker環境のIPで立ち上げることができると思います。
コンテナを再起動しないのであれば、172.22.0.x
を指定しても良いのですが、起動するたびに動的にIPが割り振られるので、0.0.0.0
を指定することで、その時のdockerコンテナのIPを指定すると良いです。
ポート接続
laradockの場合、workspaceというコンテナでプロジェクトを作成するのですが、(通常のdockerだとwebコンテナでしょうか。)22ポート→22ポートへの接続しかされていません。
なので、0.0.0.0:22
で立ち上げたサーバをlocalhost:22
で表示することができる状態です。
railsは3000、laravelは8000で立ち上げるので、ポート接続の設定もしないといけません。
laradockのdocker-compose.ymlファイルの以下のように設定します。
### Workspace Utilities ##################################
workspace:
ports:
- "${WORKSPACE_SSH_PORT}:22"
- "3000:3000"
- "8000:8000"
これで、3000ポートと8000ポートも接続することができます。
この状態でrails s -B 0.0.0.0
でサーバを立ち上げれば、localhost:3000
でRailsの画面を表示することができます。
NginxかApacheを使うのがおすすめです
毎回rails s -B 0.0.0.0
を打つのも大変ですし、プロジェクトが増えてくると同時に立ち上げることができなくなってきてしまいますので、nginxやapacheを使うのがおすすめです。
こちらの設定方法は今回は割愛しますが、IPとポートの考え方は基本的には同じです。
nginxやapacheを使えば、Railsなら3000ポートと決まっているわけではなく、このディレクトリに接続した時は8001番ポートで接続する、というようにポートの振り分けを柔軟に行うことができます。