laradockでworkspaceからnginxのコンテナにhttpリクエストを送れるようにする
普段laravelで開発をすることが多く、開発環境はローカルにdockerで環境が手軽に作れるlaradockというのを使っているんですが、今回バッチを開発していた時に同コンテナ内のapiにリクエストを送りたい、というケースが発生しました。しかし、少々設定が必要だったので記録しておきます。
リクエストする経路を考える
api-local.test.jpというhost名のAPIを開発しているとします。試しにworkspaceのコンテナ内からリクエストを送ってみます。
root@76c4b87567dc:/var/www# curl api-local.test.jp root@76c4b87567dc:/var/www# curl http://api-local.test.jp curl: (7) Failed to connect to api-local.test.jp port 80: Connection refused
接続できません。laradockはdocker-composeでいくつかのコンテナを立ち上げて環境を構築しているんですが、主なコンテナはworkspace, nginx, mysqlなどになります。今回はworkspaceで実行するバッチからAPIのリクエストを受け付けるnginxのコンテナに接続する必要があります。必要なことは以下のとおりです。
- nginxのコンテナの内部IPを調べる
- workspaceのコンテナのhostsにAPIのドメインを追加する
nginxのコンテナの内部IPを調べる
まずdocker-hostのlaradockのディレクトリに移動し、下記コマンドでコンテナに接続します。
docker-compose exec nginx bash
次に、IPを調べます。2つ出てきますが、1つ目でOK。
bash-4.4# hostname -i 172.19.0.7 172.18.0.4
workspaceのhostsの設定を追加する
一度nginxのコンテナから出て、workspaceのコンテナにログインします。
$ docker-compose exec workspace bash
hostsファイルを編集し、api-local.test.jpのhostを追加します。
root@76c4b87567dc:/var/www# vi /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters # 下記追加 172.19.0.7 api-local.test.jp
接続テストをしてみる
hostsファイルを保存し、再びcurlコマンドを打ってみます。
root@76c4b87567dc:/var/www# curl api-local.test.jp <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> ...
見事、htmlが返ってくるようになりました!