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的Docker Quickstart终端附带的工具,在Windows 10 Home Edition上。我使用的是docker-compose版本1.13.0,docker版本17.05.0-ce,docker-machine版本0.11.0和VirtualBox 5.1.20。
答案 0 :(得分:2)
由于您使用的是docker-compose.yml版本2,因此不需要链接。撰写网络中的容器应该能够按服务名称解析其他撰写容器。
阅读有关您问题的评论,似乎网络和主机名称解析工作正常,因此问题出现在您的网络用户界面中。我没有看到你将任何类型的配置传递给UI应用程序,说明在哪里找到api。也许在您的UI中有一个硬编码的URL导致错误?
编辑:
您的UI是客户端/ javascript应用吗?您确定该应用实际上并未通过浏览器拨打电话吗?您在本地计算机上而不是在docker中运行的浏览器将无法解析badderrer-api主机名。