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

Что мы будем делать:

  1. Установить Docker и Docker Compose
  2. Скачать Laravel и установить зависимости
  3. Dockerизация проекта Laravel - Определить сервис приложения Laravel
  • Определить HTTP-сервис Nginx
  • Определить сервис базы данных MySQL
  • Создать виртуальный хост Nginx для Laravel
  • Создать Dockerfile для приложения Laravel
  1. Собрать проект Laravel
  2. Постустановка 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 в системе.

Проверка версии docker

Далее нам нужно назначить пользователя без прав 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 завершена.

Добавить пользователя 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

После завершения установки зависимостей 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.conf
server {
    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

Собрать Laravel с сервисами Nginx и MySQL

Затем снова выполните следующую команду.

docker-compose up -d

Это загрузит все образы docker, которые нам нужны, а затем построит контейнерные сервисы на основе конфигурации ‘docker-compose.yml’.

Загрузить образы docker

Когда это будет завершено, проверьте, используя команду 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’.

Проверка настройки docker с netstat

Шаг 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

Убедитесь, что ошибок нет.

Постустановка Laravel

Теперь откройте веб-браузер и введите доменное имя вашего проекта.

http://laravel.hakase-labs.io/

И вы будете перенаправлены на защищенное HTTPS-соединение и увидите главную страницу Laravel по умолчанию, как показано ниже.

Laravel с Docker успешно установлен

Наконец, Dockerизация проекта Laravel с веб-сервером Nginx и базой данных MySQL была успешно завершена.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.