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

ch.*_*h.E 5 docker docker-compose

我目前正在使用Postgresql作为数据库开发Spring Boot和一个reactJs应用程序。我的Spring和我的reactJs应用程序在两个单独的项目中。我试图使用docker-compose将应用程序进行docker化。因此,在服务器端,我springboot在docker-compose文件中定义了我的postgresql和服务。哪一个

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
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

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

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

blu*_*res 5

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

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

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

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

  1. 手动创建docker桥接网络这是相关的文档。您只想使用 定义一个网络docker network create将该网络添加到您的 docker-compose 中,并确保在使用docker run--network选项时将前端容器放在同一个网络中。同样,您可以在 docker-compose.yml 中定义一个新网络,跳过手动创建它,并将前端容器放入该网络中。

这些 #1 选项中的任何一个最终都会变得脆弱,因为您需要在运行前端或可能的 docker-compose 堆栈之前确保您的网络存在。无论如何,这是一个选择。

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

  1. 使用主机网络驱动程序该驱动程序将通过删除 Docker 网络隔离将容器置于主机网络上。然后一切都只是用来localhost:<port>互相交谈。

如果您没有很好的案例将前端保留在 docker-compose.yml 之外,我鼓励您将其添加到那里并完成。这样做会减轻 docker-compose 的很多思考。如果您使用 CI 管道,它的扩展性也会更好,并且更容易移交给其他开发人员,因为它们都在一个整洁的包中。祝你好运!