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

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

我有一个单一的页面应用程序,请求一个JSON API。 它的Dockerfile看起来像这样:

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

一个构build过程就是这样,把所有的静态资源放在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" 

我能够成功地构build两个容器,并且能够运行“docker-compose up”,这两个容器都能够顺利运行。 从badass-ui向badderer-api提取请求:3000 /用户返回“net :: ERR_NAME_NOT_RESOLVED”。 获取请求到http://192.168.99.100:3000/users (或任何容器IP可能)工作正常。 我想通过使用docker撰写我将能够引用在docker-compose.yml中定义的服务的名称作为一个域名,这将通过域名启用容器之间的通信。 这似乎并不奏效。 docker-compose.yml有问题吗? 我在Windows 10 Home Edition上,使用Docker Quickstartterminal附带的工具。 我使用docker-compose版本1.13.0,docker版本17.05.0-ce,docker-machine版本0.11.0和VirtualBox 5.1.20。

由于您使用的是docker-compose.yml版本2,所以不需要链接。 撰写networking中的容器应该能够通过服务名称来parsing其他撰写容器。

阅读你的问题的意见,似乎networking和主机名parsing工作,所以它似乎是你的networking用户界面的问题。 我没有看到你将任何types的configuration传递给UI应用程序,说明在哪里可以findapi。 也许有一个硬编码的url到您的用户界面的API导致错误?

编辑:

你的用户界面是客户端/ JavaScript应用程序? 你确定该应用程序实际上并没有从你的浏览器拨打电话吗? 您的浏览器在本地机器上运行,而不是在docker中,将无法parsingbadderrer-api主机名。