如何链接前端和后端docker容器

时间:2018-06-08 12:41:54

标签: docker docker-compose

我目前正在使用Postgresql作为数据库开发Spring Boot reactJs应用程序。我的Spring和我的reactJs应用程序分为两个单独的项目。我尝试使用docker-compose将我的应用程序停靠。所以在服务器端我有dockgresql和docker-compose文件中定义的springboot服务。 这是

version: '3'
services:
  app:
    image: app
    depends_on:
    - mypostgres
    ports:
     - "9000:8086"
    environment:
      - DATABASE_HOST=mypostgres
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=test
      - DATABASE_PORT=5432



  mypostgres:
    image: postgres:9.6-alpine
    container_name: mypostgres

    ports:
     - "5433:5432"

    environment:
     - POSTGRES_PASSWORD=root
     - POSTGRES_USER=root
     - POSTGRES_DB=irooldb
    volumes:
    - ./postgres-data:/var/lib/postgresql/data

对于Client side,我没有使用docker-compose我只添加了一个Dockerfile 并在一个单独的容器中运行我的客户端应用程序。

我的问题是:

如何将我的客户端Container链接到我的服务器端容器?

我应该在位于服务器端项目中的docker-compose文件中定义客户端服务吗?或者他们可以分开运行吗?

2 个答案:

答案 0 :(得分:0)

让它们分开运行是可以的。

您需要通过将前端和后端放置在同一个docker网络中来连接它们(您不需要将db放入该网络中)。

只需手动创建独立网络,然后在docker-compose中引用它external - 对于后端和前端也是如此。然后,您将能够使用服务名称与后端进行前端对话。

前端-搬运工-compose.yml:

services:
  frontend:
    networks:
      project_network:
networks:
  project_network:
    external: true

于后端的搬运工-compose.yml:

services:
  app:
    networks:
      project_network:
networks:
  project_network:
    external: true

docker network create --attachable project_network

答案 1 :(得分:0)

  

我应该在位于服务器端项目的docker-compose文件中定义客户端服务吗?

这是一个选项,这可能是最简单,最直接的选择。默认情况下,docker-compose为每个docker-compose.yml定义的服务设置一个docker网络。由于所有服务都在同一网络上,因此它们可以通过主机名相互解析,即您的客户端应用程序将到达后端,如http://app:9000/api/login/,您可以使用docker-compose服务名称作为主机。

  

或者他们可以分开进行吗?

如果你愿意,可以单独运行它们。您需要做一些修改以确保前端可以到达后端。有两种选择:

  1. 手动创建docker bridge网络Here are the docs for that。您只想使用docker network createadd that network in your docker-compose来定义网络,并确保在docker run使用{{1}时将前端容器放在同一网络中}} 选项。同样,您可以在docker-compose.yml中定义一个新网络,跳过手工创建它,并将您的前端容器放在该网络中。
  2. 这些#1选项中的任何一个最终都会变脆,因为在运行前端或者可能是docker-compose堆栈之前,您需要确保网络在那里。无论如何,这是一个选择。

    在桥接模式(默认为网络模式)下,引用容器中的localhost不会引用您的主机。例如,来自您的前端的--network将尝试在端口9000上卷曲前端容器。来自您的应用服务的curl localhost:9000应该会成功,因为它会卷曲自己。

    1. 使用主机网络驱动程序which will put your containers on your host network by removing the Docker network isolation。然后一切都会用curl localhost:9000来互相交流。
    2. 如果您没有将前端保持在docker-compose.yml之外的良好案例,我建议您将其添加到那里并完成。这样做会将很多想法转移到docker-compose上。如果你使用CI管道,它也会更好地扩展,并且更容易交给另一个开发人员,因为它都在一个整洁的包中。祝你好运!