[[: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"