Flujo de trabajo con Git, Laravel y Docker

 

Flujo de trabajo con Git, Laravel y Docker

Introducción

Una de las dudas más comunes al trabajar con Laravel y Docker es: ¿Dónde se ejecuta Git? ¿Dentro del contenedor o en el host? En este tutorial resolveremos esta pregunta y te mostraremos el flujo de trabajo óptimo para gestionar el control de versiones de tu proyecto.


La respuesta corta

Git se ejecuta en tu máquina host (local), no dentro del contenedor Docker.

Los archivos de tu proyecto viven en tu computadora (host) y se sincronizan con el contenedor mediante volúmenes. Por lo tanto, todos los comandos de Git (git init, git add, git commit, etc.) se ejecutan fuera del contenedor, en tu sistema operativo anfitrión.

cdvccxv


Explicación del diagrama

ElementoUbicaciónFunción
Código LaravelHost (tu computadora)Los archivos fuente de tu aplicación
Repositorio .gitHost (tu computadora)Control de versiones local
Volumen DockerHost → ContenedorSincroniza archivos entre host y contenedor
Contenedor PHPDockerEjecuta el código PHP
GitHubRemotoAlmacena el repositorio en la nube

El concepto clave: los volúmenes

Cuando usas Docker con volúmenes (como en nuestro docker-compose.yml):

yaml
volumes:
  - ./src:/var/www/html   # El directorio ./src del host se monta en /var/www/html del contenedor

Esto significa que:

  1. ✅ Los archivos existen físicamente en tu host

  2. ✅ El contenedor ve los mismos archivos (son una copia espejo)

  3. ✅ Git solo interactúa con los archivos del host

  4. ✅ Los cambios se reflejan automáticamente en el contenedor


Paso 2: Configuración del proyecto paso a paso

2.1 Estructura recomendada del proyecto

text
mi-proyecto-laravel/              ← Carpeta en tu host (local)
├── .git/                         ← ¡Aquí vive el repositorio Git!
├── .gitignore
├── .env
├── Dockerfile
├── docker-compose.yml
├── app/                          ← Código Laravel
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── tests/
└── vendor/

2.2 Inicializar Git en el host (fuera del contenedor)

bash
# Navegar a tu proyecto (estás en el host, no dentro del contenedor)
cd /ruta/del/proyecto/mi-proyecto-laravel

# Inicializar Git en el host
git init

# Configurar usuario (una sola vez)
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@ejemplo.com"

# Crear .gitignore (fuera del contenedor)
echo "/vendor/" >> .gitignore
echo "/.env" >> .gitignore
echo "/node_modules/" >> .gitignore

# Primer commit (host)
git add .
git commit -m "Initial commit"

2.3 Crear el proyecto Laravel usando Docker

Opción A: Crear Laravel directamente en el host (recomendado)

bash
# En el host (fuera del contenedor)
composer create-project laravel/laravel .

Opción B: Crear Laravel desde el contenedor

bash
# Los archivos se crearán dentro del contenedor, pero como el volumen los sincroniza,
# también aparecerán en tu host automáticamente
docker compose exec app composer create-project laravel/laravel .

2.4 Generar clave de la aplicación (host)

bash
# Generar la clave desde el contenedor
docker compose exec app php artisan key:generate

# El archivo .env se actualiza automáticamente en el host
ghj

3.2 Hacer commits (siempre en el host)

bash
# 1. Verificar estado de los cambios (host)
git status

# 2. Ver qué archivos han cambiado (host)
git diff

# 3. Agregar archivos al staging (host)
git add app/Http/Controllers/UsuarioController.php
git add resources/views/usuarios/index.blade.php

# 4. Hacer commit (host)
git commit -m "feat: add user listing functionality"

# 5. Subir a GitHub (host)
git push origin main

3.3 Probar cambios en el contenedor

bash
# Ejecutar migraciones desde el host (pero el comando se ejecuta en el contenedor)
docker compose exec app php artisan migrate

# Ejecutar tests
docker compose exec app php artisan test

# Ver logs
docker compose logs -f app

Paso 4: ¿Necesito Git dentro del contenedor?

❌ NO, no necesitas Git dentro del contenedor

RazónExplicación
Los archivos ya están sincronizadosLos volúmenes montan los archivos del host en el contenedor
El repositorio .git está en el hostGit necesita el directorio .git/ que solo existe en el host
El contenedor es efímeroLos contenedores se eliminan y recrean constantemente
Git en el contenedor añade complejidadConfigurar credenciales y SSH dentro del contenedor es innecesario
Mejores prácticasDocker recomienda que los contenedores sean desechables y solo contengan lo necesario para ejecutar la aplicación

✅ Qué contiene el contenedor

El contenedor solo debe tener:

  • PHP y sus extensiones

  • Composer

  • Dependencias de Laravel (vendor/, node_modules/)

  • El código que se monta desde el host mediante volúmenes

NO debe tener:

  • Git instalado

  • Directorio .git/

  • Credenciales de GitHub

  • Archivos de configuración de Git


Paso 5: Comandos comparativos

AcciónSe ejecuta enComando
Inicializar GitHostgit init
Ver estadoHostgit status
Hacer commitHostgit commit -m "mensaje"
Subir a GitHubHostgit push origin main
Instalar dependenciasHost o Contenedorcomposer install (host) o docker compose exec app composer install
Ejecutar migracionesContenedordocker compose exec app php artisan migrate
Generar claveContenedordocker compose exec app php artisan key:generate
Ver logsHostdocker compose logs

Paso 6: Visual Studio Code con SSH

Cuando te conectas a tu máquina virtual con VS Code usando Remote - SSH, estás editando archivos en el host (la máquina virtual). En este caso:

  1. Git está en la máquina virtual (host)

  2. VS Code usa el Git de la máquina virtual

  3. El contenedor solo ejecuta el código

Configuración en la máquina virtual

bash
# En la máquina virtual (host)
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@ejemplo.com"

# Desde VS Code conectado por SSH
# 1. Abres la carpeta del proyecto
# 2. Usas la interfaz de Source Control de VS Code
# 3. Haces commits desde VS Code (que ejecuta Git en la máquina virtual)

Paso 7: Buenas prácticas

✅ Flujo de trabajo recomendado

  1. Desarrollo: Editas código en tu host (VS Code)

  2. Pruebas: Ejecutas comandos en el contenedor via docker compose exec

  3. Versionado: Haces commits y pushes desde el host

  4. Colaboración: Subes cambios a GitHub desde el host

❌ Lo que NO debes hacer

  • ❌ Instalar Git dentro del contenedor

  • ❌ Hacer git init dentro del contenedor

  • ❌ Usar .git/ dentro del contenedor

  • ❌ Hacer commits desde dentro del contenedor

  • ❌ Configurar credenciales de GitHub en el contenedor


Paso 8: Ejemplo práctico completo

Escenario: Desarrollar una nueva funcionalidad

bash
# 1. Host: Crear rama para la funcionalidad
git checkout -b feature/nuevo-modulo

# 2. Host: Editar código en VS Code

# 3. Host/Contenedor: Probar cambios
docker compose exec app php artisan test

# 4. Host: Preparar cambios
git add .

# 5. Host: Commit
git commit -m "feat: add new module functionality"

# 6. Host: Subir rama
git push origin feature/nuevo-modulo

# 7. GitHub: Abrir Pull Request
# 8. Después de revisión y merge:
git checkout main
git pull origin main



Conclusión

  • Git vive en el host, siempre

  • ✅ Los comandos de Git se ejecutan en el host (fuera del contenedor)

  • ✅ El contenedor solo ejecuta el código de tu aplicación

  • ✅ Los volúmenes sincronizan los archivos automáticamente

  • ✅ Los commits registran cambios en los archivos del host, que se reflejan en el contenedor

Recuerda: El contenedor no necesita Git porque los archivos que ejecuta ya están versionados en el host. ¡Así mantienes tu entorno Docker limpio y siguiendo las mejores prácticas!

¡Felicidades! 🎉 Ahora tienes claro cómo trabajar con Git, Laravel y Docker de forma correcta y eficiente

x
x
x

x
x


Comentarios

Entradas más populares de este blog

12. Hola Mundo en Docker.

11¿Qué es Docker? y ¿Por qué debo saberlo?

14. Publish and Detached modes