TecNM · Instituto Tecnológico de Tijuana Duración estimada: 60 min · Nivel: básico
Ejecutar GPS Route Viewer en un contenedor Docker en tu propio equipo, entender la diferencia entre imagen y contenedor, y usar un modo de desarrollo en el que los cambios al código se ven sin reconstruir la imagen.
| Concepto | Qué es |
|---|---|
| Imagen | Plantilla de solo lectura con todo lo necesario para ejecutar algo (aquí: nginx y el sitio). Se crea con docker build a partir de un Dockerfile. |
| Contenedor | Una instancia en ejecución de una imagen. Se pueden crear, detener y borrar sin afectar la imagen. |
| Puerto publicado | -p 8080:80 conecta el puerto 8080 de tu equipo con el 80 del contenedor. |
| Volumen / bind mount | Carpeta de tu equipo montada dentro del contenedor. |
| Docker Compose | Archivo compose.yaml que describe los servicios para levantarlos con un solo comando. |
| Sistema | Instalación |
|---|---|
| Windows 10/11 | Docker Desktop. Al instalar, deja activada la opción WSL 2. Reinicia cuando lo pida. |
| macOS | Docker Desktop. Elige Apple Silicon (M1/M2/M3/M4) o Intel según tu equipo: → Acerca de esta Mac. |
| Linux (Ubuntu) | sudo apt install -y docker.io docker-compose-v2 && sudo usermod -aG docker $USER y luego cierra la sesión y vuelve a entrar. |
Docker Desktop es gratuito para uso educativo y personal.
Abre Docker Desktop y espera a que indique Engine running. Después, en una terminal:
docker --version
docker compose version
docker run --rm hello-world✅ Verificación: hello-world imprime "Hello from Docker!".
git clone https://github.com/tectijuana/OpenVTSmapsTutorial.git gps-route-viewer
cd gps-route-viewerSi no tienes git, descarga el .zip que comparta el docente, descomprímelo y entra a la carpeta con cd.
Archivos que usaremos:
Dockerfile → cómo construir la imagen (nginx + index.html + src/)
compose.yaml → servicios "web" (producción) y "dev" (desarrollo)
.dockerignore → archivos que NO se copian a la imagen
Revisa el Dockerfile: son solo 4 instrucciones.
FROM nginx:stable-alpine
COPY index.html /usr/share/nginx/html/index.html
COPY src /usr/share/nginx/html/src
EXPOSE 80docker build -t gps-route-viewer .
docker images gps-route-viewer # la imagen y su tamaño
docker run -d --name grv -p 8080:80 gps-route-viewer
docker ps # el contenedor en ejecuciónAbre http://localhost:8080/?demo.
✅ Verificación: aparece la ruta demo de Tomás Aquino a Otay; ▶ Reproducir mueve el vehículo.
Comandos útiles:
docker logs -f grv # peticiones HTTP (Ctrl+C para salir)
docker exec -it grv sh # entrar al contenedor
ls /usr/share/nginx/html # (dentro) ver los archivos servidos
exit
docker stop grv # detener
docker start grv # volver a iniciar
docker rm -f grv # borrar el contenedor (la imagen se conserva)📝 Pregunta: después de docker rm -f grv, ¿sigue existiendo la imagen? Compruébalo con docker images.
docker compose up -d --build # construye y levanta el servicio "web"
docker compose ps
docker compose logs -f web
docker compose down # detiene y borra el contenedor# macOS / Linux
PORT=8081 docker compose up -d --build
# Windows PowerShell
$env:PORT=8081; docker compose up -d --buildEl servicio dev no copia el código a la imagen: lo monta desde tu carpeta.
docker compose down
docker compose --profile dev up dev- Abre http://localhost:8080/?demo.
- En tu editor, abre
src/assets/styles.cssy cambia--primary: #1b396a;por otro color, por ejemplo#7c2d12. - Guarda y recarga el navegador con
Ctrl+Shift+R(Cmd+Shift+Ren Mac).
✅ Verificación: el encabezado cambia de color sin reconstruir la imagen.
📝 Pregunta: ¿por qué en el servicio web el cambio no aparece hasta ejecutar docker compose up -d --build?
Para detener el modo desarrollo usa Ctrl+C.
Las pruebas unitarias (parsers, Haversine, línea de tiempo) usan Node.js. Con Docker no necesitas instalarlo:
# macOS / Linux
docker run --rm -v "$PWD":/app -w /app node:22-alpine sh -c 'node --test tests/*.test.js'
# Windows PowerShell
docker run --rm -v "${PWD}:/app" -w /app node:22-alpine sh -c 'node --test tests/*.test.js'✅ Verificación: la salida termina con # pass 26 y # fail 0.
Las pruebas de GPX y KML corren en el navegador: con la app levantada, abre http://localhost:8080/tests/browser.html. Esa ruta solo funciona en modo dev, porque la imagen de producción no incluye tests/.
scripts/simulate_gps.py imita un rastreador GPS y produce un CSV. Ejecútalo con Python desde Docker:
# macOS / Linux
docker run --rm -v "$PWD":/app -w /app python:3.12-alpine python scripts/simulate_gps.py --vehicle EQUIPO-01 --points 40 --noise 6 -o equipo01.csv
# Windows PowerShell
docker run --rm -v "${PWD}:/app" -w /app python:3.12-alpine python scripts/simulate_gps.py --vehicle EQUIPO-01 --points 40 --noise 6 -o equipo01.csvUsa
-o archivo.csven lugar de> archivo.csv: en Windows PowerShell 5 la redirección>guarda el archivo en UTF-16.
Arrastra equipo01.csv a la aplicación.
docker compose down
docker image rm gps-route-viewer
docker system df # espacio usado por Docker- Captura de
docker pscon el contenedor en ejecución. - Captura del navegador en
http://localhost:8080con tu CSV simulado cargado. - Captura del Paso 5 con el color modificado.
- Respuestas a las preguntas de los Pasos 3 y 5.
| Síntoma | Solución |
|---|---|
Cannot connect to the Docker daemon |
Abre Docker Desktop y espera a Engine running |
port is already allocated |
Usa otro puerto: PORT=8081 (ver Paso 4) |
Windows: WSL 2 installation is incomplete |
En PowerShell como administrador ejecuta wsl --install y reinicia |
El modo dev no muestra cambios |
Recarga sin caché (Ctrl+Shift+R); revisa que ejecutaste --profile dev up dev |
Al abrir index.html con doble clic no pasa nada |
Los módulos JS requieren HTTP; usa Docker o python3 -m http.server 8080 |