如何使前端Docker容器找到后端容器ip?

问题描述 投票:0回答:1

我正在使用Django backendVuejs frontend建立网站。我使用docker-compose开发效果很好。唯一的事情是我的前端需要调用后端容器,我目前通过在Javascript中对容器ip地址进行硬编码来做到这一点:

const API_HOST = '192.168.0.105';
const API_ADDRESS = `http://${COCKPIT_SERVER_HOST}:8000/cockpit`;

这有效,但是显然这不是正确的方法。有时后端容器的IP地址会发生变化,这使我再次查找新的IP地址。

在我的docker-compose.yml文件中,我将后端命名为api(我在下面粘贴了我的docker-compose文件)。但是如果我在Javascript中将API_HOST定义为

const API_HOST = 'api';

它显然不起作用,因为它是从浏览器内部调用的,它不知道Docker网络。

如何使前端始终调用正确的后端,而无需不断查找容器ip地址?

我的docker-compose文件:

version: '3'

services:
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: cockpit
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
  api:
    build: server
    volumes:
      - ./server:/code
    ports:
      - 8000:8000
    depends_on:
      - db
    command: >
      bash -c '
      python manage.py makemigrations &&
      python manage.py migrate &&
      python manage.py runserver 0.0.0.0:8000'
  frontend:
    build: client
    volumes:
      - ./client:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - 8080:8080
    depends_on:
      - api
docker networking docker-compose docker-networking
1个回答
0
投票

我将考虑2种解决方案:

1。静态IP地址在docker-compose中,您可以为每个服务分配静态IP。优点:易于实现缺点:您代码中的硬编码IP地址

version: '3'

services:
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: cockpit
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    networks:
      test:
        ipv4_address: 172.28.2.1
  api:
    build: server
    volumes:
      - ./server:/code
    ports:
      - 8000:8000
    depends_on:
      - db
    command: >
      bash -c '
      python manage.py makemigrations &&
      python manage.py migrate &&
      python manage.py runserver 0.0.0.0:8000'
    networks:
      test:
        ipv4_address: 172.28.2.2
  frontend:
    build: client
    volumes:
      - ./client:/usr/src/app
      - /usr/src/app/node_modules
    ports:
      - 8080:8080
    depends_on:
      - api
    networks:
      test:
        ipv4_address: 172.28.2.3

networks:
  test:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

2。反向代理根据Keith的建议,您可以设置反向代理(通过ngnix或类似的代理)来解决对服务的调用。优点:没有硬编码的好方法缺点:撰写文件中的其他服务

© www.soinside.com 2019 - 2024. All rights reserved.