Estoy tratando de dockerizar mi aplicación angular + express. Tengo un archivo docker-compose que crea los dos contenedores, y puedo acceder a los contenedores desde mi máquina host (usando mi navegador), pero obtendré un "ERR_NAME_NOT_RESOLVED" cada vez que intento acceder al backend desde http solicitudes realizadas por mi frontend.
Busqué el problema y parece que la mayoría sugiere que el nombre del servicio y el puerto del contenedor deberían ser suficientes para acceder al otro contenedor cuando están en la misma red. Intenté presionar " http://express:8000/user?user=030f0e70-9a8f-11e9-b5d1-f5cb6c0f3616 ", que creo que debería funcionar dado lo que he visto en otros lugares, pero independientemente, obtengo el mismo error.
Mi archivo docker-compose parece
version: '3' # specify docker-compose version # Define the services/containers to be run services: angular: # name of the first service build: ./ # specify the directory of the Dockerfile ports: - "4200:80" # specify port forewarding links: - "express" depends_on: - "express" express: #name of the second service build: # specify the directory of the Dockerfile context: ./ dockerfile: dockerfile.be ports: - "8000:8000" #specify ports forewarding expose: - "8000"Idealmente, me gustaría que mi interfaz pudiera acceder al otro contenedor con un punto final establecido, para poder implementar la aplicación con cambios mínimos. Agradecería cualquier consejo. Siento que me estoy perdiendo algo realmente simple, pero después de algunas horas de retoques, todavía no lo he captado.
¡Gracias!
Unas pocas cosas:
Agregue una red definida personalizada en su archivo de composición en lugar de usar enlaces. Esta es ahora la forma principal de conectar contenedores en red :
version: '3' # specify docker-compose version services: angular: # name of the first service build: ./ # specify the directory of the Dockerfile ports: - "4200:80" # maps port 4200 on localhost to 80 in container network: - mynetwork depends_on: - "express" express: # name of the second service build: # specify the directory of the Dockerfile context: ./ dockerfile: dockerfile.be ports: - "8000:8000" # maps port 8000 on localhost to 8000 in container networks: - mynetwork networks: mynetwork:De hecho, su tráfico es el siguiente:
La página de solicitud del navegador del usuario desde angular container , luego todas las páginas se representarán en el navegador del usuario.
El código javascript frontal que usa angular HttpClient para obtener los datos del express container .
En ese momento, aunque docker-compose configuró una red personalizada para usted que ofrece auto-dns para resolver angular & express , pero este dns solo funciona entre contenedores, no afecta al host.
Pero, su augular HttpClient cuya llamada http://express se produjo en el navegador del usuario que no está en el contenedor, por lo que el auto-dns definitivamente no funciona para que usted resuelva el nombre express .
Para usted, si solo desea abrir el navegador desde su docker host, puede usar localhost , pero si también desea que el usuario de otra máquina visite su web, debe usar la ip de su dockerhost.
Luego, en angular HttpClient , debe usar algo como http://your_dockerhost_ip:8000 para visitar el contenedor express.
Si está interesado, puede visitar esto para ver que User-defined bridges provide automatic DNS resolution between containers .
**sample docker-compose.yaml** version: '3.5' services: angular: image: "angular-alpine:0.0.1" container_name: angular tty: true stdin_open: true networks: app_net: ipv4_address: 172.16.238.05 depends_on: - express express: image: "express:0.0.1" container_name: express tty: true stdin_open: true networks: app_net: ipv4_address: 172.16.238.10 networks: app_net: driver: bridge ipam: driver: default config: - subnet: 172.16.238.0/24>"1. Angular se ejecutará en 172.16.238.05:4200 y express se ejecutará en 172.16.238.10:some-port. 2. modifique sus config.ts o parámetro.ts o cualquier archivo donde configure express url en 172.16.238.10:some -puerto. ahora su angular se conectará a express ".