Настройка окружения в Docker для yii-framework приложения
Для того чтобы быстро поднять рабочее окружение существует много способов. Один из них — поднять все необходимые сервисы в Docker-контейнерах. Чтобы ускорить создание новых проектов на Yii-framework я написал такую небольшую инструкцию, которую используют разработчики в нашей команде.
На старте у вас должны стоять docker, docker-compose, php и php-composer.
Создаем папку с проектом и в ней папку docker.
mkdir project-dir
cd project-dir && mkdir docker
В папке docker создаем файл конфигурации нашего контейнера Dockerfile.
# Базовый образ с nginx и php
FROM richarvey/nginx-php-fpm
# ДОбавляем наше веб приложение
ADD app /var/www/app
# Удаляем конфиги сайтов которые там есть
RUN rm -Rf /etc/nginx/sites-enabled/*
# Добавляем наш конфиг
ADD docker/conf/nginx/site.conf /etc/nginx/sites-available/site.conf
# Включаем его
RUN ln -s /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/site.conf
В этой же папке docker создаем docker-compose.yml для поднятия окружения разработки.
# Последняя версия docker-compose
version: '3'
# Создаем общую сеть deafult для всех контейнеров
networks:
default:
driver: bridge
# Создаем отдельные контейнеры
services:
# Контерйнер с веб-приложением
app:
# Собираем из Dockerfile
build:
# Корнем указываем корень основного проекта
context: ../
dockerfile: ./docker/Dockerfile
# Показываем наружу 80 порт
ports:
- "80:80"
# Подключаем к общей сети с другими контейнерами
networks:
- default
# Запускаем только после db
depends_on:
- db
# Линкуем внешнюю папку с исходниками внутрь
volumes:
- "../app:/var/www/app"
# Так же линкуем конфиг для nginx
- "./conf/nginx:/etc/nginx/sites-available"
# Контейнер с базой данных
db:
image: mysql:latest
# Подключаем к общей сети с другими контейнерами
networks:
- default
# Показываем наружу порт
ports:
- "3336:3306"
# Задачем параметры для инициализации БД
environment:
# Пароль к БД
MYSQL_ROOT_PASSWORD: root
# Создаваемая по умолчанию бд
MYSQL_DATABASE: yii-template-db
# Линкуем внешнюю папку для хранения БД
volumes:
- "./database:/var/lib/mysql"
Для nginx создаем папку docker/conf/nginx и файл site.conf в ней. Файлик может изменяться, в зависимости от того, как вы хотите настроить nginx на своем проекте. Его можно менять локально, т.к. он подключается через volume. Но надо не забывать внутри контейнера перезагружать nginx: nginx -s reload
server {
charset utf-8;
client_max_body_size 128M;
listen 80; ## listen for ipv4
root /var/www/app/frontend/web/;
index index.php;
access_log /var/www/app/log/frontend-access.log;
error_log /var/www/app/log/frontend-error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# uncomment to avoid processing of calls to non-existing static files by Yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404;
#}
#error_page 404 /404.html;
# deny accessing php files for the /assets directory
location ~ ^/assets/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php-fpm.sock;
try_files $uri =404;
}
location ~* /\. {
deny all;
}
}
Все команды выполняются из корневой папки.
- Выполняем команду создания проекта
composer create-project --prefer-dist yiisoft/yii2-app-advanced app
. - Запускаем окружение
docker-compose -f docker/docker-compose.yml up -d
- Инициализируем проект
app/init --env=Development --overwrite=All
- Открываем в редакторе файл app/common/config/main-local.php и заполняем его даными для подключения к БД. В примере у нас пароль root — root, хост БД — db, имя БД — yii-template-db.
- Подключаемся к контейнеру
docker exec -it docker_app_1 bash
- Выполняем команду миграции БД
php /var/www/app/yii migrate
- Создаем папку для логов
mkdir /var/www/app/log
- И выходим
exit
- Тормозим сервис
docker-compose -f docker/docker-compose.yml down
- Запускаем его заново
docker-compose -f docker/docker-compose.yml up -d
- Открываем localhost в браузере и смотрим на новый сайт.