Dockerizing Laravel 10 [Ubuntu image + PHP 8.2 + NGINX
I’ve been trying to dockerize my Laravel app which acts as an API and run it on my server. While many Dockerfile exists on the internet when you search, they are mostly incomplete or somehow specific to some usage.
I will explain how I’ve done it and try to complete it to become a great Dockerfile for Laravel. Please let me know of anything better or any way to optimize it or any features missing from an optimal Laravel environment.
Be aware that this article is only about dockerizing a Laravel application and not any other database or filesystem. I will put these as a series procedurally.
TL;DR
Copy the content below inside a file called Docerfile at the root of your project. (Root of a project is where there are files like artisan
, composer.json
and .env
, in case you are confused)
FROM ubuntu:latest AS base
ENV DEBIAN_FRONTEND noninteractive# Install dependencies
RUN apt update
RUN apt install -y software-properties-common
RUN add-apt-repository -y ppa:ondrej/php
RUN apt update
RUN apt install -y php8.2\
php8.2-cli\
php8.2-common\
php8.2-fpm\
php8.2-mysql\
php8.2-zip\
php8.2-gd\
php8.2-mbstring\
php8.2-curl\
php8.2-xml\
php8.2-bcmath\
php8.2-pdo# Install php-fpm
RUN apt install -y php8.2-fpm php8.2-cli# Install composer
RUN apt install -y curl
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# Install nodejs
RUN apt install -y ca-certificates gnupg
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
ENV NODE_MAJOR 20
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
RUN apt update
RUN apt install -y nodejs# Install nginx
RUN apt install -y nginx
RUN echo "\
server {\n\
listen 80;\n\
listen [::]:80;\n\
root /var/www/html/public;\n\
add_header X-Frame-Options \"SAMEORIGIN\";\n\
add_header X-Content-Type-Options \"nosniff\";\n\
index index.php;\n\
charset utf-8;\n\
location / {\n\
try_files \$uri \$uri/ /index.php?\$query_string;\n\
}\n\
location = /favicon.ico { access_log off; log_not_found off; }\n\
location = /robots.txt { access_log off; log_not_found off; }\n\
error_page 404 /index.php;\n\
location ~ \.php$ {\n\
fastcgi_pass unix:/run/php/php8.2-fpm.sock;\n\
fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;\n\
include fastcgi_params;\n\
}\n\
location ~ /\.(?!well-known).* {\n\
deny all;\n\
}\n\
}\n" > /etc/nginx/sites-available/defaultRUN echo "\
#!/bin/sh\n\
echo \"Starting services...\"\n\
service php8.2-fpm start\n\
nginx -g \"daemon off;\" &\n\
echo \"Ready.\"\n\
tail -s 1 /var/log/nginx/*.log -f\n\
" > /start.shCOPY . /var/www/html
WORKDIR /var/www/htmlRUN chown -R www-data:www-data /var/www/htmlRUN composer installEXPOSE 80CMD ["sh", "/start.sh"]
Run the build command from terminal and then run the image:
docker build -t MY_IMAGE .
docker run -p "8000:80" MY_IMAGE
Then open your browser and navigate to “http://localhost:8000/"
Boom! Your Laravel is up!