Docker Laravel · 9 min read · Nov 25, 2025
Dockerizando Laravel com Nginx MySQL e Docker Compose no Ubuntu 18.04 LTS

Laravel é um framework PHP gratuito e de código aberto que implementa o padrão de design MVC (Model-View-Controller). É projetado para facilidade de uso e permite que os desenvolvedores criem tanto aplicações simples quanto complexas em pouco tempo. Laravel foi criado por Taylor Otwell em 2011, como uma tentativa de fornecer uma alternativa avançada ao framework CodeIgniter (CI). Em 2011, Laravel lançou a versão 1 e a versão 2, e a versão mais recente 5.6 vem com mais recursos e melhorias, como suporte à linha de comando (CLI) chamado ‘artisan’, suporte para diferentes sistemas de banco de dados, melhorias nas rotas, etc.
Neste guia, vamos mostrar como Dockerizar o projeto Laravel com PHP-FPM, banco de dados MySQL e o servidor web Nginx usando o Docker Compose no Ubuntu Server 18.04. Vamos criar uma nova imagem docker para o Projeto Laravel e, em seguida, criar o script docker-compose.yml que contém alguns serviços, incluindo o App/Laravel em si, o servidor web Nginx e o banco de dados MySQL.
Pré-requisitos
- Ubuntu 18.04
- Privilégios de root
O que faremos:
- Instalar Docker e Docker Compose
- Baixar Laravel e Instalar Dependências
- Dockerizando o Projeto Laravel - Definir Serviço da App Laravel
- Definir Serviço HTTP do Nginx
- Definir Serviço do Banco de Dados MySQL
- Criar Host Virtual Nginx para Laravel
- Criar Dockerfile para a App Laravel
- Construir o Projeto Laravel
- Pós-instalação do Laravel
Passo 1 - Instalar Docker e Docker Compose
Primeiramente, vamos instalar os pacotes Docker e Docker Compose no sistema Ubuntu. E usaremos os pacotes Docker do repositório oficial do Ubuntu.
Antes de prosseguir, precisamos atualizar os repositórios no sistema Ubuntu. Basta executar o seguinte comando.
sudo apt updateAgora instale os pacotes Docker e Docker Compose usando o comando apt abaixo.
sudo apt install docker.io -y
sudo apt install docker-compose -yOs pacotes Docker e Docker Compose devem agora estar instalados no sistema, verifique usando os seguintes comandos.
docker version
docker-compose versionComo resultado, você obterá a versão do Docker e do Docker Compose no sistema.

Em seguida, precisamos atribuir o usuário não-root ao grupo docker para executar o contêiner Docker para usuários não-root.
Para isso, vamos adicionar o usuário chamado ‘hakase’ ao grupo docker executando o seguinte comando.
usermod -a -G docker hakaseE depois disso, faça login no shell do usuário ‘hakase’ e execute o comando docker ‘hello-world’.
su - hakase
docker run hello-worldAgora você verá a mensagem ‘Hello World’ do Docker, e a instalação do Docker foi concluída.

Passo 2 - Baixar Laravel e Instalar Dependências
Neste passo, vamos baixar o framework web Laravel para o diretório home do ‘hakase’ e, em seguida, instalar as dependências do Laravel usando a imagem docker ‘composer’ do PHP. Portanto, certifique-se de que você está logado no servidor como um usuário não-root.
Baixe o projeto Laravel para o diretório ‘myapp’ e entre nele.
git clone https://github.com/laravel/laravel.git myapp/
cd myapp/Agora execute o seguinte comando docker para instalar as dependências do Laravel.
docker run --rm -v $(pwd):/app composer installCom o comando acima, vamos executar um novo contêiner docker temporário e montar o diretório do projeto ‘myapp’ no diretório ‘/app’ no contêiner. O contêiner é baseado na imagem docker ‘composer’, e estamos instalando as dependências do Laravel usando o comando ‘composer’ dentro desse contêiner temporário.

Uma vez que a instalação das dependências do Laravel esteja concluída, devemos mudar o proprietário do diretório ‘myapp’ para nosso próprio usuário usando o comando sudo abaixo.
sudo chown -R $USER:$USER ~/myapp
Passo 3 - Dockerizando o Projeto Laravel
Após baixar o Laravel e instalar suas dependências, vamos criar um novo script docker-compose.yml e criar um novo Dockerfile para o projeto Laravel.
cd myapp/
vim docker-compose.yml- Definir o Serviço da App Laravel
Primeiramente, vamos definir o próprio projeto Laravel e construir a imagem docker para o projeto Laravel usando o Dockerfile.
Cole o script de composição docker nele.
version: '3'
services:
#App Laravel
app:
build:
context: .
dockerfile: Dockerfile
image: hakase-labs/laravel
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www/html
volumes:
- ./:/var/www/html
networks:
- mynetDetalhes do serviço do contêiner Laravel:
- O serviço do contêiner Laravel será nomeado como ‘app’. É baseado na nossa imagem docker personalizada que será criada com nosso ‘Dockerfile’, e a nova imagem será nomeada como ‘hakase-labs/laravel’.
- Queremos montar o diretório do projeto ‘myapp’ no diretório ‘/var/www/html’ dentro do serviço do contêiner.
- Estamos usando a rede docker personalizada para nossa configuração, a rede será nomeada como ‘mynet’.
- Definir Serviço HTTP do Nginx
Agora vamos definir o serviço do contêiner nginx.
Cole a seguinte configuração após a linha do serviço do contêiner ‘app’.
#Serviço Nginx
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/html
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynetDetalhes da configuração do serviço do contêiner nginx:
- Queremos criar um novo contêiner nomeado ‘nginx’ baseado na imagem docker ‘nginx:alpine’.
- O serviço do contêiner abrirá as portas HTTP e HTTPS.
- O contêiner montará três volumes diferentes. O diretório do projeto ‘myapp’ para o diretório ‘/var/www/html’, a configuração do host virtual nginx ‘nginx/conf.d/‘ para o diretório ‘/etc/nginx/conf.d’ e montará os arquivos de certificado ‘nginx/ssl/‘ para o diretório ‘/etc/nginx/ssl’ no contêiner.
- O serviço do contêiner usará a mesma rede chamada ‘mynet’.
- Definir Serviço do Banco de Dados MySQL
E por último, definimos o serviço do banco de dados MySQL.
Cole a seguinte configuração após a linha do serviço do contêiner ‘nginx’.
#Serviço MySQL
db:
image: mysql:5.7
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laraveldb
MYSQL_USER: laravel
MYSQL_PASSWORD: laravelpassworddb
MYSQL_ROOT_PASSWORD: rootpasswordmysql
volumes:
- mysqldata:/var/lib/mysql/
networks:
- mynet
#Redes Docker
networks:
mynet:
driver: bridge
#Volumes
volumes:
mysqldata:
driver: localSalve e feche a configuração.
Detalhes do serviço do contêiner MySQL:
- O serviço do contêiner MySQL será nomeado como ‘db’, baseado na imagem docker ‘mysql:5.7’.
- O serviço ‘db’ abrirá a porta padrão do MySQL ‘3306’.
- O projeto Laravel usará o banco de dados, usuário e senha com base na variável de ambiente do serviço ‘db’.
- O serviço MySQL ‘db’ montará o volume nomeado ‘mysqldata’ e terá a mesma rede ‘mynet’.
- E definimos a rede personalizada ‘mynet’ com o driver ‘bridge’, e o volume ‘mysqldata’ usará o driver ‘local’.
Abaixo está a configuração completa do ‘docker-compose.yml’:
version: '3'
services:
#App Laravel
app:
build:
context: .
dockerfile: Dockerfile
image: hakase-labs/laravel
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www/html
volumes:
- ./:/var/www/html
networks:
- mynet
#Serviço Nginx
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/html
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Serviço MySQL
db:
image: mysql:5.7
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laraveldb
MYSQL_USER: laravel
MYSQL_PASSWORD: laravelpassworddb
MYSQL_ROOT_PASSWORD: rootpasswordmysql
volumes:
- mysqldata:/var/lib/mysql/
networks:
- mynet
#Redes Docker
networks:
mynet:
driver: bridge
#Volumes
volumes:
mysqldata:
driver: local- Criar Host Virtual Nginx para Laravel
Dentro do diretório do projeto ‘myapp’, crie um novo diretório chamado ‘nginx’ que conterá outros dois diretórios ‘conf.d’ e ‘ssl’. Em seguida, crie uma nova configuração de host virtual nginx ‘laravel.conf’ dentro do diretório ‘conf.d’.
Execute o seguinte comando.
mkdir -p nginx/{conf.d,ssl}
vim nginx/conf.d/laravel.confserver {
listen 80;
server_name laravel.hakase-labs.io;
return 301 https://laravel.hakase-labs.io$request_uri;
}
server {
listen 443 ssl http2;
server_name laravel.hakase-labs.io;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Arquivos de log para Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
# Diretório raiz da web Laravel
root /var/www/html/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
# Nginx Passa requisições para PHP-FPM
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 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;
}
}Salve e feche.
Depois disso, copie seu arquivo de certificado ssl para o diretório ‘nginx/ssl/‘.
sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/- Criar Dockerfile para a App Laravel
Em seguida, crie um novo Dockerfile para o projeto Laravel.
Execute o seguinte comando.
vim DockerfileCole a configuração abaixo.
# Definir imagem mestre
FROM php:7.2-fpm-alpine
# Copiar composer.lock e composer.json
COPY composer.lock composer.json /var/www/html/
# Definir diretório de trabalho
WORKDIR /var/www/html
# Instalar Dependências Adicionais
RUN apk update && apk add --no-cache \
build-base shadow vim curl \
php7 \
php7-fpm \
php7-common \
php7-pdo \
php7-pdo_mysql \
php7-mysqli \
php7-mcrypt \
php7-mbstring \
php7-xml \
php7-openssl \
php7-json \
php7-phar \
php7-zip \
php7-gd \
php7-dom \
php7-session \
php7-zlib
# Adicionar e Habilitar Extensões PHP-PDO
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable pdo_mysql
# Instalar PHP Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Remover Cache
RUN rm -rf /var/cache/apk/*
# Adicionar UID '1000' ao www-data
RUN usermod -u 1000 www-data
# Copiar permissões do diretório da aplicação existente
COPY --chown=www-data:www-data . /var/www/html
# Mudar usuário atual para www
USER www-data
# Expor porta 9000 e iniciar servidor php-fpm
EXPOSE 9000
CMD ["php-fpm"]Salve e feche a configuração.
E estamos prontos para construir o projeto Laravel ‘myapp’ e executar os serviços de contêiner que definimos.
Passo 4 - Construir Laravel com Serviços Nginx e MySQL
Construa a imagem docker personalizada para nosso projeto Laravel usando o seguinte comando.
docker-compose build
Em seguida, execute novamente o seguinte comando.
docker-compose up -dIsso fará o download de todas as imagens docker que precisamos e, em seguida, construirá os serviços de contêiner com base na configuração do ‘docker-compose.yml’.

Quando terminar, verifique usando o comando docker-compose abaixo.
docker-compose psE como resultado, você verá que os três serviços de contêiner estão em execução. O ‘app’ que está rodando na porta padrão ‘9000’ PHP-FPM, o serviço ‘nginx’ nas portas HTTP e HTTPS, e o serviço MySQL ‘db’ na porta padrão do MySQL ‘3306’.
Depois disso, verifique novamente todas as imagens docker disponíveis e as portas abertas no sistema.
docker-compose images
netstat -plntuVocê obterá a imagem docker personalizada ‘hakase-labs/laravel’ na lista, e as portas HTTP e HTTPS estão no estado ‘LISTEN’.

Passo 5 - Pós-instalação do Laravel
Até este estágio, o projeto Laravel está em execução como um contêiner Docker. E agora vamos criar um novo arquivo ‘.env’, gerar a chave e migrar os dados do Laravel usando a linha de comando do Laravel ‘artisan’.
Copie o exemplo do arquivo ‘.env’ e edite-o dentro do contêiner.
cp .env.example .env
docker-compose exec app vim .envAltere a configuração do banco de dados como abaixo.
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddbSalve e feche.
Em seguida, gere a chave da aplicação Laravel e limpe a configuração do cache.
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cacheDepois disso, migre o banco de dados usando o seguinte comando.
docker-compose exec app php artisan migrateCertifique-se de que não haja erro.

Agora abra seu navegador e digite o nome de domínio do seu projeto.
http://laravel.hakase-labs.io/
E você será redirecionado para a conexão HTTPS segura e verá a página inicial padrão do Laravel como abaixo.

Finalmente, a Dockerização do projeto Laravel com o servidor web Nginx e o banco de dados MySQL foi concluída com sucesso.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.