【发布时间】:2018-07-20 12:41:02
【问题描述】:
我目前正在使用 Molecule 测试 Ansible 角色。 基本上,Molecule 会启动一个符合 Ansible 的容器并在其上运行角色。
为了测试容器,Molecule 还使用 Testinfra 嵌入了单元测试。 python 单元测试在容器内运行,因此您可以检查角色的合规性。
由于我正在处理基于 Nginx 的角色,其中一个单元测试只是发出 curl http://localhost:80
我确实收到以下错误消息:
curl: (7) 无法连接到 localhost 80 端口:连接被拒绝
当我:
- 启动 Vagrant 机器
- 使用 Ansible 应用角色
- 通过
vagrant ssh连接 - 发出
curl http://localhost命令
nginx 回答正确。
因此,我认为:
- 角色工作正常,Nginx 安装正确
- Docker 有不同的方式来设置网络。在某种程度上,localhost 和 127.0.0.1 已经不一样了。
我的问题如下:
- 我说的对吗?
- 能否克服这种差异,让 curl 发挥作用?
【问题讨论】:
-
127.0.0.1在 Docker 中仍然是localhost- 至少在默认设置下。但是,您的应用程序有时可能会设置为绑定到容器的veth接口而不是所有接口。尝试使用ss或netstat查找您的应用程序绑定的地址。 -
@DanilaKiver:
curl http://127.0.0.1怎么会在 docker 容器中失败,但在 virtualbox 机器上却没有?如果127.0.0.1仍然是“应该是什么”,这应该可以正常工作。 -
127.0.0.1只是一个 IP 地址,分配给特定的接口(通常是lo)。如果应用程序绑定到127.0.0.1/lo以外的特定地址/接口(例如容器的veth接口),它将不会响应对127.0.0.1的请求——这就是套接字的工作方式。这就是为什么我建议查看您的应用程序实际绑定到哪个地址的原因。回答“为什么应用程序在不同的环境中绑定到不同的地址?”问题是下一步,如果你发现我的假设是正确的。 -
显然,没有端口在监听 (
ss -lt):State Recv-Q Send-Q Local Address:Port Peer Address:Port并且没有进程在运行 (ps -ef | grep -i nginx): ``` root 1454 1453 0 08:04 ? 00:00:00 /bin/sh -c ps -ef | grep nginx 根 1456 1454 0 08:04 ? 00:00:00 grep nginx ``` 当针对 Vagrant 机器的结果完全不同时。
标签: docker nginx ansible molecule