我刚刚开始使用docker-compose,并且陷入了这两个服务之间的通信之中。
我有2个服务:angular和json。我想从json到angular应用获取一些数据。据我了解,通过使用服务名作为主机名,服务应该能够相互访问。
不幸的是,角度无法到达http://json-server:3000上的json。
在做什么错了?甚至有可能在服务之间发出http请求吗?
这是我的docker-compose.yml文件:
version: '3'
services:
json-server:
image: json-server-image:latest
ports:
- "3000:3000"
container_name: json-server
hostname: json-server
angular:
image: angular-image:latest
ports:
- "8888:80"
links:
- json-server
container_name: angular
答案 0 :(得分:1)
您的Angular代码不在Docker中运行。名为angular
的容器可能提供了HTTP服务,该服务可以提供实际的Angular代码,但是代码本身在Docker之外的浏览器中运行。该浏览器对Docker网络一无所知,并且无法直接访问网络堆栈。
从浏览器的角度来看,您需要使用正在运行的系统的主机名以及外部发布的(第一个)ports:
号来访问后端服务。如果浏览器和容器在同一系统上运行,则主机名可能是localhost
,因此http://localhost:3000/api/...
。
一种避免实际需要知道主机名的标准技术是运行反向代理,例如nginx
容器,该代理可以转发到两个容器。这将在其配置中使用Docker内部主机名和内部端口号http://json-server:3000
和http://angular:80
。从浏览器的角度来看,两者都将位于同一主机和端口上,并且仅路径的相对URL /api/...
将到达该同一服务器。
答案 1 :(得分:0)
尝试一下:
version: '3'
services:
json-server:
image: json-server-image:latest
ports:
- "3000:3000"
container_name: json-server
hostname: json-server
networks:
- some-net
angular:
image: angular-image:latest
ports:
- "8888:80"
container_name: angular
networks:
- some-net
networks:
some-net:
driver: bridge
基本上,以下代码创建了用户定义的docker bridge网络。
networks:
some-net:
driver: bridge
在每个服务中添加以下行,将它们链接到同一网络中。
networks:
- some-net