Docker compose服务无法通过服务名称进行通信

标签 docker docker-compose

tldr:我无法通过服务名称与 docker 组成的服务进行通信,以便向联网容器中运行的 api 发出请求。

我有一个单页应用程序,它向 json api 发出请求。它的 Dockerfile 如下所示:

FROM nginx:alpine
COPY dist /usr/share/nginx/html
EXPOSE 80

构建过程会完成它的工作,并将所有静态资源放入 dist 目录中,然后将其复制到 nginx Web 服务器的 html 目录中。

我有一个由 json-server 提供支持的模拟 json api。它的 Dockerfile 如下所示:

FROM node:7.10.0-alpine

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

EXPOSE 3000

CMD [ "npm", "start" ]

我有一个如下所示的 docker-compose 文件:

version: '2'

services:
  badass-ui:
    image: mydocker-hub/badass-ui
    container_name: badass-ui
    ports:
      - "80:80"

  badderer-api:
    image: mydocker-hub/badderer-api
    container_name: badderer-api
    ports:
      - "3000:3000"

我能够成功构建两个容器,并且能够在两个容器顺利运行的情况下运行“docker-compose up”。从 badass-ui 到 badderer-api:3000/users 的获取请求返回“net::ERR_NAME_NOT_RESOLVED”。获取请求至 http://192.168.99.100:3000/users (或者无论容器 IP 是什么)工作正常。我认为通过使用 docker compose 我将能够引用 docker-compose.yml 中定义的服务名称作为域名,这将允许通过域名在容器之间进行通信。这似乎不起作用。我的 docker-compose.yml 有问题吗?我使用的是 Windows 10 家庭版,使用 Windows 的 Docker Quickstart 终端附带的工具。我使用的是 docker-compose 版本 1.13.0、docker 版本 17.05.0-ce、docker-machine 版本 0.11.0 和 VirtualBox 5.1.20。

最佳答案

由于您使用的是 docker-compose.yml 版本 2,因此不需要链接。组合网络中的容器应该能够通过服务名称解析其他组合容器。

阅读有关您问题的评论,网络和主机名解析似乎有效,因此问题似乎出在您的 Web UI 中。我没有看到您将任何类型的配置传递给 UI 应用程序来说明在哪里可以找到 api。也许您的 UI 中存在指向 api 的硬编码 URL,导致了错误?

编辑:

您的 UI 是客户端/javascript 应用程序吗?您确定该应用程序实际上没有从您的浏览器进行调用吗?在本地计算机上运行而不是在 docker 中运行的浏览器将无法解析 badderrer-api 主机名。

关于Docker compose服务无法通过服务名称进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44412367/

相关文章:

docker - Netflix/Conductor 打印了太多与 dynomite 相关的日志

docker - 每个命令都会导致 fatal error : runtime: out of memory

ruby - 如何使用Ruby关闭/重启Ubuntu系统

docker - 为什么Docker中会出现 "none"镜像以及我们如何避免它

docker - haproxy 没有路由到服务

docker - Traefik:将多个docker服务聚合到一个逻辑后端

mysql - 将 mysql 导入正在运行的 docker 容器中不起作用

linux - 在从 alpine 构建的 docker 容器中找不到 "users"命令

node.js - Node/Docker 是 node-sass 找不到已安装的绑定(bind)(通过 Webpack)

docker - 如何使用环境变量将主机名和/或 IP 地址发送到自己的容器中