我正在设置一个带有开发环境的 Vagrant 盒子。我在 Vagrant 中运行了一些 Web 应用程序、一些其他服务、一个数据库和一个 Docker。大多数服务都是内部使用的,我为 Web 应用程序做了端口转发,这样我就可以在主机上使用 访问它们localhost:FORWARDED_PORT
。
但是其中一个 Web 应用需要在 docker 中运行一些 JavaScript。因此它需要从主机上的 Web 浏览器访问它。在内部,我可以看到以下内容:
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
Docker 中运行的服务正在提供一些静态 JS http://172.17.0.2:4567
。我需要能够从主机中的 Web 应用程序访问该内部地址,如何设置?
答案1
您无法从 vagrant box VM 外部看到内部 do docker IP。但是您可以在容器中公开应用程序的端口(因此它将是一个可以转发为属于 vagrant VM 的端口),并将该 JavaScript 引用为 vagrant box 的外部 IP/名称(即使在放置链接的页面中使用 SERVER_NAME 环境变量)和相应的端口。
答案2
我在日常工作中就经常做这种事情。这里有两件事需要考虑:
- dockerized 服务的端口必须转发到你的 vagrant vm
- vagrant box 上的(现在指向 docker 容器)端口必须转发到你的物理盒子
由于我不知道您的 dockerized 服务,因此我在这里以 dockerized Redis 的标准发行版为例。由于我正在使用图 (http://www.fig.sh/)启动我的docker容器,我将不得不在示例中向您展示第一部分的答案fig.yml
:
redis:
image: redis:latest
ports:
- "6379:6379"
这会在 docker 容器中运行 Redis 键值存储,并将其端口 6379 转发到 vagrant box 上的端口 6379。现在您可以从 INSIDE vagrant vm 通过 localhost:6379 连接到 Redis,所以我们已经完成了一半。
第二步是,将其转发到您的本地机器,通过将其添加到您的Vagrantfile
:
config.vm.network :forwarded_port, guest: 6379, host: 6379
瞧:现在您可以从物理机器通过 localhost:6379 访问 Redis。
对于您的情况,这意味着您必须在 web 应用程序的代码中进行更改http://172.17.0.2:4567
,http://127.0.0.1:4567
以便它实际使用新设置的端口转发。