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.
Explicación del diagrama
| Elemento | Ubicación | Función |
|---|---|---|
| Código Laravel | Host (tu computadora) | Los archivos fuente de tu aplicación |
| Repositorio .git | Host (tu computadora) | Control de versiones local |
| Volumen Docker | Host → Contenedor | Sincroniza archivos entre host y contenedor |
| Contenedor PHP | Docker | Ejecuta el código PHP |
| GitHub | Remoto | Almacena el repositorio en la nube |
El concepto clave: los volúmenes
Cuando usas Docker con volúmenes (como en nuestro docker-compose.yml):
volumes: - ./src:/var/www/html # El directorio ./src del host se monta en /var/www/html del contenedor
Esto significa que:
✅ Los archivos existen físicamente en tu host
✅ El contenedor ve los mismos archivos (son una copia espejo)
✅ Git solo interactúa con los archivos del host
✅ Los cambios se reflejan automáticamente en el contenedor
Paso 2: Configuración del proyecto paso a paso
2.1 Estructura recomendada del proyecto
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)
# 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)
# En el host (fuera del contenedor) composer create-project laravel/laravel .
Opción B: Crear Laravel desde el contenedor
# 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)
# Generar la clave desde el contenedor docker compose exec app php artisan key:generate # El archivo .env se actualiza automáticamente en el host
3.2 Hacer commits (siempre en el host)
# 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
# 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ón | Explicación |
|---|---|
| Los archivos ya están sincronizados | Los volúmenes montan los archivos del host en el contenedor |
| El repositorio .git está en el host | Git necesita el directorio .git/ que solo existe en el host |
| El contenedor es efímero | Los contenedores se eliminan y recrean constantemente |
| Git en el contenedor añade complejidad | Configurar credenciales y SSH dentro del contenedor es innecesario |
| Mejores prácticas | Docker 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ón | Se ejecuta en | Comando |
|---|---|---|
| Inicializar Git | Host | git init |
| Ver estado | Host | git status |
| Hacer commit | Host | git commit -m "mensaje" |
| Subir a GitHub | Host | git push origin main |
| Instalar dependencias | Host o Contenedor | composer install (host) o docker compose exec app composer install |
| Ejecutar migraciones | Contenedor | docker compose exec app php artisan migrate |
| Generar clave | Contenedor | docker compose exec app php artisan key:generate |
| Ver logs | Host | docker 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:
Git está en la máquina virtual (host)
VS Code usa el Git de la máquina virtual
El contenedor solo ejecuta el código
Configuración en la máquina virtual
# 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
Desarrollo: Editas código en tu host (VS Code)
Pruebas: Ejecutas comandos en el contenedor via
docker compose execVersionado: Haces commits y pushes desde el host
Colaboración: Subes cambios a GitHub desde el host
❌ Lo que NO debes hacer
❌ Instalar Git dentro del contenedor
❌ Hacer
git initdentro 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
# 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
Comentarios
Publicar un comentario