首页 > 解决方案 > 如何从 dockerfile 访问在另一个 docker 容器中运行的 Web 服务?

问题描述

我在 docker 容器中有一个 Web 服务正在运行并且可以在 localhost:5000 (主机)访问。我想在 Dockerfile 中调用这个服务。我正在为 .net 核心应用程序使用多阶段 Dockerfile。我想收集构建统计信息并发送到在 localhost:5000 运行的服务。到目前为止,建议的方法是使用 --network="host"。但这在构建期间不起作用。

标签: docker

解决方案


多么奇怪!--network=host应该达到预期的效果,符合您提到的建议方法。我想知道为什么这对您开箱即用不起作用。

我建议您测试这个问题的简化版本,以消除 Docker 网络堆栈之外的潜在错误来源:

  1. 运行一个虚拟的 Web 服务:docker run -d -p 5000:80 nginx会成功的
  2. 创建这个 Dockerfile:

FROM busybox
RUN echo localhost:5000
RUN wget localhost:5000
  1. 运行docker build --no-cache .。正如预期的那样,网络调用将失败,输出应包括:

    wget:无法连接到远程主机(127.0.0.1):连接被拒绝

  2. 运行docker build --network=host --no-cache .。对我来说,输出包括:

    连接到 localhost:5000 (127.0.0.1:5000)

    index.html 100% |************************************| 612 0:00:00 预计到达时间

  3. 运行docker build --network=bridge --no-cache .。同样,网络调用失败:

    wget:无法连接到远程主机(127.0.0.1):连接被拒绝

当你尝试这个时你会得到什么?

上面示例中的重要说明:--no-cache在命令中包含参数以确保重建docker build整个。Dockerfile否则,docker 只会从缓存中提取构建的镜像层,并忽略--network自上次构建此 Dockerfile 以来您对参数所做的任何更改。

更重要的是,尽管该network选项在映像构建时公开(截至最近的 API 版本),但我不确定这种使用是否符合最佳实践。使用在实际 Dockerfile 之外传输构建统计信息的解决方案可能会更好。例如,运行的 CI 脚本docker build ...可以收集该命令的输出,grep/ sedit 以获取特定的统计信息,并将其传输到您的 Web 服务。


编辑:根据您的评论,如何使用 docker-compose 实现此目的。遗憾的是 docker-compose 文档没有宣传这一点,但--network实际上是受支持的。它是在 Compose YAML 文件格式版本 3.4 中添加的,特别是在此 PR中。

这是一个例子docker-compose.yml

version: '3.4'
services:
  web:
    build:
      context: .
      network: host

将其放在与上面示例相同的目录中Dockerfile,并确保 nginx 在单独的容器中,如上所示。

结果如下:

> docker-compose build --no-cache
Building web
Step 1/3 : FROM busybox
 ---> e1ddd7948a1c
Step 2/3 : RUN echo localhost:5000
 ---> Running in d5f0d712c188
localhost:5000
Removing intermediate container d5f0d712c188
 ---> 8aa9d974447f
Step 3/3 : RUN wget localhost:5000
 ---> Running in a10cee732e48
Connecting to localhost:5000 (127.0.0.1:5000)
index.html           100% |********************************|   612  0:00:00 ETA

Removing intermediate container a10cee732e48
 ---> 8a287d116b4b

Successfully built 8a287d116b4b
Successfully tagged dockerquestion_web:latest

推荐阅读