Logo

dev-resources.site

for different kinds of informations.

Como configurar imagem Docker(PHP e Nginx) para projetos Laravel com PHP 8.3

Published at
4/24/2024
Categories
docker
laravel
php
dockercompose
Author
jmarcos16
Categories
4 categories in total
docker
open
laravel
open
php
open
dockercompose
open
Author
9 person written this
jmarcos16
open
Como configurar imagem Docker(PHP e Nginx) para projetos Laravel com PHP 8.3

Recentemente, eu estava configurando um ambiente de desenvolvimento para um projeto Laravel e decidi usar o Docker para criar o ambiente. Neste artigo, vou mostrar como você pode configurar uma imagem Docker com PHP 8.3 e Nginx para projetos Laravel.

Caso você não saiba, o Docker é uma plataforma de código aberto que facilita a criação, implantação e execução de aplicativos em contêineres. Os contêineres permitem que um desenvolvedor empacote um aplicativo com todas as partes necessárias, como bibliotecas e outras dependências, e envie tudo como um único pacote.

O laravel oferece uma solução para criar um ambiente de desenvolvimento com Docker, o Laravel Sail, que é um ambiente de desenvolvimento local para Laravel que usa contêineres Docker. No entanto, neste artigo, vou mostrar como você pode criar um ambiente de desenvolvimento com Docker manualmente, de maneira mais limpida e personalizada.

Um dos problemas de utilizar o Laravel Sail em um ambiente de produção é que ele não é recomendado, pois ele é um ambiente de desenvolvimento. Então, para evitar problemas futuros, é melhor criar um ambiente de desenvolvimento manualmente.

Primeiramente vamos clonar o repositório do Laravel para isso execute o seguinte comando:

git clone https://github.com/laravel/laravel.git
Enter fullscreen mode Exit fullscreen mode

Em seguida o primeiro passo é copiar o arquivo .env.example para .env
pois o Laravel usa o arquivo .env para carregar as variáveis de ambiente, e o arquivo .env.example é um exemplo de como o arquivo .env deve ser configurado.

cp .env.example .env
Enter fullscreen mode Exit fullscreen mode

Em seguida, vamos criar um arquivo chamado Dockerfile no seguinte caminho ./dockerfiles/php/Dockerfile e adicionar o seguinte conteúdo:

FROM php:8.3-fpm-alpine3.19

# Install system dependencies
RUN apk add --no-cache \
    bash \
    curl \
    libpng-dev \
    libzip-dev \
    zlib-dev

# Install PHP extensions
RUN docker-php-ext-install gd \
    && docker-php-ext-install zip

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Install node and npm
RUN apk add --no-cache nodejs npm

# Set working directory
WORKDIR /var/www

EXPOSE 9000

Enter fullscreen mode Exit fullscreen mode

Neste exemplo, vou utilizar a imagem php:8.3-fpm-alpine3.19 que é uma imagem oficial do PHP, em alguns casos recomenda-se utilizar a imagem php:8.3-fpm por questões de compatibilidade com algumas extensões do PHP, porem como esse projeto é um projeto simples, vou utilizar a alpine, para reduzir o tamanho da imagem, note também que estou instalando algumas dependências do sistema e algumas extensões do PHP, elas são necessárias para o Laravel funcionar corretamente.

Em seguida, vamos criar um arquivo chamado default.conf no seguinte caminho ./dockerfiles/nginx/default.conf e adicionar o seguinte conteúdo:

server {
    listen 80;
    index index.php;
    root /var/www/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass application:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
Enter fullscreen mode Exit fullscreen mode

Neste arquivo, estou configurando o servidor Nginx para ouvir na porta 80, e estou configurando o root do servidor para a pasta /var/www/public que é a pasta onde o Laravel armazena os arquivos públicos, e estou configurando o servidor para redirecionar todas as requisições para o arquivo index.php, este exemplo foi retirado da documentação oficial do Laravel, caso você queira saber mais sobre a configuração do servidor Nginx para o Laravel, você pode acessar a documentação oficial.

Em seguida, vamos criar um arquivo chamado docker-compose.yml na raiz do projeto e adicionar o seguinte conteúdo:

services:
  application:
    build:
      context: .
      dockerfile: dockerfiles/php/Dockerfile
    image: application
    container_name: application
    tty: true
    ports:
      - "9000:9000"
    volumes:
      - .:/var/www
    networks:
      - laravel_app
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - .:/var/www
      - ./dockerfiles/nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - laravel_app
networks:
  laravel_app:
    driver: bridge
Enter fullscreen mode Exit fullscreen mode

Neste arquivo, estou configurando dois serviços, o primeiro serviço é o application que é a imagem do PHP que criamos anteriormente, e o segundo serviço é o nginx que é a imagem do Nginx, e estou configurando o nginx para ouvir na porta 80 e redirecionar as requisições para o serviço application na porta 9000, e estou configurando o volume para o nginx para que ele possa acessar o arquivo default.conf que criamos anteriormente.

Agora já podemos criar a imagem do PHP e do Nginx, para isso execute o seguinte comando:

docker compose up -d
Enter fullscreen mode Exit fullscreen mode

Em seguinda, vamos instalar as dependências do Laravel, para isso execute o seguinte comando:

docker compose exec application composer install
Enter fullscreen mode Exit fullscreen mode

Em seguida, vamos gerar a chave do Laravel, para isso execute o seguinte comando:

docker compose exec application php artisan key:generate
Enter fullscreen mode Exit fullscreen mode

Agora já podemos acessar o projeto Laravel no navegador, para isso acesse o seguinte endereço:

http://localhost ou o ip da sua máquina
Enter fullscreen mode Exit fullscreen mode

Também é necessário configurar as permisões dos arquivos do Laravel, para isso execute o seguinte comando:

docker compose exec application chown -R www-data:www-data /var/www/storage
Enter fullscreen mode Exit fullscreen mode

No meu caso como estou utilizando dependencias node, tive que instalar as dependencias do node, para isso execute o seguinte comando:

docker compose exec application npm install
Enter fullscreen mode Exit fullscreen mode

E pronto, agora você tem um ambiente de desenvolvimento para projetos Laravel com PHP 8.3 e Nginx, considerando que a imagens do PHP e do Nginx são bem leves, e o ambiente é bem personalizável, e você pode adicionar mais serviços ao seu ambiente, como o banco de dados, cache, fila, etc, as duas imagens ficaram com um tamanho de 100MB cada, o que é bem leve para uma imagem do PHP e do Nginx.

dockercompose Article's
30 articles in total
Favicon
Want to Learn Docker in Advance Way?
Favicon
deploy Jenkins using docker compose with production ready
Favicon
Docker Advance Part 2: Docker Logging
Favicon
A Simple Guide to Docker Compose & Multi-Container Applications
Favicon
Dockerize nestjs app with postgres
Favicon
Tips and Tricks for Docker Compose: Leveraging the override Feature
Favicon
Dockerize nestjs application with Postgres
Favicon
RabbitMQ container with Docker Compose
Favicon
Quick and simple Local WordPress Setup for Lazy Developers
Favicon
Bug: Docker-compose up?
Favicon
How to resolve Docker Compose Warning WARN[0000] Found orphan containers
Favicon
How to resolve Docker Compose Warning WARN[0000] Found orphan containers
Favicon
How To Set Up Docker Selenium GRID
Favicon
How to Ensure Docker Compose Uses Environment Variables from the `.env` File
Favicon
Essential Docker Commands for Developers
Favicon
[Docker] How to fix 'host not found in upstream "host.docker.internal"'.
Favicon
Como configurar imagem Docker(PHP e Nginx) para projetos Laravel com PHP 8.3
Favicon
Containerize your multi-services app with docker compose
Favicon
សម្រាប់លុបអ្វីៗទាំង អស់ ក្នុង Docker compose.
Favicon
Installation of Docker Compose:
Favicon
MongoDB containers with Docker Compose
Favicon
An Overview of Docker Compose and its Features.
Favicon
How to change docker root data directory and why would you want to do that (hint: to optimize space)
Favicon
Containerize a Web Application using docker compose
Favicon
O Docker Compose agora tem uma V2, veja como instalar
Favicon
Vue 2 vite dockerized steps
Favicon
An Advanced Guide (2) to Docker: Managing Multi-Container Applications 🐳
Favicon
How to run mongodb using docker-compose in ubuntu
Favicon
How to run postgres database using docker and docker-compose
Favicon
Easy Dockerization with Docker INIT

Featured ones: