Поднимаем Symfony в Docker контейнере

В примере проекта будет создано очень простое приложение 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/app

PHP Контейнер

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-data

php.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

 

6 комментариев

    • windsurfer АвторОтветить

      Спасибо за замечание.
      Да, вы правы, по возможности обновлю материал, свежими наработками 🙂

  1. beekirrОтветить

    Статья очень хорошая, если бы были объяснения, зачем нужны определенные строки в конфигах, то цены бы не было. И вопрос: мы не можем заменить upstream в конфиге nginx средствами докера?

    • windsurfer АвторОтветить

      В общем писалось как заметка для себя, что бы можно было быстро найти информацию. По поводу описания строк в конфигах, как по мне, то больше относиться уже к отдельным областям, будь то докер, пхп, или нжинкс.
      Не совсем понял ваш вопрос. Что вы подразумеваете под запеной 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 чито контейниризация. т.е. по сути в имеджах храниться какая-то конфигурация системы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.