Symfony, elasticsearch and docker environment


Hi, and welcome to the second article devoted to the theme:  “How to work with ElasticSearch using Symfony PHP framework”. Here we will prepare our local environment for further development. As you remember from the Part 1 we have to create a web server, microservice application and elasticsearch as standalone docker containers.

ElasticSearch tutorial environment
ElasticSearch tutorial environment

Below is docker compose file that will help us to realize environment represented at scheme above. I am also adding the screen of physical project file structure in order it would be clear how according files are organized.

Project file structure
# docker-compose.yml

version: '3'

    build: ./ci/nginx
    container_name: "web_server"
      - udemy_phpes_php
      - .:/var/www/udemy_phpes_php
      - ./ci/data/nginx/logs:/var/log/nginx
      - "80:80"
      - 80

    build: ./ci/php
    container_name: "udemy_phpes_php"
      - .:/var/www/udemy_phpes_php

    build: ./ci/elasticsearch
      -  discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    container_name: "udemy_phpes_elasticsearch"
      - ./ci/data/es/db:/usr/share/elasticsearch/data
      - ./ci/data/es/logs:/usr/share/elasticsearch/logs
      - ./ci/data/es/repo:/usr/share/elasticsearch/repo
      - "9202:9200"
      - "9202"

Let’s have a look inside the configuration. So first of all, we are having here nginx web server. According docker configuration is located at ci folder. Here is a docker file that installs the server by itself and mounts our server configuration.

# ci/nginx/Dockerfile

FROM ubuntu:18.04

RUN apt-get update && apt-get install -y software-properties-common curl wget

RUN apt-get --no-install-recommends install -y  \
    nginx \
    nano \

ADD nginx.conf /etc/nginx/
ADD ./sites-available/ /etc/nginx/sites-available/

RUN ln -s /etc/nginx/sites-available/udemy_phpes.conf /etc/nginx/sites-enabled/udemy_phpes

RUN usermod -u 1000 www-data

CMD ["nginx"]

ENV TERM xterm

Our server would be listening at (you have to add according record to your hosts file) and forward requests to our application container that is called udemy_phpes_php.

# ci/nginx/sites-available/udemy_phpes.conf

server {
    root /var/www/udemy_phpes_php/public;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;

    location ~ ^/index\.php(/|$) {
        fastcgi_pass udemy_phpes_php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

    location ~ \.php$ {
        return 404;

    access_log /var/log/nginx/udemy_phpes_access.log;
    error_log /dev/stdout warn;

Let’s return to the docker compose file and our php application container. Docker conf file look likes the next way. It is built from the official php 7 version + additional packages and tools are installed.


FROM php:7.3-fpm

RUN apt-get update \
    && apt-get install -y \
      libmcrypt-dev \
      libxml2-dev \
      libpcre3-dev \
      curl \
      git \
      vim \
      nano \
      bzip2 \
      mc \
      sudo \
      silversearcher-ag \
      apt-utils \
      net-tools \
      iproute2 \
      libzip-dev \
      curl \
      git \
      vim \
      nano \
      apt-utils \
      net-tools && \
      apt-get clean

RUN pecl install \
    igbinary \
    oauth \
    xdebug \
    docker-php-ext-enable \

RUN docker-php-ext-enable \
    igbinary \
    oauth \

RUN docker-php-ext-install \
    mysqli \
    pdo \
    pdo_mysql \
    xml \
    mbstring \
    soap \
    xmlrpc \
    opcache \
    zip \

RUN docker-php-ext-install bcmath

RUN curl -sS | php -- --install-dir=/usr/local/bin --filename=composer --version=2.0.13


RUN groupadd -r --gid 1000 php_user \
    && useradd -r -u 1000 -g 1000 php_user \
    && usermod -aG sudo php_user \
    && echo "php_user ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

RUN mkdir -p /home/php_user \
    && chown -R php_user:1000 /home/php_user

RUN chown -R php_user:1000 /home/php_user

COPY ./php.ini /usr/local/etc/php/php.ini
COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

COPY ./ /var/www/

RUN mkdir -p /var/www/udemy_phpes_php \
    && chown -R php_user:1000 /var/www/ \
    && chown -R php_user:1000 /home/php_user \
    && chmod a+rx  /var/www/

RUN apt-get update && apt-get install -y zlib1g-dev \
   && docker-php-ext-install zip

RUN ln -s /usr/local/bin/php /usr/bin/php

USER php_user

VOLUME /var/www/udemy_phpes_php/

WORKDIR /var/www/udemy_phpes_php/

ENTRYPOINT ["/var/www/"]

set -e

echo -e "`/sbin/ip route|awk '/default/ { print $3 }'`\" | sudo tee -a /etc/hosts > /dev/null


And the last one is our elasticsearch docker container.

# ci/elasticsearch/Dockerfile

FROM elasticsearch:7.13.3

COPY elasticsearch.yml /usr/share/elasticsearch/config/

RUN bin/elasticsearch-plugin install analysis-icu
# ci/elasticsearch/elasticsearch.yml

  repo: /usr/share/elasticsearch/repo
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: "Authorization"

To bring up the symfony elasticsearch environment, go to the project root folder and run docker-compose up -d

In the next article (Part 3. “Symfony, elasticsearch – front controller and api documentation”) we will speak about package dependencies we are going to use, some project structure aspects, controller, REST API and response/request models. If you would like to pass all material more fast, then I propose you to view my on-line course at udemy where you will also find full project skeleton. Below is the link to the course. As the reader of that blog you are also getting possibility to use coupon for the best possible low price. Thank you for you attention.

architecture AWS cluster cyber-security devops devops-basics docker elasticsearch flask geo high availability java machine learning opensearch php programming languages python recommendation systems search systems spring boot symfony