在docker-compose中的两个docker服务之间进行通信

时间:2020-05-18 09:37:03

标签: angular docker json-server

我刚刚开始使用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

2 个答案:

答案 0 :(得分:1)

您的Angular代码不在Docker中运行。名为angular的容器可能提供了HTTP服务,该服务可以提供实际的Angular代码,但是代码本身在Docker之外的浏览器中运行。该浏览器对Docker网络一无所知,并且无法直接访问网络堆栈。

从浏览器的角度来看,您需要使用正在运行的系统的主机名以及外部发布的(第一个)ports:号来访问后端服务。如果浏览器和容器在同一系统上运行,则主机名可能是localhost,因此http://localhost:3000/api/...

一种避免实际需要知道主机名的标准技术是运行反向代理,例如nginx容器,该代理可以转发到两个容器。这将在其配置中使用Docker内部主机名和内部端口号http://json-server:3000http://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

必读:User defined bridge v/s default bridge network

Reference