为什么我无法从本地主机上的 Gitlab CI 连接到我的 docker-compose 服务
Why can't I connect to my docker-compose service from Gitlab CI on localhost
我是 运行 Gitlab.com 的 CI 跑步者。我的 .gitlab-ci.yml
的截断版本是
image: docker/compose:1.25.5
services:
- docker:dind
Test:
- script/test
我的 script/test 的截断版本是
docker-compose run -d --name app1_test -p 8080:8080 app1 bash
docker-compose run -d --name app2_test -p 8081:8080 app2 bash
curl -s ORIGIN:8081/healthz
我发现无论我的 ORIGIN 是 localhost
、docker
、0.0.0.0
等,我总是得到 can't connect to remote host (0.0.0.0): Connection refused
我在 Gitlab 论坛和堆栈溢出上看到了很多答案,其中 none 解决了问题。这是怎么回事,我该如何解决/诊断问题?
首先,论坛上的许多答案都指出了我最终采用的解决方案。实际上,我想检查该服务的原因是 docker-compose.yml 中的另一个服务可以与其对话。那么,为什么不直接使用该服务来执行 ping 操作呢?然后你得到一个更好的测试,你可以使用 Docker 的自动 DNS 和 --name
选项。
docker exec -t app1_test curl -s app2_test:8080/healthz
现在,如果这仍然困扰您,因为您只是想知道为什么会发生这种情况以及如何诊断/解决它,或者您确实需要从主机与容器对话。我建议您检查脚本中的一些内容
cat /etc/hosts
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app1_test
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app2_test
让我吃惊的是
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 0hshit.hopto.org
127.0.0.1 daymndaymn.myftp.org
127.0.0.1 loba.webhop.me
172.17.0.3 docker 26f99c2de716 runner-fa6cab46-project-18056856-concurrent-0-3b5b3ec1f3220cec-docker-0
172.17.0.4 runner-fa6cab46-project-18056856-concurrent-0
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app1_test
172.20.0.3172.19.0.4
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app2_test
172.20.0.2172.19.0.3
所以关于使用 docker
的其他答案不起作用,因为它指向 172.17.0.3 但我的两个容器都不在那里。我现在应该可以从 curl
到 172.20.0.2:8080
并且没问题,但我没有尝试,因为到那时我说服自己最好只是 运行 curl
在容器中。
其实我也不知道为什么会出现那样的两个IP地址,但是有的兔子就是在洞里转了一圈你不跟着你知道吗?
我是 运行 Gitlab.com 的 CI 跑步者。我的 .gitlab-ci.yml
的截断版本是
image: docker/compose:1.25.5
services:
- docker:dind
Test:
- script/test
我的 script/test 的截断版本是
docker-compose run -d --name app1_test -p 8080:8080 app1 bash
docker-compose run -d --name app2_test -p 8081:8080 app2 bash
curl -s ORIGIN:8081/healthz
我发现无论我的 ORIGIN 是 localhost
、docker
、0.0.0.0
等,我总是得到 can't connect to remote host (0.0.0.0): Connection refused
我在 Gitlab 论坛和堆栈溢出上看到了很多答案,其中 none 解决了问题。这是怎么回事,我该如何解决/诊断问题?
首先,论坛上的许多答案都指出了我最终采用的解决方案。实际上,我想检查该服务的原因是 docker-compose.yml 中的另一个服务可以与其对话。那么,为什么不直接使用该服务来执行 ping 操作呢?然后你得到一个更好的测试,你可以使用 Docker 的自动 DNS 和 --name
选项。
docker exec -t app1_test curl -s app2_test:8080/healthz
现在,如果这仍然困扰您,因为您只是想知道为什么会发生这种情况以及如何诊断/解决它,或者您确实需要从主机与容器对话。我建议您检查脚本中的一些内容
cat /etc/hosts
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app1_test
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app2_test
让我吃惊的是
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 0hshit.hopto.org
127.0.0.1 daymndaymn.myftp.org
127.0.0.1 loba.webhop.me
172.17.0.3 docker 26f99c2de716 runner-fa6cab46-project-18056856-concurrent-0-3b5b3ec1f3220cec-docker-0
172.17.0.4 runner-fa6cab46-project-18056856-concurrent-0
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app1_test
172.20.0.3172.19.0.4
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app2_test
172.20.0.2172.19.0.3
所以关于使用 docker
的其他答案不起作用,因为它指向 172.17.0.3 但我的两个容器都不在那里。我现在应该可以从 curl
到 172.20.0.2:8080
并且没问题,但我没有尝试,因为到那时我说服自己最好只是 运行 curl
在容器中。
其实我也不知道为什么会出现那样的两个IP地址,但是有的兔子就是在洞里转了一圈你不跟着你知道吗?