Symfony, elasticsearch and docker environment

Demianchuk Sergii
4 min readMar 11, 2022

--

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.

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.

# docker-compose.yml version: '3'

services
:
nginx:
build: ./ci/nginx
container_name: "web_server"
links
:
- udemy_phpes_php
volumes:
- .:/var/www/udemy_phpes_php
- ./ci/data/nginx/logs:/var/log/nginx
ports:
- "80:80"
expose
:
- 80

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

udemy_phpes_elasticsearch:
build: ./ci/elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
container_name
: "udemy_phpes_elasticsearch"
volumes
:
- ./ci/data/es/db:/usr/share/elasticsearch/data
- ./ci/data/es/logs:/usr/share/elasticsearch/logs
- ./ci/data/es/repo:/usr/share/elasticsearch/repo
ports:
- "9202:9200"
expose
:
- "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 \
vim

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 udemy_phpes.com.test (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 {
server_name udemy_phpes.com.test;
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;

fastcgi_param SCRIPT_FILENAME realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

internal;
}

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 files look like the next way. It is built from the official php 7.3 version + additional packages and tools are installed. And the last one is our es container. That configuration you are already familiar with.

#ci/php/Dockerfile 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 \
xdebug

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

RUN docker-php-ext-install bcmath


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

EXPOSE 9090

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 ./entrypoint.sh /var/www/entrypoint.sh

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/entrypoint.sh

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/entrypoint.sh"]

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 network:
host: 0.0.0.0
path:
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 we will speak about package dependencies we are going to use, some project structure aspects, controller, REST API and response/request models. If you can’t wait a long time, then I propose you to view all that material at my on-line course at udemy where you will also find full project skeleton. Here 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. Otherwise, please wait at next articles. Thank you for you attention.

Originally published at https://sergiiblog.com on March 11, 2022.

--

--

Demianchuk Sergii

15 year’s experience at IT. I am specialized at architecture for complex systems, search & recommendations systems, ML, devops, security, big data sets analysis