Docker Laravel · 8 min read · Nov 25, 2025
Dockerизация Laravel с Nginx, MySQL и Docker Compose на Ubuntu 18.04 LTS

Laravel — это бесплатный и открытый PHP-фреймворк, который реализует шаблон проектирования MVC (Model-View-Controller). Он разработан с учетом удобства использования и позволяет разработчикам создавать как простые, так и сложные приложения за короткое время. Laravel был создан Тейлором Отвеллом в 2011 году как попытка предоставить продвинутую альтернативу фреймворку CodeIgniter (CI). В 2011 году Laravel выпустил версии 1 и 2, а последняя версия 5.6 включает в себя больше и улучшенных функций, таких как поддержка командной строки (CLI) под названием ‘artisan’, поддержка различных систем баз данных, улучшения маршрутизации и т. д.
В этом руководстве мы покажем вам, как Dockerизировать проект Laravel с PHP-FPM, базой данных MySQL и веб-сервером Nginx, используя Docker Compose на сервере Ubuntu 18.04. Мы создадим новый образ Docker для проекта Laravel, а затем создадим скрипт docker-compose.yml, который содержит некоторые сервисы, включая сам App/Laravel, веб-сервер Nginx и базу данных MySQL.
Предварительные требования
- Ubuntu 18.04
- Привилегии root
Что мы будем делать:
- Установить Docker и Docker Compose
- Скачать Laravel и установить зависимости
- Dockerизация проекта Laravel - Определить сервис приложения Laravel
- Определить HTTP-сервис Nginx
- Определить сервис базы данных MySQL
- Создать виртуальный хост Nginx для Laravel
- Создать Dockerfile для приложения Laravel
- Собрать проект Laravel
- Постустановка Laravel
Шаг 1 - Установка Docker и Docker Compose
Сначала мы установим пакеты Docker и Docker Compose в систему Ubuntu. И мы будем использовать пакеты Docker из официального репозитория Ubuntu.
Перед тем как продолжить, нам нужно обновить репозитории в системе Ubuntu. Просто запустите следующую команду.
sudo apt updateТеперь установите пакеты Docker и Docker Compose, используя команду apt ниже.
sudo apt install docker.io -y
sudo apt install docker-compose -yПакеты Docker и Docker Compose теперь должны быть установлены в системе, проверьте это, используя следующие команды.
docker version
docker-compose versionВ результате вы получите версию Docker и Docker Compose в системе.

Далее нам нужно назначить пользователя без прав root в группу docker, чтобы запускать контейнер Docker для пользователей без прав root.
В этом случае мы добавим пользователя с именем ‘hakase’ в группу docker, выполнив следующую команду.
usermod -a -G docker hakaseА после этого войдите в оболочку пользователя ‘hakase’ и выполните команду docker ‘hello-world’.
su - hakase
docker run hello-worldТеперь вам будет показано сообщение ‘Hello World’ от Docker, и установка Docker завершена.

Шаг 2 - Скачать Laravel и установить зависимости
На этом шаге мы собираемся скачать веб-фреймворк Laravel в домашний каталог ‘hakase’, а затем установить зависимости Laravel, используя образ docker PHP ‘composer’. Поэтому убедитесь, что вы вошли на сервер как пользователь без прав root.
Скачайте проект Laravel в каталог ‘myapp’ и перейдите в него.
git clone https://github.com/laravel/laravel.git myapp/
cd myapp/Теперь выполните следующую команду docker, чтобы установить зависимости Laravel.
docker run --rm -v $(pwd):/app composer installС помощью вышеуказанной команды мы собираемся запустить новый временный контейнер docker и смонтировать каталог проекта ‘myapp’ в каталог ‘/app’ на контейнере. Контейнер основан на образе ‘composer’, и мы устанавливаем зависимости Laravel, используя команду ‘composer’ внутри этого временного контейнера.

После завершения установки зависимостей Laravel мы должны изменить владельца каталога ‘myapp’ на нашего собственного пользователя, используя команду sudo ниже.
sudo chown -R $USER:$USER ~/myapp
Шаг 3 - Dockerизация проекта Laravel
После загрузки Laravel и установки его зависимостей мы собираемся создать новый скрипт docker-compose.yml и создать новый Dockerfile для проекта Laravel.
cd myapp/
vim docker-compose.yml- Определить сервис приложения Laravel
Сначала мы собираемся определить сам проект Laravel и создать образ docker для проекта Laravel, используя Dockerfile.
Вставьте скрипт docker compose в него.
version: '3'
services:
#Laravel App
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Детали сервиса контейнера Laravel:
- Сервис контейнера Laravel будет называться ‘app’. Он основан на нашем пользовательском образе docker, который будет создан с помощью нашего ‘Dockerfile’, и новый образ будет называться ‘hakase-labs/laravel’.
- Мы хотим смонтировать каталог проекта ‘myapp’ в каталог ‘/var/www/html’ внутри сервиса контейнера.
- Мы используем пользовательскую сеть docker для нашей настройки, сеть будет называться ‘mynet’.
- Определить HTTP-сервис Nginx
Теперь мы определим сервис контейнера nginx.
Вставьте следующую конфигурацию после строки сервиса контейнера ‘app’.
#Nginx Service
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Детали конфигурации сервиса контейнера nginx:
- Мы хотим создать новый контейнер с именем ‘nginx’, основанный на образе docker ‘nginx:alpine’.
- Сервис контейнера откроет порты HTTP и HTTPS.
- Контейнер смонтирует три разных тома. Каталог проекта ‘myapp’ в каталог ‘/var/www/html’, конфигурацию виртуального хоста nginx ‘nginx/conf.d/‘ в каталог ‘/etc/nginx/conf.d’, и смонтирует файлы сертификатов ‘nginx/ssl/‘ в каталог ‘/etc/nginx/ssl’ на контейнере.
- Сервис контейнера будет использовать ту же сеть под названием ‘mynet’.
- Определить сервис базы данных MySQL
И последнее, мы определяем сервис базы данных MySQL.
Вставьте следующую конфигурацию после строки сервиса контейнера ‘nginx’.
#MySQL Service
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
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
mysqldata:
driver: localСохраните и закройте конфигурацию.
Детали сервиса контейнера MySQL:
- Сервис контейнера MySQL будет называться ‘db’, основанный на образе ‘mysql:5.7’.
- Сервис ‘db’ откроет порт MySQL по умолчанию ‘3306’.
- Проект Laravel будет использовать базу данных, пользователя и пароль на основе переменной окружения сервиса ‘db’.
- Сервис MySQL ‘db’ смонтирует том с именем ‘mysqldata’ и будет иметь ту же сеть ‘mynet’.
- И мы определяем пользовательскую сеть ‘mynet’ с драйвером ‘bridge’, а том ‘mysqldata’ будет использовать драйвер ‘local’.
Ниже приведена завершенная конфигурация ‘docker-compose.yml’:
version: '3'
services:
#Laravel App
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
#Nginx Service
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
#MySQL Service
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
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
mysqldata:
driver: local- Создать виртуальный хост Nginx для Laravel
В каталоге проекта ‘myapp’ создайте новый каталог с именем ‘nginx’, который будет содержать два других каталога ‘conf.d’ и ‘ssl’. Затем создайте новую конфигурацию виртуального хоста nginx ‘laravel.conf’ внутри каталога ‘conf.d’.
Выполните следующую команду.
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;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
# Laravel web root directory
root /var/www/html/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
# Nginx Pass requests to 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;
}
}Сохраните и закройте.
После этого скопируйте файл вашего ssl сертификата в каталог ‘nginx/ssl/‘.
sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/- Создать Dockerfile для приложения Laravel
Далее создайте новый Dockerfile для проекта Laravel.
Выполните следующую команду.
vim DockerfileВставьте конфигурацию ниже.
# Установить основной образ
FROM php:7.2-fpm-alpine
# Копировать composer.lock и composer.json
COPY composer.lock composer.json /var/www/html/
# Установить рабочий каталог
WORKDIR /var/www/html
# Установить дополнительные зависимости
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
# Добавить и включить расширения PHP-PDO
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable pdo_mysql
# Установить PHP Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Удалить кэш
RUN rm -rf /var/cache/apk/*
# Добавить UID '1000' к www-data
RUN usermod -u 1000 www-data
# Копировать существующие разрешения каталога приложения
COPY --chown=www-data:www-data . /var/www/html
# Изменить текущего пользователя на www
USER www-data
# Открыть порт 9000 и запустить сервер php-fpm
EXPOSE 9000
CMD ["php-fpm"]Сохраните и закройте конфигурацию.
И мы готовы собрать проект ‘myapp’ Laravel и запустить контейнерные сервисы, которые мы определили.
Шаг 4 - Собрать Laravel с сервисами Nginx и MySQL
Соберите пользовательский образ docker для нашего проекта Laravel, используя следующую команду.
docker-compose build
Затем снова выполните следующую команду.
docker-compose up -dЭто загрузит все образы docker, которые нам нужны, а затем построит контейнерные сервисы на основе конфигурации ‘docker-compose.yml’.

Когда это будет завершено, проверьте, используя команду docker-compose ниже.
docker-compose psИ в результате вы получите три контейнерных сервиса, которые работают. ‘app’, который работает на порту по умолчанию ‘9000’ PHP-FPM, сервис ‘nginx’ на портах HTTP и HTTPS, и сервис MySQL ‘db’ на порту MySQL по умолчанию ‘3306’.
После этого снова проверьте все доступные образы docker и открытые порты в системе.
docker-compose images
netstat -plntuВы получите пользовательский образ docker ‘hakase-labs/laravel’ в списке, а порты HTTP и HTTPS находятся в состоянии ‘LISTEN’.

Шаг 5 - Постустановка Laravel
На этом этапе проект Laravel запущен и работает как контейнер Docker. И теперь мы собираемся создать новый файл ‘.env’, сгенерировать ключ и мигрировать данные Laravel, используя командную строку Laravel ‘artisan’.
Скопируйте пример файла ‘.env’ и отредактируйте его внутри контейнера.
cp .env.example .env
docker-compose exec app vim .envИзмените конфигурацию базы данных следующим образом.
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddbСохраните и закройте.
Далее сгенерируйте ключ приложения Laravel и очистите кэш конфигурации.
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cacheПосле этого мигрируйте базу данных, используя следующую команду.
docker-compose exec app php artisan migrateУбедитесь, что ошибок нет.

Теперь откройте веб-браузер и введите доменное имя вашего проекта.
http://laravel.hakase-labs.io/
И вы будете перенаправлены на защищенное HTTPS-соединение и увидите главную страницу Laravel по умолчанию, как показано ниже.

Наконец, Dockerизация проекта Laravel с веб-сервером Nginx и базой данных MySQL была успешно завершена.
Get new posts in your inbox
No spam. Unsubscribe anytime.