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/