esto es solo una pregunta sobre teoría, mi aplicación funciona perfectamente...
Entonces, tengo 3 servicios ejecutándose con docker-compose: una base de datos postgres , un springboot de backend y un angular de frontend .
Por lo que sé, los contenedores docker pueden acceder a puertos desde otros contenedores docker sin necesidad de exponer el puerto, por lo que no es necesario exponer ni vincular los puertos porque todos son contenedores y pueden acceder entre sí con el modo de red de puente predeterminado ( eso es lo que aprendí, no sé si esto es correcto) .
Solo necesito exponer el puerto desde el contenedor frontend para poder acceder desde mi host local.
El caso es que puedo acceder a la base de datos con el backend (backend -> base de datos) sin necesidad de exportar ningún puerto, pero con el frontend (frontend -> backend) usando angular con nginx, solo funciona con el puerto del backend expuesto, ¿por qué?
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: - backendSu interfaz de Angular está realizando solicitudes al backend de Spring desde fuera del contenedor de la interfaz. Está haciendo una solicitud desde el interior de su navegador. Es por eso que el backend también debe estar expuesto.
En segundo lugar, no necesita links . La vinculación se realizará automáticamente ya que ambos servicios están en la misma red.
Aquí hay una configuración actualizada, que usa redes en su lugar:
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:Cuando no se esté ejecutando en producción, también recomendaría vincular todos los puertos directamente a la interfaz del host (127.0.0.1), para evitar que otros en su red accedan al puerto de su máquina, así:
ports: - "127.0.0.1:8084:80"