这只是有关理论的问题,我的应用运行良好...
因此,我有3种服务在docker-compose上运行: postgres数据库,后端springboot 和前端angular 。>
据我所知,docker容器可以从其他docker容器访问端口,而无需暴露端口,因此无需暴露或绑定端口,因为它们都是容器,并且可以使用默认网桥相互访问网络模式(这是我学到的,不知道这是否正确)。
我只需要从前端容器中公开端口,即可从本地主机访问该端口。
问题是:我可以使用后端(backend-> database)访问数据库,而无需导出任何端口,但是可以使用前端(frontend-> backend)< / em>在Nginx中使用angular,它只能在后端端口暴露的情况下工作,为什么?
docker-compose.yml:
version: "3"
services:
### DATABASE ###
db:
image: postgres:latest
container_name: mydb
network_mode: bridge
environment:
- POSTGRES_PASSWORD=envpass
- POSTGRES_USER=envuser
- POSTGRES_DB=database
# It works without exposing
# expose:
# - 5432
# ports:
# - 5433:5432
### BACKEND ###
backend:
image: angularback
container_name: backend
network_mode: bridge
expose:
- 8080
ports:
- 8082:8080
depends_on:
- db
links:
- db
### FRONTEND ###
frontend:
image: angularfront
container_name: frontend
network_mode: bridge
expose:
- 80
ports:
- 8084:80
depends_on:
- backend
links:
- backend
答案 0 :(得分:1)
您Angular前端正在从前端容器外部向Spring后端发出请求。它是从浏览器内部发出请求。这就是为什么后端也需要公开的原因。
第二,您不需要links
。由于两个服务都在同一网络中,因此链接将自动完成。
这是一个更新的配置,它改用网络:
version: "3"
services:
### DATABASE ###
db:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=envpass
- POSTGRES_USER=envuser
- POSTGRES_DB=database
# Only add the ports here, if you want to access the database using an external client.
# ports:
# - "5433:5432"
networks:
- backend
### BACKEND ###
backend:
image: angularback
ports:
- "8082:8080"
depends_on:
- db
networks:
- backend
- frontend
### FRONTEND ###
frontend:
image: angularfront
ports:
- "8084:80"
depends_on:
- backend
networks:
- frontend
networks:
backend:
frontend:
当不在生产环境中运行时,我还建议将所有端口直接绑定到主机接口(127.0.0.1),以防止网络中的其他人访问计算机上的端口,如下所示:
ports:
- "127.0.0.1:8084:80"