docker - 运行“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:1352
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
解决方案
对于 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.2
3306
从我可以找到的简单性来看,无需创建新容器。
推荐阅读
- typescript - Vue2 - 使用外部第三方组件作为子组件
- excel - 将某些行中的单元格有条件地合并到 Excel 中的一个单元格中
- android - 在 BaseViewModel 中注入依赖项
- python - 从另一列的统计数据中绘制大小类
- c++ - VS Code C++ Intellisense 在#include 行之后很慢
- spring - 如何检查当前环境是spring容器?
- scala - 运行多个用户时出现 Gatling 错误 - “httpRequest-2”未能执行:未定义名为“access_token”的属性
- sql - 通过将值移动到新列来合并准重复行
- php - Laravel 5.8 | FullCalendar 在日历上显示事件
- react-native - 多次在 API 调用上以反应原生方式呈现屏幕