首页 > 解决方案 > 运行“docker exec”时发布端口

问题描述

在 docker conrainer 中,在Windows 机器上,我必须运行一些 Laravel 测试,其中运行一个命令,产生以下异常跟踪:

异常跟踪:

无法连接到 localhost 端口 8000:连接被拒绝

1
Facebook\WebDriver\Remote\HttpCommandExecutor::execute(对象(Facebook\WebDriver\Remote\WebDriverCommand)) /var/www/html/vendor/php-webdriver/webdriver/lib/Remote/RemoteWebDriver.php:135

2
Facebook\WebDriver\Remote* RemoteWebDriver::create("http://localhost:8000", Object(Facebook\WebDriver\Remote\DesiredCapabilities)) * /var/www/html/tests/DuskTestCase.php:44

要启动 docker 容器,运行以下命令

docker exec -it crawler-php bash

然后在容器内运行 phpunit 测试,使用 RemoteWebDriver 产生异常

我怀疑异常是由端口 8000 未正确公开或发布引起的,但我是 docker 新手,不确定如何修改问题。(我也不完全确定我是否必须发布或暴露端口 8000)

我知道可以运行命令docker run -p 8000:8000...来运行一个发布了端口 8000 并映射到我的本地计算机端口 8000 的容器,但我不确定在使用时如何使用类似的容器端口映射docker exec而不是docker run

标签: dockerdocker-desktop

解决方案


对于 Windows,在主机上,您可以使用netsh示例,

netsh interface portproxy add v4tov4 listenaddress=(local address) listenport=(local port) connectaddress=(destination address) connectport=(destination port)

对于 Linux,在主机上,要在 iptables 上创建规则,

iptables -t nat -D DOCKER ! -i docker0 -p tcp --dport 3306-j DNAT --to-destination 172.17.0.2:3306

当数据包的目的地是主机上的端口时,使用 ip和端口3306将数据包转发到容器。-i 参数是 docker 接口。172.17.0.23306

从我可以找到的简单性来看,无需创建新容器。


推荐阅读