Skip to content

11. Del desarrollo al despliegue

Temas del programa: 4.3

En desarrollo buscamos facilidad para modificar el código y observar resultados

En producción necesitamos además controlar disponibilidad seguridad configuración datos y recuperación

DESARROLLO
Código + imágenes + Compose
PRODUCCIÓN
Imágenes versionadas
+ configuración controlada
+ datos persistentes
+ monitoreo
+ respaldos
+ seguridad

Contenerizar no sustituye la planeación de operación

Aplicación
│
├── Imagen
├── Configuración
├── Datos persistentes
├── Redes
└── Dependencias de infraestructura

No necesitamos trasladar literalmente toda la computadora del desarrollador

Necesitamos definir los artefactos y servicios necesarios para ejecutar la aplicación en el ambiente destino

Equipo de desarrollo
│
▼
docker build
│
▼
Imagen versionada
│
▼
Registry
│
▼
Servidor
│
▼
docker compose up

El registry puede ser Docker Hub o un registro privado como GitLab Container Registry

El servidor debe tener acceso autorizado al registro y a la configuración requerida

Ejemplo

reservafic:1.0.0
reservafic:1.1.0
reservafic:1.2.0

Las etiquetas permiten identificar versiones de la aplicación

Para despliegues reproducibles debemos controlar también las imágenes base las dependencias y la configuración

Una etiqueta por sí sola no garantiza que el contenido de una referencia sea inmutable

Equipo A
│
▼
Repositorio
│
▼
Definición de ambiente
│
▼
Ejecución
Equipo B
│
▼
Repositorio
│
▼
Definición de ambiente
│
▼
Ejecución

Buscamos que ambos equipos utilicen versiones y configuraciones controladas

El resultado puede seguir dependiendo de diferencias de arquitectura recursos y del entorno de ejecución

¿Cómo diagnosticamos un contenedor detenido?

Section titled “¿Cómo diagnosticamos un contenedor detenido?”

Primero observamos

Terminal window
docker ps -a

Después consultamos sus registros

Terminal window
docker logs nombre_contenedor

Y examinamos su configuración

Terminal window
docker inspect nombre_contenedor

No comenzamos eliminando todo ni reconstruyendo la aplicación sin entender el problema

Supongamos que aparece un error al publicar

Bind for 127.0.0.1:8080 failed
port is already allocated

Una causa posible es que otro proceso o contenedor ya utilice el puerto

Podemos revisar

Terminal window
docker ps

También debemos comprobar los procesos y servicios del host mediante las herramientas apropiadas para el sistema operativo

Aplicación
│
▼
localhost:5432
│
▼
Connection refused

Preguntas de diagnóstico

  • ¿PostgreSQL está ejecutándose?
  • ¿Está listo para aceptar conexiones?
  • ¿La dirección es correcta?
  • ¿La aplicación está dentro o fuera de un contenedor?
  • ¿El puerto corresponde al servicio correcto?
  • ¿Los servicios comparten la red adecuada?
Permission denied

Antes de cambiar permisos revisamos

Terminal window
whoami
id
ls -l archivo

También debemos verificar

  • Quién es el propietario
  • Qué grupos intervienen
  • Qué permisos tiene el directorio padre
  • Qué usuario ejecuta el proceso del contenedor
  • Si hay un volumen o bind mount involucrado

No utilices chmod 777 como solución automática

Primero preguntamos dónde se almacenaban

¿Capa de escritura del contenedor?
│
▼
Datos ligados al ciclo de vida del contenedor
¿Volumen nombrado?
│
▼
Datos separados del ciclo de vida del contenedor

Después revisamos si el volumen existe y si fue eliminado

Los respaldos siguen siendo necesarios aunque utilicemos volúmenes

Terminal window
docker version
docker info
docker ps -a
docker images
docker network ls
docker volume ls

Para un contenedor específico

Terminal window
docker inspect nombre_contenedor
docker logs nombre_contenedor
docker stats

Estos comandos ayudan a obtener evidencia antes de cambiar la configuración

Continúa con 12. Escalabilidad y orquestación.