{"id":1455,"date":"2025-07-23T02:00:31","date_gmt":"2025-07-23T05:00:31","guid":{"rendered":"https:\/\/rjsites.com.br\/?p=1455"},"modified":"2025-08-12T09:15:34","modified_gmt":"2025-08-12T12:15:34","slug":"criando-um-ambiente-docker-para-instalacao-do-laravel-com-versao-de-php-personalizada","status":"publish","type":"post","link":"https:\/\/rjsites.com.br\/index.php\/2025\/07\/23\/criando-um-ambiente-docker-para-instalacao-do-laravel-com-versao-de-php-personalizada\/","title":{"rendered":"\ud83d\udc33 Criando um Ambiente Docker para Instala\u00e7\u00e3o do Laravel com Vers\u00e3o de PHP Personalizada"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>Cansei de ficar trocando a vers\u00e3o do PHP no WSL! Se voc\u00ea tamb\u00e9m trabalha com m\u00faltiplos projetos PHP com vers\u00f5es diferentes, esse tutorial \u00e9 pra voc\u00ea.<\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50)\">\ud83d\udccc Introdu\u00e7\u00e3o<\/h3>\n\n\n\n<p>Se voc\u00ea, assim como eu, vive criando novos projetos PHP\/Laravel com vers\u00f5es variadas do PHP (7.4, 8.1, 8.3&#8230;), sabe o quanto pode ser chato manter v\u00e1rias vers\u00f5es do PHP no mesmo sistema.<\/p>\n\n\n\n<p>Pensando nisso, decidi criar um <strong>ambiente isolado com Docker<\/strong>, apenas para instalar o Laravel com a vers\u00e3o correta do PHP via Composer. Assim, cada projeto roda com o que precisa, sem conflitos. Neste tutorial, vou te mostrar como configurar esse ambiente do zero.<\/p>\n\n\n\n<p>Ah, e se voc\u00ea <strong>ainda n\u00e3o tem o Docker instalado no seu WSL2<\/strong>, confere meu outro post:<br>\ud83d\udc49 <a href=\"#\">Como instalar o Docker no WSL2 com Windows<\/a> <em>(link em breve)<\/em><br><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50)\">\u2699\ufe0f 1. Definindo o local de instala\u00e7\u00e3o do Laravel<\/h3>\n\n\n\n<p>Crie uma <strong>pasta separada<\/strong> apenas para esse ambiente de instala\u00e7\u00e3o do Laravel. Isso evita conflito com os seus projetos.<\/p>\n\n\n\n<p><strong>No meu caso<\/strong>, eu uso a estrutura:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/rjsites\/docker\n<\/code><\/pre>\n\n\n\n<p>J\u00e1 os projetos Laravel ficam em:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/rjsites\/\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udee0\ufe0f 2. Criando o Dockerfile<\/h3>\n\n\n\n<p>Dentro da pasta <code>~\/rjsites\/docker<\/code>, crie um arquivo chamado <code>Dockerfile<\/code> com o conte\u00fado abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM php:8.1-fpm\n\n# Arguments defined in docker-compose.yml\nARG user\nARG uid\n\n# Install system dependencies\nRUN apt-get update &amp;&amp; apt-get install -y \\\n    git \\\n    curl \\\n    libpng-dev \\\n    libonig-dev \\\n    libxml2-dev \\\n    zip \\\n    unzip\n\n#Install node &amp; npm\nRUN apt-get update &amp;&amp; apt-get install -y \\\n    nodejs \\\n    npm\n\n# Clear cache\nRUN apt-get clean &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\n# Install PHP extensions\nRUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd\n\n# Get latest Composer\nCOPY --from=composer:latest \/usr\/bin\/composer \/usr\/bin\/composer\n\n# Create system user to run Composer and Artisan Commands\nRUN useradd -G www-data,root -u $uid -d \/home\/$user $user\nRUN mkdir -p \/home\/$user\/.composer &amp;&amp; \\\n    chown -R $user:$user \/home\/$user\n\n# Set working directory\nWORKDIR \/var\/www\n\nUSER $user\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83e\udde0 <strong>Dica<\/strong>: Troque <code>php:8.1-fpm<\/code> por <code>php:7.4-<\/code>fpm ou <code>php:8.3-<\/code>fpm se quiser outra vers\u00e3o.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc4 3. Criando o docker-compose.yml<\/h3>\n\n\n\n<p>No mesmo diret\u00f3rio, crie um arquivo <code>docker-compose.yml<\/code> com o conte\u00fado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.8'\nservices:\n  app:\n    build:\n      args:\n        user: ubuntuwsl\n        uid: 1000\n      context: .\/\n      dockerfile: Dockerfile\n    image: install\n    container_name: install-app\n    working_dir: \/var\/www\/\n    volumes:\n      - ~\/rjsites\/:\/var\/www\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Aqui o volume <code>~\/rjsites<\/code>\/<code>:\/var\/www<\/code> mapeia a pasta principal (<code>rjsites\/<\/code>) no container. Isso \u00e9 importante para que os projetos sejam criados diretamente do seu sistema de arquivos.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\ude80 4. Buildando e subindo o ambiente<\/h3>\n\n\n\n<p>Agora, vamos compilar o ambiente Docker e iniciar o container:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose build\ndocker compose up -d\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 5. Criando seu projeto Laravel<\/h3>\n\n\n\n<p>Vamos supor que voc\u00ea quer criar um projeto chamado <code>agendaApi<\/code>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Entre no container:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec -it install-app \\bash\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Crie a pasta do projeto:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir ~\/rjsites\/agendaApi\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Navegue at\u00e9 a pasta do projeto:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>cd agendaApi\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Rode o comando para instalar o Laravel:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para uma <strong>vers\u00e3o espec\u00edfica<\/strong>:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>composer create-project --prefer-dist laravel\/laravel . \"10.1\"\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para a <strong>\u00faltima vers\u00e3o dispon\u00edvel<\/strong>:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>composer create-project laravel\/laravel .\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Pronto!<\/h3>\n\n\n\n<p>O Laravel foi instalado com sucesso na pasta <code>agendaApi<\/code>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83e\udde9 Lembrando: este container \u00e9 <strong>apenas para instala\u00e7\u00e3o<\/strong> do Laravel via Composer. Para rodar seu projeto, <strong>n\u00e3o use este mesmo Dockerfile<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<p>Voc\u00ea precisa de um ambiente com <strong>Nginx + PHP + MySQL + Redis<\/strong>, e eu te mostro como montar isso em outro tutorial:<br>\ud83d\udc49 <a href=\"#\">Como subir seu ambiente Laravel com Docker (PHP, Nginx, MySQL e Redis)<\/a> <em>(em breve)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udc1e Poss\u00edveis problemas<\/h3>\n\n\n\n<p>Voc\u00ea pode ter problemas de permiss\u00e3o dentro do container quando tentar criar a pasta para o seu projeto.<\/p>\n\n\n\n<p>Uma maneira eficiente de resolver esse problema \u00e9 criar a paste pelo WSL2 e dar permiss\u00e3o geral (famoso chmod 777). Assim o container vai poder criar, editar, ver e executar arquivos dentro da nova pasta, para isso execute o seguinte comando fora do container.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/rjsites\/\n\nmkdir agendaApi\n\nchmod 777 agendaApi\n<\/code><\/pre>\n\n\n\n<p>Ap\u00f3s exeutar esses comandos, entre novamente no container e agora sim, execute o comando para instalar o Laravel dentro da pasta com as permiss\u00f5es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcac Conclus\u00e3o<\/h3>\n\n\n\n<p>Esse setup me salvou tempo e dores de cabe\u00e7a com vers\u00f5es de PHP conflitantes. Voc\u00ea pode usar esse container sempre que quiser iniciar um novo projeto Laravel \u2014 com a vers\u00e3o certa do PHP, rapidinho.<\/p>\n\n\n\n<p>Se te ajudou, compartilha com algu\u00e9m ou salva esse link pra futuras consultas. \ud83d\udc99<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cansei de ficar trocando a vers\u00e3o do PHP no WSL! Se voc\u00ea tamb\u00e9m trabalha com m\u00faltiplos projetos PHP com vers\u00f5es diferentes, esse tutorial \u00e9 pra voc\u00ea. \ud83d\udccc Introdu\u00e7\u00e3o Se voc\u00ea, assim como eu, vive criando novos projetos PHP\/Laravel com vers\u00f5es variadas do PHP (7.4, 8.1, 8.3&#8230;), sabe o quanto pode ser chato manter v\u00e1rias vers\u00f5es [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[3],"tags":[4,28,7,5,27,6],"class_list":["post-1455","post","type-post","status-publish","format-standard","hentry","category-docker","tag-docker","tag-laravel","tag-linux","tag-mysql","tag-php","tag-wsl2"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/posts\/1455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=1455"}],"version-history":[{"count":11,"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/posts\/1455\/revisions"}],"predecessor-version":[{"id":1482,"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/posts\/1455\/revisions\/1482"}],"wp:attachment":[{"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=1455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=1455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rjsites.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=1455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}