🐘 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"
Imprimir/Exportar
QR Code
QR Code templates_ai:devcontainers:laravel_mysql (generated for current page)