Es imprescindible entender el código de forma correcta antes de utilizarlo a tu proyecto y si ttienes algo que aportar puedes comentarlo.
Solución:
En su Dockerfile, le falta la línea Expose, como:
EXPOSE 4200
Intente colocarlo antes de su último comando EJECUTAR en el archivo acoplable.
Esta línea expone el puerto en el propio contenedor (4200 en este caso) para que la asignación de compuse funcione (80:4200).
Compose solo hace esto: reenvía 80 desde el host a 4200 en el contenedor. Pero no sabe ni le importa si el 4200 realmente está siendo escuchado. El Expose en el dockerfile se asegura de que, cuando se crea la imagen, se exponga este puerto para futuros contenedores en ejecución, de modo que su servicio ng pueda escucharlo.
Resolución
Así que para conseguir lo que quieres con docker-compose run
usar publish
para publicar los puertos. Como run
no utiliza las asignaciones de su docker-compose.yml
, los ignora. Así que úsalo así:
docker-compose run --publish 80:4200 node bash
Luego cree la aplicación angular e iníciela como lo estaba haciendo.
Ejemplo de prueba para referencia futura
cd tmp
(o cualquier carpeta de escritura)
ng new myProject
cd myProject
ng serve --host 0.0.0.0
(–host 0.0.0.0 para escuchar todas las interfaces del contenedor)
Luego, en su navegador, vaya a localhost
y debería ver la página de bienvenida angular ahora como el puerto 4200
se publica y se une al puerto de host 80
a través del comando de publicación como mostré arriba.
Cada vez que tiene problemas de reenvío de puertos, si abre una nueva terminal manteniendo la otra terminal donde ejecutó la original run command
y correr docker ps
verá esto en la columna Puertos:
0.0.0.0:80->4200/tcp
lo que significa que su host en el puerto 80 se está reenviando a su contenedor en el puerto 4200 con éxito.
Si ves algo como 4200/tcp
y no el ->
parte, eso significa que no hay asignaciones o puertos publicados.
intenta correr ng serve
con host especificado (que está configurado en ‘localhost’ de forma predeterminada):
ng serve -H 0.0.0.0
ACTUALIZAR
Presta atención, actualmente (@angular/[email protected]) la opción es --host
:
ng serve --host 0.0.0.0
Utilizando ng serve --host 0.0.0.0
siempre me ha funcionado.
La razón por la que esto es crucial es que sin él, el proceso angular solo escucha en la interfaz localhost dentro del contenedor – por lo tanto, incluso con la asignación de puertos de la ventana acoplable, no se reciben conexiones desde fuera del contenedor.
** Angular Live Development Server está escuchando en localhost:3000
Pero si agregas el parámetro --host 0.0.0.0
luego, el proceso angular escuchará en todas las interfaces, y el mapeo del puerto acoplable permitirá que las conexiones desde fuera del contenedor lo alcancen.
** Angular Live Development Server está escuchando en 0.0.0.0:3000
Entonces, en resumen:
- usted no necesita el
EXPOSE 4200
línea en el Dockerfile - usted hacer necesita la asignación de puertos en el archivo docker-compose.yml
- usted hacer necesita la línea CMD en el Dockerfile, y debe incluir el parámetro de host, por ejemplo
CMD ["ng","serve","--host", "0.0.0.0"]
- usted no necesitará usar
docker run
- usted puede usar
docker-compose up
que recogerá las asignaciones de puertos del archivo docker-compose.yml.
Puedes reafirmar nuestro ensayo añadiendo un comentario o valorándolo te lo agradecemos.