当端口 80 已被使用时,如何在 homestead 上 运行 一台 docker 机器?

How to run a docker machine on homestead when port 80 is already in use?

我不是服务器管理员,我经常遇到与端口和 ssh 等服务器相关的问题。我现在面临的问题是 homestead 和 docker.

我在 homestead 上有一个 laravel 应用程序 运行ning。但现在我还需要 运行 Process Maker 在 homestead 中,这样我就可以从我的应用程序调用它们的 API 并使用数据。所以我找到了一张 docker 图像 eltercera/docker-processmaker,它 运行 在我的 mac 上很好用并测试了 API,它们工作正常。

我运行这个命令的图像:

docker run -d -e "HTTPD_SERVER_ADMIN=rohan0793@gmail.com" -p 80:80 --name some-pkm eltercera/docker-processmaker/

运行很好。但是现在当我在我的 homestead machine 上安装 docker-engine 并尝试相同时,我收到以下错误:

docker: Error response from daemon: driver failed programming external connectivity on endpoint some-pkm (dee715e3d7bf47d48f6fbb4a8ba1418009b1a811ef043e18fb232132ec3b6a2d): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.

它说 0.0.0.0:80: bind: address is already in use。现在我不确定这意味着什么以及如何解决这个问题并在我的 homestead machine 中使用该应用程序。这在某种程度上与端口转发有关吗?我可以 运行 machine 使用 -p 作为 90:90 但我不知道如何访问它。

有人可以向我解释我在这里缺少什么以及在继续前进之前我需要学习什么吗?

编辑

我试过了:

docker run -d -e "HTTPD_SERVER_ADMIN=rohan0793@gmail.com" -p 90:80 -h processmaker.app --name some-pkm eltercera/docker-processmaker/

并在 mac 上编辑了我的 /etc/hosts 文件,现在我可以在我的浏览器中执行 processmaker.app:90 并且它有效。但这就像命中注定。我还是不明白我是怎么解决的。

你说 -p 90:80 就解决了。

这样做是将您的 Docker 容器(您的网络服务器在容器内部侦听的那个)的内部端口 80 公开为主机上的端口 90(以便您可以转到 http://processmaker.app:90 在您的浏览器中)。

由于这个方便的功能(Docker-控制器虚拟网络堆栈),您的应用程序可以使用其默认端口,您可以将其映射到 "real" 网络上的任何空闲端口。您还可以做更复杂的事情,例如只将端口暴露给其他容器,而不暴露给外部。

-p 80:80 不起作用的原因是 "real" 端口 80 已被使用。

-p 90:90 不起作用的原因是容器应用程序侦听其虚拟端口 80,而暴露端口 90 没有做任何有用的事情(容器内没有任何连接)。

您可以通过重新配置容器化网络服务器以侦听端口 90 而不是端口 80 来使 -p 90:90 工作。这就是您对非容器化应用程序所做的,但是 Docker 你可以 运行 使用默认设置(端口、文件系统路径等)的所有内容,并在启动容器时将应用程序外部的内容连接在一起(这个花哨的词:编排)。