使用 'localhost' 连接到 docker-machine

Posted

技术标签:

【中文标题】使用 \'localhost\' 连接到 docker-machine【英文标题】:Connect to docker-machine using 'localhost'使用 'localhost' 连接到 docker-machine 【发布时间】:2016-05-24 04:20:43 【问题描述】:

有某些功能,例如没有 https 的 javascript 服务工作者,只能在 localhost 上运行,但是当我使用在 docker-machine 上运行的 docker-compose 在 docker 容器中运行我的应用程序时,我需要连接使用我从

获得的地址到它
docker-machine ip default

有没有办法将localhost 映射到那个ip?

【问题讨论】:

我不熟悉JavaScript Worker,但我认为它运行在您的浏览器上,而不是本地主机上 是的,它在您的浏览器中运行。但是,如果您在主机名不是localhost 的服务器上运行它,则该页面需要通过 https 提供才能正常工作。 如果您在本地计算机上编辑 hosts 文件并在 docker 主机上映射 port 80 会怎样 这也许是可能的。我得到的 ip 似乎总是一样的,所以可以工作。 【参考方案1】:

最简单的方法是从 VBox 进行端口转发

设置->网络->适配器1->端口转发

然后添加名称,在主机中添加 127.0.0.1(对于本地主机)然后正确的端口绑定并重新启动 VM。

【讨论】:

【参考方案2】:

您可以添加一个 VirtualBox 端口转发以将 docker 主机上的端口映射到您的本地机器。

假设您的 docker 机器被称为“默认”并且您想将容器中的端口 80 映射到 localhost:8888 您可以运行:

vboxmanage modifyvm default --natpf1 "nameformapping,tcp,,8888,,80"

或者如果虚拟机正在运行

vboxmanage controlvm default natpf1 "nameformapping,tcp,,8888,,80"

这也可以在虚拟机设置中的 VirtualBox UI 中完成。这是来自 VirtualBox 的文档https://www.virtualbox.org/manual/ch06.html#network_nat

您还需要将容器上的端口映射到 docker 机器上的端口,在启动容器时执行此操作(这也假设您的 Dockerfile 中有“EXPOSE 80”命令

docker run -p 80:80 mycontainer

https://docs.docker.com/engine/reference/run/

另见:https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md

【讨论】:

好答案。我通常看到以相反方式描述的映射顺序。您将 localhost:8888 映射到 vm:80 并将 docker 机器上的端口 80 映射到容器中的端口 80,数据包流动的方式。 natpfN 不是标志,而是位置参数。命令应该是vboxmanage controlvm default natpf1 "nameformapping,tcp,,8888,,80" 很好,它是 modifyvm 但不是 controlvm 的标志......非常令人困惑。我更新了答案以显示两个选项 我应该为映射提供什么名称??是本地主机吗?【参考方案3】:

编辑您的 hosts 文件会导致您的本地计算机仅直接查看为域指定的 IP 地址。因此,您可以将docker-machine 的IP 地址添加到本地计算机中的etc\hosts 文件中,并将容器上的端口80 映射到docker-machine 上的端口80

例子:

1) 获取docker主机ip地址

$ docker-machine ip default
192.168.99.100

2) 将此行添加到本地计算机中的etc/hosts 文件中

192.168.99.100 domain.com

3) 检查您的机器是否正在解析域。

$ ping domain.com
PING domain.com (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.294 ms
64 bytes from 192.168.99.100: icmp_seq=1 ttl=64 time=0.437 ms
64 bytes from 192.168.99.100: icmp_seq=2 ttl=64 time=0.556 ms
64 bytes from 192.168.99.100: icmp_seq=3 ttl=64 time=0.270 ms

注意事项:

对于 Windows 用户,hosts 文件位于 C:\Windows\System32\Drivers\etc\hosts 如果您想在一台 docker-machine 中支持多个域,您可以在其他容器前面创建一个带有 nginx 的代理容器。

【讨论】:

localhost 这不起作用,至少与 mongo 一起。我的意思是如果将192.168.99.100 localhost 添加到etc/hosts,如果您只想使用mongo 命令(默认使用localhost:27017)连接到mongo,它将不起作用

以上是关于使用 'localhost' 连接到 docker-machine的主要内容,如果未能解决你的问题,请参考以下文章

docker 无法使用不同的用户从 localhost 连接到 mariadb

无法从 docker 容器连接到 Localhost Mysql

错误:无法在 http+docker://localhost 连接到 Docker 守护程序 - 它正在运行吗? [关闭]

将 sprig 连接到 kafka 开始使用 docker compose 进行 localhost 开发

Docker - Node.js + MongoDB - “错误:无法连接到 [localhost:27017]”

MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”