Vagrantからlocalhostを経由してdockerコンテナのAPIをコールする


はじめに

vagrantとdockerを併用して開発を行っています。
(vagrantの中にdockerを立てているとかではなく、それぞれ同じ階層で独立している)

なぜこんな複雑な環境になっているのかはさておき、
同じような問題で悩んでいる方がもしかしたらいるかもしれないので
備忘録として手順を残しておきたいと思います。

やりたいことのイメージ

vagrant → ローカル → dockerコンテナ(APIサーバー)

vagrantの仮想環境からAPIを呼び出し、
localhostを経由してdockerコンテナのAPIを実行します。

環境構築

ここでは概要しか載せません。
具体的な環境構築手順は検索してください。

vagrant

VirtualBoxを利用して構築します。
一般的な構築で問題ありません。

docker

docker-compose.yml
ローカルホストの8081ポートをdockerコンテナの80ポートに接続します。
(ローカルホストのポート番号は自由に変更してください)

version: '3.5'
services:
  nginx:
    build:
      (省略)
    environment:
      TZ: Asia/Tokyo
    ports:
      - "8081:80"
      - "4431:443"
    depends_on:
      - php-fpm

  php-fpm:
    build:
      (省略)

この時点でできていること

vagrantとlocalhostの繋ぎ込み

実は初期設定でポートフォワーディングができている。
vagrant(ゲストOS)からlocalhost(ホストOS)を参照する際には10.0.2.2のIPを利用する。

VirtualBox仮想マシンのネットワークはデフォルトでNATとなっている。 VirtualBox の場合、NAT ネットワークアダプタには 10.0.2.0/24 の IP アドレスが割り当てられ、ゲスト OS から見える ホスト OS の IP アドレスには 10.0.2.2 が設定される仕様。
したがってホストOS上に建てたサーバーにゲストOSからアクセスしたい場合は、http://10.0.2.2とアクセスすれば普通に見ることができる。
https://garbagetown.hatenablog.com/entry/20100313/1270039659

※ちなみに
localhost(ホストOS)からvagrant(ゲストOS)の繋ぎ込みは127.0.0.1:2222のIPを利用。
詳細はlocalhostでvagrant ssh-configで確認可能。
Workbenchをvagrant内のmysqlに接続したいときなどに便利。

❯ vagrant ssh-config                                                                                                                                                                             [12:45:47]
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile (省略)
  IdentitiesOnly yes
  LogLevel FATAL

localhostとdockerコンテナの繋ぎ込み

前述のdocker-compose.ymlで設定した通り、
localhost:8081にアクセスすればdockerコンテナの80ポートに接続できる。

結論

vagrant→ローカルホスト→dockerコンテナのAPIを呼び出すには
vagrant から10.0.2.2のIPを利用すればOK

参考