我正在使用Django backend和Vuejs 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
我将考虑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或类似的代理)来解决对服务的调用。优点:没有硬编码的好方法缺点:撰写文件中的其他服务