Tabela de conteúdos
🐘 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
- 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"
