Demo - Docker with Symfony, nginx, and MySQL


Welcome to Docker 101.

You may be here because you want to see what Docker is, and how it could work for you.

You may be here because you already know how to use Docker, but want to know how to use it for working with a Symfony project.

Good news.

I've got you covered.

There's no better way to understand the power of Docker than to see it in action.

I'm going to show you a bunch of ways Docker can be used. They may not be right for you, but by the end of this short course you will know how to customise the build to fit your own needs.

Let's start with something interesting.

# cd some dir

git clone https://github.com/codereviewvideos/docker-symfony-mysql-nginx-example.git

This repository consists of:

  • .env
  • Makefile
  • docker-compose.yml
  • app/ directory

The most immediately interesting is the docker-compose.yml file:

# docker-compose.yml

version: '2'

services:

    db:
        image: mysql:5.7.17
        env_file:
          - ./.env
        volumes:
          - "./volumes/mysql/dev:/var/lib/mysql"
        networks:
          crv_dev_network:
            aliases:
              - mysql

    nginx:
        image: codereviewvideos/nginx.dev
        ports:
          - "81:80"
        restart: always
        volumes:
          - "./volumes/nginx/logs:/var/log/nginx/"
        volumes_from:
            - php
        networks:
          crv_dev_network:
            aliases:
              - nginx

    php:
        image: codereviewvideos/www.dev
        restart: always
        env_file:
          - ./.env
        volumes:
          - "./volumes/php/app/cache:/var/www/dev/app/cache/:rw"
          - "./volumes/php/app/logs:/var/www/dev/app/logs/:rw"
          - "./volumes/.composer:/var/www/.composer"
          - "./app:/var/www/dev"
        networks:
          crv_dev_network:
            aliases:
              - php

networks:
  crv_dev_network:
    driver: bridge

If you have done reading on the subject, you may be wondering why I'm showing you a version 2 style docker-compose.yml file, when version 3 style is newer.

Simply: version 2 is easier to get going with. All the examples right now are in version 2, so if you get stuck, it's easier to find a fix.

Version 3 syntax makes some things appear harder, but in actuality are largely defined to be to your benefit. The benefit becomes clearer a little later, and we shall cover this later in this series.

This configuration specifies that we will have a Database server (MySQL), an nginx web server, and a PHP container where all our code and related dependencies actually run from.

As you can see from the configuration, there is a requirement for an env_file, of which we have one, .env. We also need to create this file locally to run this container:

# .env

SECRET_KEY=somesupersecretkey
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=db_dev
DB_USER=dbuser
DB_PASSWORD=dbpassword
MYSQL_ROOT_PASSWORD=root_dbpassword
MAILER_HOST=127.0.0.1
MAILER_USER=~
MAILER_PASSWORD=~
MAILER_PORT=465

With a little squinting, you might recognise these options as being very similar to those found in Symfony's parameters.yml.dist / parameters.yml file by default.

This isn't a coincidence, but we will get into exactly how that works in a different video.

These environment variables need passing to Symfony via parameters.yml.

Before we get to that we need to cover the app/ directory.

This is almost a fresh install of the latest version of Symfony (3.3.6 at the time of recording).

This is where you will do all your development work. We will learn ways to customise the directory structure, so don't worry if this style is not to your taste.

There are two changes I made to the standard symfony new outcome:

  • parameters.yml.dist
  • web/app_dev.php

For the app_dev.php file I commented out the security section.

This is less worrisome than may initially appear. We will never be able to access app_dev.php outside our development environment. We will cover why in a future video. For now it is enough to say that we are using one nginx image for development, and another similar but tweaked version for production.

The changes to parameters.yml.dist are a little more visible:

# /app/app/config/parameters.yml.dist

parameters:
    database_host:      '%env(DB_HOST)%'
    database_port:      '%env(DB_PORT)%'
    database_name:      '%env(DB_DATABASE)%'
    database_user:      '%env(DB_USER)%'
    database_password:  '%env(DB_PASSWORD)%'

    mailer_transport:   "smtp"
    mailer_host:       '%env(MAILER_HOST)%'
    mailer_user:       '%env(MAILER_USER)%'
    mailer_password:   '%env(MAILER_PASSWORD)%'
    mailer_port:       '%env(MAILER_PORT)%'
    mailer_encryption: "ssl"
    mailer_auth_mode:  "login"

    # A secret key that's used to generate certain security-related tokens
    secret:            '%env(SECRET_KEY)%'

Yes, app/app is intended :)

The variables from our .env file will be passed to the respective containers, which in turn makes the environment variables available as needed. Again, we will cover this further in a separate video.

Post Clone Install Steps

This means we have two tasks to complete after cloning the repo:

cd app
cp app/config/parameters.yml.dist app/app/config/parameters.yml
composer install --no-scripts

Once the composer install process completes you can spin up the stack by running:

make dev

If you don't have Make installed then the following command can be used instead:

docker-compose down && \
    docker-compose build --pull --no-cache && \
    docker-compose \
        -f docker-compose.yml \
    up -d --remove-orphans

As you do not have the docker images downloaded at this point, this part may take a while depending on your internet connection speed.

Your Symfony site should be available on 127.0.0.1:81.

Now, I would be telling you a fairy tale if I told you it is this easy in reality.

Perhaps you already don't think this is easy :)

This is in actuality, quite a rigid example designed to show you what's possible. You will need to customise this build, and this series is all about gaining the skills necessary to do so.

After you have played around with the site, stopping the running containers is advised:

docker-compose down

There's plenty to cover here, and really this is designed to be a taster / preview only.

Hopefully you like what you see so far.

Code For This Course

Get the code for this course.

Episodes