【问题标题】:Docker containers and local cURL callDocker 容器和本地 cURL 调用
【发布时间】:2018-03-18 11:28:41
【问题描述】:

我无法在同一服务器上的两个 docker 容器之间进行 cURL 调用。

你会发现所有正在运行的容器:

“仪表板”容器托管一个可通过 URL https://www.myapp.com/ 访问的 web 应用程序

“api”容器托管另一个可通过 URL https://api.myapp.com 访问的 web 应用程序

我无法从仪表板容器中对 https://api.myapp.com 进行 cURL 调用。我每次都收到超时错误。

可能存在路由问题或其他问题?

目前唯一可行的方法是使用“本地表示法”http://air360-api:8082/ 对 URL 进行 curl。

我在 docker run 命令中使用了多个 DockerFile。

你能帮我解决这个问题吗?谢谢!

PS : 网址是伪造的,请勿尝试调用它们 :D


已编辑 1 添加 dockerfile / init :

我通过运行以下 cmd 启动我的 docker 实例:

docker run -t -d -p "80:80" -p "443:443" --dns "8.8.8.8" --dns "8.8.4.4" --link "dashboard-dev" --link "dashboard" --link "api" --link "media" --link "front "apache"

这里是 API 容器的 dockerfile。它与仪表板 dockerfile 相同,只是项目不同:

FROM microsoft/dotnet:2.0-sdk

# Install dependencies
RUN apt-get update -y
RUN apt-get install -y python-pip python-setuptools python-dev build-essential
RUN pip install --upgrade pip
RUN pip install ua-parser --no-cache-dir

# Set environment variables
ENV ASPNETCORE_URLS="http://*:8082"
ENV ASPNETCORE_ENVIRONMENT="Development"

# Copy files to app directory
COPY . /app

# Set working directory
WORKDIR /app/API-Project

# Restore NuGet packages
RUN ["dotnet", "restore"]

# Open up port
EXPOSE 8082

# Run the app
ENTRYPOINT ["dotnet", "run"]

【问题讨论】:

  • 发布你的 docker-compose 文件
  • @TarunLalwani :刚刚编辑了问题。你有什么想法吗?
  • 您是否使用docker run 单独运行每个容器?您应该使用docker-compose 您的案例。此外,--link 现在已弃用并避免显示,因为它将在即将发布的版本中删除

标签: curl docker dockerfile


【解决方案1】:

您看到超时的原因可能是某些防火墙规则 (iptables)。解决方案是通过从容器到外部地址/端口来“不要那样做”。只要容器内外的端口匹配(例如将容器中的端口 80 映射到主机上的 80),那么您就可以对容器完全透明地进行更改。

将您的容器放在同一个 docker 网络上,并使用 docker 网络进行容器到容器的通信(而不是使用链接)。然后使用网络上的容器别名来连接容器到容器,但使用外部地址。这是我从具有网络别名的 traefik 容器中获得的一个示例,“代理”网络是使用 docker network create -d overlay proxy 预先创建的(这是用于集群模式,因此如果您只在单个上运行这些,请删除 -d overlay主持人)。

这是我的 docker-compose.yml 的相关部分:

version: '3.3'

networks:
  proxy:
    external:
      name: proxy

services:
  traefik:
    image: traefik:1.4
    networks:
    - proxy:
        aliases:
        - proxy.example.com
    ports:
    - target: 80
      protocol: tcp
      published: 80
      mode: ingress

这样,代理网络上连接到“proxy.example.com”的任何其他容器都将直接进入 traefik 容器。将 traefik 替换为您自己的 apache 容器和主机名,以将其应用于您的场景。

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2021-05-06
    • 1970-01-01
    • 2022-01-22
    • 2017-10-26
    相关资源
    最近更新 更多