[[:templates_ai|{{wiki:user:undo_24.png}}]]
====== 🐘 DevContainer Laravel + MySQL ======
===== 📋 Visão Geral =====
Template completo de DevContainer para desenvolvimento Laravel com MySQL, Nginx e Redis, otimizado para VS Code.
===== 🚀 Comando de Criação =====
crie um devcontainer laravel + mysql
===== ⚙️ Pré-requisitos =====
Antes de usar este template, certifique-se de ter instalado:
* **Docker** (versão 27.5.1+)
* **Docker Compose** (versão 2.0+)
* **Git** para controle de versão
* **Portas livres:** 8089 e 33008 (ou outras disponíveis)
===== 📁 Estrutura do Projeto =====
Após a execução do comando, será criada a seguinte estrutura:
projeto/
├── .devcontainer/
│ ├── devcontainer.json
│ ├── docker-compose.yml
│ └── setup.sh
├── .docker/
│ ├── dbdata/
│ ├── mysql/
│ │ ├── Dockerfile
│ │ └── initdb.sql
│ ├── nginx/
│ │ ├── Dockerfile
│ │ └── nginx.conf
│ ├── php/
│ │ ├── custom.ini
│ │ └── entrypoint.sh
│ └── .gitignore
├── docker-compose.yml
└── Dockerfile
===== 🔧 Passo a Passo Detalhado =====
=== Passo 1: Preparação do Ambiente ===
1. **Verificações:**
* Verificação de portas disponíveis
* Criação da estrutura de arquivos
* Criação dos arquivos com base no código do tópico [[#scripts|scripts]]
* Substituições automáticas de variáveis
=== Passo 2: Configuração Automática ===
O sistema realizará automaticamente:
1. **Substituições de variáveis:**
* `project-name` → nome do projeto
* `project_name` → nome_do_projeto
* `Project Name` → Nome do Projeto
2. **Configuração de portas:**
* Nginx: `8089:8088` (verifica disponibilidade - se não estiver disponível utilizar outra disponível)
* MySQL: `33008:3308` (verifica disponibilidade - se não estiver disponível utilizar outra disponível)
3. **Execução do setup.sh:**
* Configuração automática do Git
* Definição de permissões do Laravel
* Configuração do PHP-FPM
* Limpeza de caches
* Verificação de serviços
===== 🔍 Troubleshooting =====
=== Problemas Comuns ===
1. **Porta já em uso:**
* Verificar se as portas 8089 e 33008 estão livres
* Alterar portas no docker-compose.yml se necessário
2. **Erro de permissões:**
* Verificar se o usuário tem acesso ao Docker
* Executar com sudo se necessário
3. **Container não inicia:**
* Verificar logs: `docker-compose logs`
* Rebuild: `docker-compose up --build`
4. **Laravel não conecta ao banco:**
* Verificar configurações no .env
* Confirmar se o MySQL está rodando
* Testar conexão: `php artisan tinker`
===== 📝 Notas Importantes =====
* **Portas não-padrão:** Evita conflitos com outros serviços
* **Usuário vscode:** Tem permissões sudo para instalações
* **Configurações de desenvolvimento:** Otimizadas para produtividade
* **Extensões VS Code:** Incluídas automaticamente
* **Backup automático:** Dados do MySQL são persistidos
* **Setup automático:** Script `setup.sh` configura o ambiente automaticamente
===== 🚀 Script de Configuração =====
O arquivo `setup.sh` é executado automaticamente após a criação do container e realiza:
=== Funcionalidades ===
* **Configuração do Git:** Ignora mudanças de permissões e define safe.directory
* **Permissões do Laravel:** Define ownership e permissões corretas para storage e cache
* **PHP-FPM:** Configura para usar usuário vscode e verifica se está rodando
* **Limpeza de caches:** Executa comandos artisan para limpar caches
* **Verificação de serviços:** Confirma se PHP-FPM está funcionando corretamente
=== Logs de Execução ===
O script fornece feedback visual com emojis e mensagens claras sobre cada etapa da configuração, facilitando o troubleshooting em caso de problemas.
===== Scripts =====
=== docker-compose.yml ===
services:
project-name-app:
build: .
container_name: laravel-app
volumes:
- .:/var/www
- ./.docker/php/custom.ini:/usr/local/etc/php/conf.d/custom.ini
networks:
- app-network
depends_on:
- project-name-db
- project-name-redis
command: /bin/sh -c "while sleep 1000; do :; done"
project-name-nginx:
build: .docker/nginx
container_name: laravel-nginx
restart: always
tty: true
ports:
- "8089:8088"
volumes:
- .:/var/www
networks:
- app-network
depends_on:
- project-name-app
project-name-db:
build: ./.docker/mysql
container_name: laravel-db
restart: always
tty: true
ports:
- "33008:3308"
volumes:
- ./.docker/dbdata:/var/lib/mysql
- ./.docker/mysql:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=project-name-db
- MYSQL_ROOT_PASSWORD=root
networks:
- app-network
project-name-redis:
image: redis:alpine
container_name: laravel-redis
networks:
- app-network
networks:
app-network:
driver: bridge
=== Dockerfile ===
FROM php:8.1-fpm
# Instalar dependências do sistema
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
libzip-dev \
vim \
nano \
sudo \
&& rm -rf /var/lib/apt/lists/*
# Instalar extensões PHP
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd sockets zip
# Criar usuário vscode para o devcontainer
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME -s /bin/bash \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
WORKDIR /var/www
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copiar entrypoint
COPY ./.docker/php/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
# Criar diretório de trabalho e definir permissões
RUN mkdir -p /var/www && chown -R $USERNAME:$USERNAME /var/www
# Mudar para usuário vscode apenas no final
USER $USERNAME
EXPOSE 9000
CMD ["php-fpm"]
=== .devcontainer/devcontainer.json ===
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-docker-compose
{
"name": "Project Name Dev Container",
// Update the 'dockerComposeFile' list if you have more compose files or use different names.
// The .devcontainer/docker-compose.yml file contains any overrides you need/want to make.
"dockerComposeFile": [
"../docker-compose.yml",
"docker-compose.yml"
],
// The 'service' property is the name of the service for the container that VS Code should
// use. Update this value and .devcontainer/docker-compose.yml to the real service name.
"service": "project-name-app",
// The optional 'workspaceFolder' property is the path VS Code should open by default when
// connected. This is typically a file mount in .devcontainer/docker-compose.yml
"workspaceFolder": "/var/www",
// Uncomment the next line if you want to keep your containers running after VS Code shuts down.
"shutdownAction": "stopCompose",
// Commands to run after the container is created
"postCreateCommand": "git config core.filemode false && git config core.autocrlf false && composer install && php artisan key:generate",
// Configure tool-specific properties.
"customizations": {
"vscode": {
"extensions": [
"bmewburn.vscode-intelephense-client",
"xdebug.php-debug",
"ms-vscode.vscode-json",
"bradlc.vscode-tailwindcss",
"esbenp.prettier-vscode"
]
}
},
"updateRemoteUserUID": false,
// Connect as vscode user
"remoteUser": "vscode",
// Run setup script after container starts
"postStartCommand": ".devcontainer/setup.sh",
// Environment variables
"containerEnv": {
"LARAVEL_SAIL": "1"
}
}
=== .devcontainer/docker-compose.yml ===
services:
project-name-app:
environment:
- DOCKER_BUILDKIT=0
volumes:
- .:/workspaces:cached
- .:/var/www:cached
command: /bin/sh -c "while sleep 1000; do :; done"
=== .docker/mysql/Dockerfile ===
FROM mysql:5.7
RUN usermod -u 1000 mysql
# Configuração personalizada para usar porta 3308
RUN echo "[mysqld]" > /etc/mysql/conf.d/custom.cnf && \
echo "port = 3308" >> /etc/mysql/conf.d/custom.cnf
=== .docker/mysql/initdb.sql ===
CREATE DATABASE IF NOT EXISTS project_name_db;
=== .docker/nginx/Dockerfile ===
FROM nginx:1.15.0-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/conf.d
=== .docker/nginx/nginx.conf ===
server {
listen 8088;
index index.php index.html;
root /var/www/public;
client_max_body_size 51g;
client_body_buffer_size 512k;
client_body_in_file_only clean;
location ~ \.php$ {
try_files $uri = 404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass project-name-app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
=== .docker/php/custom.ini ===
post_max_size=51200M
upload_max_filesize=51200M
=== .docker/php/entrypoint.sh ===
#!/bin/sh
# Aguardar um pouco para garantir que os serviços dependentes estejam prontos
sleep 5
# Configurar permissões automaticamente
echo "Configurando permissões do Laravel..."
chown -R vscode:vscode /var/www/storage
chown -R vscode:vscode /var/www/bootstrap/cache
chmod -R 775 /var/www/storage
chmod -R 775 /var/www/bootstrap/cache
# Configurar PHP-FPM para usar usuário vscode
sed -i 's/user = www-data/user = vscode/g' /usr/local/etc/php-fpm.d/www.conf
sed -i 's/group = www-data/group = vscode/g' /usr/local/etc/php-fpm.d/www.conf
# Iniciar PHP-FPM em background
php-fpm -D
echo "PHP-FPM iniciado com usuário vscode"
echo "Laravel pronto para uso!"
# Manter o container rodando
exec "$@"
=== .docker/.gitignore ===
dbdata
=== .devcontainer/setup.sh ===
#!/bin/bash
echo "🚀 Configurando ambiente Laravel DevContainer..."
# Aguardar um pouco para garantir que tudo esteja pronto
sleep 2
# Configurar Git para ignorar mudanças de permissões
echo "🔧 Configurando Git..."
git config core.filemode false
git config core.autocrlf false
git config --global --add safe.directory /var/www
# Configurar permissões do Laravel
echo "📁 Configurando permissões..."
sudo chown -R vscode:vscode /var/www/storage
sudo chown -R vscode:vscode /var/www/bootstrap/cache
sudo chmod -R 775 /var/www/storage
sudo chmod -R 775 /var/www/bootstrap/cache
# Configurar PHP-FPM para usar usuário vscode
echo "🔧 Configurando PHP-FPM..."
sudo sed -i 's/user = www-data/user = vscode/g' /usr/local/etc/php-fpm.d/www.conf
sudo sed -i 's/group = www-data/group = vscode/g' /usr/local/etc/php-fpm.d/www.conf
# Verificar se PHP-FPM já está rodando
if lsof -i :9000 >/dev/null 2>&1; then
echo "✅ PHP-FPM já está rodando na porta 9000"
else
# Iniciar PHP-FPM
echo "▶️ Iniciando PHP-FPM..."
sudo php-fpm -D
sleep 2
if lsof -i :9000 >/dev/null 2>&1; then
echo "✅ PHP-FPM iniciado com sucesso na porta 9000"
else
echo "❌ Erro ao iniciar PHP-FPM"
fi
fi
# Limpar caches do Laravel
echo "🧹 Limpando caches..."
php artisan config:clear
php artisan cache:clear
php artisan view:clear
echo "🎉 DevContainer configurado com sucesso!"
echo "📍 Acesse: http://localhost:8089 (Nginx + PHP-FPM)"
echo "📍 Ou use: php artisan serve --host=0.0.0.0 --port=8000"