docker Пример докеризации проекта SimpleMVC-example
Primary tabs
В данной статье рассмотрим вариант добавления проекта SimpleMVC-example в docker-контейнер.
В сборке применены следующие технологии: PHP-FPM, Nginx, MySQL.
Папка docker расположена в корневой директории проекта и имеет следующую структуру:
docker/
config/
mysql/
create-multiple-mysql-databases.sh
nginx/
nginx.conf
php-fpm/
docker-php-ext-xdebug.ini
docker-compose.yml
Dockerfile
Далее рассмотрим содержимое файлов папки docker и остальных вложенных папок.
docker-compose.yml
version: '3.9'
services:
nginx:
image: nginx:alpine
container_name: smvc-docker_nginx
ports:
- 21212:80
expose:
- "80"
environment:
- VIRTUAL_HOST=smvc.docker.loc
- VIRTUAL_PORT=80
volumes:
- './config/nginx/:/etc/nginx/conf.d/'
- '..:/var/www'
depends_on:
- app
networks:
- proxy_network
- smvc_network
app:
build:
context: .
dockerfile: Dockerfile
container_name: smvc-docker_php
working_dir: /var/www/
volumes:
- '../:/var/www'
- ./config/php-fpm/docker-php-ext-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- db
networks:
- smvc_network
db:
image: mysql:latest
container_name: smvc-docker_db
command: --default-authentication-plugin=mysql_native_password
volumes:
- './config/mysql:/docker-entrypoint-initdb.d'
environment:
MYSQL_ROOT_PASSWORD: smvc-docker_root
MYSQL_USER: smvc-docker_user
MYSQL_PASSWORD: smvc-docker_password
MYSQL_MULTIPLE_DATABASES: smvc-docker_db,smvc-docker_db_test
ports:
- 21222:3306
networks:
- smvc_network
networks:
proxy_network:
name: nginx_dev_local_network
external: true
smvc_network:
name: smvc_network
Файл с настройками мультиконтейнерной конфигурации, а именно трех контейнеров с префиксами smvc-docker_ в названиях.
В строке 11 параметром VIRTUAL_HOST является локальный домен сайта, который необходимо настроить в файле /etc/hosts на ОС хоста с установленным Docker. Для вышеуказанной конфигурации он должен содержать сроку:
127.0.0.1 smvc.docker.loc
Dockerfile
FROM php:8.3.0-fpm-alpine3.19
RUN apk --no-cache update \
&& apk add --no-cache autoconf g++ make linux-headers \
\
&& pecl install xdebug-3.3.0 \
&& rm -rf /tmp/pear \
\
&& docker-php-ext-install pdo_mysql
#composer
ENV COMPOSER_ALLOW_SUPERUSER 1
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
Здесь указаны необходимые пакеты для установки, проверяются при каждой пересборке контейнера.
create-multiple-mysql-databases.sh
#!/bin/bash
set -e
set -u
function create_user_and_database() {
local database=$1
echo " Creating database '$database'"
mysql -u root -p$MYSQL_ROOT_PASSWORD <<-EOSQL
CREATE DATABASE \`$database\`;
GRANT ALL ON \`$database\`.* TO '$MYSQL_USER'@'%';
EOSQL
}
if [ -n "$MYSQL_MULTIPLE_DATABASES" ]; then
echo "Multiple database creation requested: $MYSQL_MULTIPLE_DATABASES"
for db in $(echo $MYSQL_MULTIPLE_DATABASES | tr ',' ' '); do
create_user_and_database $db
done
echo "Multiple databases created"
fi
Скрипт для создания баз данных при первой сборке контейнера. Переменные берутся из docker-compose.yml
nginx.conf
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/web;
server_name 127.0.0.1 localhost;
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;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
Конфигурация Nginx, важной настройкой является строка 6, где указана папка с точкой входа index.php
docker-php-ext-xdebug.ini
zend_extension=xdebug xdebug.mode=debug xdebug.client_host=host.docker.internal xdebug.client_port=9004 xdebug.idekey="netbeans-xdebug"
Является необязательным, служит для настройки расширения Xdebug, при отсутствии необходимости можно удалить (соответственно удалив из Dockerfile и docker-compose.yml).
Вспомогательные "make" команды в Makefile
Makefile
#Задаем подкоманды для изменения цвета
export red=`tput setaf 1`
export green=`tput setaf 2`
export yellow=`tput setaf 3`
export blue=`tput setaf 4`
export magenta=`tput setaf 5`
export cyan=`tput setaf 6`
export white=`tput setaf 7`
export reset=`tput sgr0`
PROJECT_NAME = smvc-docker
APP_CONTANER_COMMAND_PREF_PHP = @docker exec -it $(PROJECT_NAME)_php
APP_CONTANER_COMMAND_PREF_NGINX = @docker exec -it $(PROJECT_NAME)_nginx
APP_CONTANER_COMMAND_PREF_DB = @docker exec -it $(PROJECT_NAME)_db
APP_CONTANER_COMMAND_NO_T_DB = @docker exec -i $(PROJECT_NAME)_db
APP_CONTANER_COMMAND_PROD_PREF = @docker exec -it $(PROJECT_NAME)_web_prod
LOCAL_APP_URL_MESSAGE = @echo "Локальное приложение ${cyan}$(PROJECT_NAME)${reset}: http ://localhost:21212"
COMPOSE_DEV = docker compose -f ./docker/docker-compose.yml --project-name $(PROJECT_NAME)
about:
@echo "${cyan}Привет!)${reset} Это мэйкфайл для удобной работы с командами ${cyan};)${reset} \
\n Выполняйте нужные действия с помощью ${yellow}make имякоманды${reset}, доступные команды: \
\n ${green}migrate${reset} - применит миграции \
\n ${green}docker.start.all${reset} - Запустит все контейнеры приложения (соберет образы, если их нет) \
\n ${green}docker.stop.all${reset} - Остановит все контейнеры приложения \
\n ${green}docker.restart.all${reset} - Остановит все контейнеры приложения и запустит их заново \
\n ${green}docker.rebuild.all${reset} - Остановит все контейнеры приложения, пересоберет их запустит их заново \
"
# DOCKER---------------------------------------
sh.php:
$(APP_CONTANER_COMMAND_PREF_PHP) sh -l
sh.nginx:
$(APP_CONTANER_COMMAND_PREF_NGINX) sh
sh.db:
$(APP_CONTANER_COMMAND_PREF_DB) sh
docker.start.all:
$(COMPOSE_DEV) up -d
$(LOCAL_APP_URL_MESSAGE)
docker.stop.all:
$(COMPOSE_DEV) stop
docker.rebuild.all: docker.stop.all
$(COMPOSE_DEV) up -d --build
$(LOCAL_APP_URL_MESSAGE)
docker.restart.all: docker.stop.all docker.start.all
docker.remove.db:
docker rm $(PROJECT_NAME)_db
docker.reset.all: docker.stop.all docker.remove.db docker.rebuild.all
docker.php.sh:
$(APP_CONTANER_COMMAND_PREF_PHP) sh
#APPLICATION--------------------------------------
composer.install:
@echo "Устанавливаем ${yellow}зависимости${reset}..."
$(APP_CONTANER_COMMAND_PREF_PHP) composer install
grant.assets:
@echo "Добавление прав на запись в папку ${green}web/assets${reset}..."
$(APP_CONTANER_COMMAND_PREF_PHP) chmod o+w web/assets -R
insert.dump:
$(APP_CONTANER_COMMAND_NO_T_DB) mysql -u $(PROJECT_NAME)_user \
-p$(PROJECT_NAME)_password $(PROJECT_NAME)_db < input/smvc.sql
@echo "Таблицы в базе данных ${yellow}$(PROJECT_NAME)_db${reset} заполнены."
# TMP--------------------------------------------
sh.db.test:
$(APP_CONTANER_COMMAND_PREF_DB) mysql -u $(PROJECT_NAME)_user -p$(PROJECT_NAME)_password
docker.test.proxy:
@echo "${yellow}HTML${reset} содержимое ${green}главной${reset} страницы:"
@curl -H "Host: smvc.docker.loc" localhost:21212
Файл Makefile служит для упрощения выполнения команд внутри контейнера, должен находиться в корневой директории проекта. Общий синтаксис команды:
make имя_команды
где имя_команды указано в Makefile с начала новой строки до двоеточия.
Примеры команд:
make docker.start.all make composer.install make sh.db.test
- Log in to post comments
- 1004 reads
vedro-compota
Fri, 03/08/2024 - 09:20
Permalink
статью лучше разбить на две -
статью лучше разбить на две - первую часть (что уже есть - про докеризацию PHP + Mysql), а вторую уже про SimpleMVC
_____________
матфак вгу и остальная классика =)
NewDeveloper
Fri, 03/08/2024 - 16:54
Permalink
вынесено в отдельную статью
руководство для SimpleMVC-example вынесено в отдельную статью SimpleMVC-example Настройка конфигурации для работы в Docker контейнере