Docker Yii2 - uniqcle/Yii2 GitHub Wiki

Config Files

Создаем папку с проектом, напр. yii2 https://github.com/uniqcle/Docker/tree/master/yii2

В ней

docker             # файлы конфигурации Docker
web                # файлы с проектом
docker-compose.yml # билдим его

Dockerfile

#инструкция FROM - указывает на базе какого обараза будем собирать наш контейнер.
FROM ubuntu:latest

#инструкция RUN - указывает какую команду нужно выполнить внутри образа. обновим индекс пакетов
RUN apt-get update

RUN apt-get install -y apache2 apache2-utils curl gnupg wget
RUN a2enmod rewrite

#Инструкция ENV задает переменные окружения с именем <key> и значением <value>.
#Это значение будет находиться в окружении всех команд потомков Dockerfile и могут быть использованы как обычные переменные окружения.
ENV TZ=Europe/Moscow

#указываем временную зону для нашего образа.
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get install -y git python3 perl \
    php nano

#устанавливаем php расширения
RUN apt-get install -y \
    php-pdo php-pdo-mysql \
    php7.2-mysql          \
    php-mbstring php-tokenizer \
    php-xml php-simplexml php-zip \
    php-opcache php-iconv php-intl \
    php-json php-gd php-ctype php-oauth \
    php-apcu php-imagick php-xdebug \
    php-memcached php-ftp php-imap \
    php-curl iputils-ping

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

#после завершения установок всех пакетов - обновим индекс
RUN apt-get update

#откроем 80 порт
EXPOSE 80

#добавим в контейнер конфигурационный файл php.ini, расположим его на стаднатрном для ubuntu месте
ADD ./docker/conf/php/php.ini /etc/php/7.2/apache2/php.ini

#обязательно добавим конфигурации xdebug
ADD ./docker/conf/php/xdebug.ini /etc/php/7.2/mods-available/xdebug.ini

#добавим в контейнер конфигурационный файл для apache, расположим его на стаднатрном для ubuntu месте
ADD ./docker/conf/apache/apache2.conf /etc/apache2/apache2.conf

#удалим содержащиеся файлы в этих папках, потому что вскоре там будут наши
RUN rm -R /etc/apache2/sites-enabled/* /etc/apache2/sites-available/* /var/www/*

#добавим конфигурацонный файл для виртуального сервера
ADD ./docker/conf/apache/yii2frontend.loc.conf /etc/apache2/sites-enabled/yii2frontend.loc.conf

#укажим дирректорию /var/www как рабочую
WORKDIR /var/www

#запускаем процес apache2 в нормальном режиме (На переднем плане).
#Пока живет это процесс, живет и контейнер.
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

apache2.conf

# /etc/apache2/apache2.conf

Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn

Listen 80
AccessFileName .htaccess

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
IncludeOptional conf-enabled/*.conf

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

<Directory />
	Options -FollowSymLinks
	AllowOverride None
	Require all denied
	Options -Indexes
</Directory>

<Directory /var/www/>
	Options FollowSymLinks
	AllowOverride None
	Require all granted
	Options -Indexes
</Directory>

<FilesMatch "^\.ht">
	Require all denied
</FilesMatch>

IncludeOptional sites-enabled/*.conf

yii2frontend.loc.conf

<VirtualHost *:80>
	ServerName yii2frontend.loc
	ServerAdmin webmaster@localhost

	DocumentRoot /var/www/web/frontend/web
	<Directory "/var/www/web/frontend/web">
        RewriteEngine on

        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        RewriteRule . index.php
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

docker-compose.yml

version: '3'

services:
 webserver:
   container_name: apache-php-yii2
   build:
     context: ./
     dockerfile: ./docker/Dockerfile
   environment:
     XDEBUG_CONFIG: remote_host=host.docker.internal
     PHP_IDE_CONFIG: serverName=localhost
   ports:
   - 80:80
   volumes:
   - ./:/var/www
   links:
   - db
   depends_on:
   - db

 db:
   container_name: mysql-yii2
   image: 'mysql:latest'
   command: --default-authentication-plugin=mysql_native_password
   restart: always
   ports:
   - 9513:3306
   environment:
     MYSQL_ROOT_PASSWORD: password
     MYSQL_DATABASE: yii2advanced
     MYSQL_USER: mysqluser
     MYSQL_PASSWORD: mysqluser
   volumes:
   - ./docker/database:/var/lib/mysql

1. Вносим правки

В Dockerfile

...
ADD ./docker/conf/apache/yii2frontend.loc.conf /etc/apache2/sites-enabled/yii2frontend.loc.conf
...

В файл [назв_сайта].loc.conf

<VirtualHost *:80>
	ServerName [назв_сайта].loc
	ServerAdmin webmaster@localhost

	DocumentRoot /var/www/web/frontend/web
	<Directory "/var/www/web/frontend/web">
...

Также не забываем добавлять для admin.[назв_сайта].loc.conf

На локальной машине не забываем в hosts

2. Поднимаем контейнеры

Заходим в папку с проектом yii

docker-compose build --no-cache
docker-compose up -d

3. Устанавливаем Yii2

4. Создаем БД и пользователей

login: root
password: password

5. Правим файлы конфига

Правим файл конфига common/config/main-local.php mysql:host=db:3306;dbname=yii2advanced

return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=db:3306;dbname=yii2advanced',
            'username' => 'root',
            'password' => 'password',
            'charset' => 'utf8',


        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
        ],
    ],
];

6. Запускаем миграции

Заходим в контейнер и php yii migrate

⚠️ **GitHub.com Fallback** ⚠️