В примере проекта будет создано очень простое приложение Symfony с обычной настройкой Docker и следующими контейнерами:
- Nginx webserver.
- PHP 7.1.
- Простой контейнер для Composer.
Приложение Symfony будет храниться в папке app, а структура файлов проекта будет выглядеть так:
symfony-docker-test
app
docker
php
Dockerfile
php.ini
nginx
app.conf
docker-compose.ymlШаг с установкой Symfony я пропущу (как установить Symfony?), так как скорее всего вы уже знаете как это делать. Цель статьи показать как запустить Symfony в контейнере Docker.
Docker контейнеры
docker-compose.yml
version: '2'
services:
php:
build: ./docker/php/
environment:
TIMEZONE: Europe/Kiev
volumes:
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
- ./app:/var/www/app
working_dir: /var/www/app
webserver:
image: nginx:1.11
depends_on:
- php
volumes_from:
- php
volumes:
- ./docker/nginx/app.conf:/etc/nginx/conf.d/default.conf:ro
ports:
- 8080:80
composer:
image: composer:1.4
volumes_from:
- php
working_dir: /var/www/appPHP Контейнер
Dockerfile в директории docker/php
FROM php:7.1-fpm
# Install recommended extensions for Symfony
RUN apt-get update && apt-get install -y \
libicu-dev \
&& docker-php-ext-install \
intl \
opcache \
&& docker-php-ext-enable \
intl \
opcache
# Permission fix
RUN usermod -u 1000 www-dataphp.ini
date.timezone = ${TIMEZONE}
short_open_tag = Off
log_errors = On
error_reporting = E_ALL
display_errors = Off
error_log = /proc/self/fd/2
memory_limit = 256M
; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html
opcache.max_accelerated_files = 20000
realpath_cache_size = 4096K
realpath_cache_ttl = 600Конфигурация Nginx vhost:
docker/nginx/app.conf
upstream php-upstream {
server php:9000;
}
server {
root /var/www/app/web;
listen 80;
server_tokens off;
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(app|app_dev|app_test|config)\.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}Запуск контейнеров
Достаточно поднятся в корень проекта (там где лежит docker-compose.yml) и запустить команду
docker-compose up -dТеперь приложение должно быть доступно по адресу http://127.0.0.1:8080, и вы должны увидеть эту страницу:

Все настройка закончена и можно приступать к работе 🙂
В следующей статье я расскажу как оптимизировать скорость работы Symfony в Docker контейнере для локального окружения.
P.S. Напишите в комментариях с какими проблемами вы столкнулись и я попробую вам помочь.
P.S.S: Github https://github.com/heilgar/docker-php


Для работы с Symfony 4 нужно менять конфиг nginx
Спасибо за замечание.
Да, вы правы, по возможности обновлю материал, свежими наработками 🙂
Статья очень хорошая, если бы были объяснения, зачем нужны определенные строки в конфигах, то цены бы не было. И вопрос: мы не можем заменить upstream в конфиге nginx средствами докера?
В общем писалось как заметка для себя, что бы можно было быстро найти информацию. По поводу описания строк в конфигах, как по мне, то больше относиться уже к отдельным областям, будь то докер, пхп, или нжинкс.
Не совсем понял ваш вопрос. Что вы подразумеваете под запеной upstream?
Как минимум upstream можно отдельно маунтить.
У нас есть кейс, (используем для разработки), когда мы подымаем через один docker-compose файл несколько контейнеров с симфони. под каждый контейнер дополнительно контейнер nginx + dependency в базовый контейнер nginx.
Например:
symfony_app_1:
image: example
symfony_app_2:
image: example_2
nginx:
image: nginx_proxy
ports:
- 80:80
depends_on:
- nginx_app_1
- nginx_app_2
nginx_app_1:
image: symfony
nginx_app_2:
image: symfony
Нужно еще понимать что docker чито контейниризация. т.е. по сути в имеджах храниться какая-то конфигурация системы.
Ничего не работает. Можно пошагово – сделай так и так?
Добавлю, более развернутое описание )