Symfony 4.0 + Docker
Requirements
- Docker installed
- Docker Compose installed
Services
- PHP-FPM 7.2
- Nginx 1.13
- MySQL 5.7 | PostgreSQL 9.6 | MongoDB 3.4
- Redis 4.0
- ELK (Elasticsearch 6.1.2, Logstash 6.1.2, Kibana 6.1.2)
Installation
-
Clone this repository
$ git clone https://github.com/guham/symfony-docker.git
-
Update the Docker
.env
file according to your needs. TheNGINX_HOST
environment variable allows you to use a custom server name -
Add the server name in your system host file
-
Copy the
symfony/.env.dist
file tosymfony/.env
$ cp symfony/.env.dist symfony/.env
-
Update the database configuration according to your choice of database
MySQL:
# symfony/config/packages/doctrine.yaml doctrine: dbal: driver: 'pdo_mysql' server_version: '5.7' charset: utf8mb4 url: '%env(resolve:DATABASE_URL)%' # ...
# symfony/.env DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE}
PostgreSQL:
# symfony/config/packages/doctrine.yaml doctrine: dbal: driver: 'pdo_pgsql' server_version: '9.6' charset: UTF8 url: '%env(resolve:DATABASE_URL)%' # ...
# symfony/.env DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgresql:5432/${POSTGRES_DB}
MongoDB:
# symfony/config/packages/doctrine_mongodb.yaml doctrine_mongodb: connections: default: server: '%env(MONGODB_URL)%' options: username: '%env(MONGODB_USERNAME)%' password: '%env(MONGODB_PASSWORD)%' authSource: '%env(MONGO_INITDB_DATABASE)%' default_database: '%env(MONGODB_DB)%' # ...
# symfony/.env MONGODB_URL=${MONGODB_SERVER} MONGODB_DB=${MONGO_INITDB_DATABASE}
-
Build & run containers with
docker-compose
by specifying a second compose file, e.g., with MySQL$ docker-compose -f docker-compose.yaml -f docker-compose.mysql.yaml build
then
$ docker-compose -f docker-compose.yaml -f docker-compose.mysql.yaml up -d
Note: for PostgreSQL, use
docker-compose.postgresql.yaml
and for MongoDBdocker-compose.mongodb.yaml
-
Composer install
first, configure permissions on
symfony/var
folder$ docker-compose exec app chown -R www-data:1000 var
then
$ docker-compose exec -u www-data app composer install
Access the application
You can access the application both in HTTP and HTTPS:
- with
APP_ENV=dev
orAPP_ENV=prod
: symfony-docker.localhost - Kibana logs: symfony-docker.localhost:5601
Note: symfony-docker.localhost
is the default server name. You can customize it in the .env
file with NGINX_HOST
variable.
Docker-compose alternative method
In order to get rid of the second compose file (e.g.docker-compose.mysql.yaml
), you can validate the configuration and then use another Compose file:
$ docker-compose -f docker-compose.yaml -f docker-compose.mysql.yaml config > docker-stack.yaml
then
$ docker-compose -f docker-stack.yaml build
$ docker-compose -f docker-stack.yaml up -d
Moreover, you can copy database service configuration from compose file into docker-compose.yaml
and use it as default.
Databases
- MySQL
The MYSQL_DATABASE
variable specifies the name of the database to be created on image startup.
User MYSQL_USER
with password MYSQL_PASSWORD
will be created and will be granted superuser access to this database.
- PostgreSQL
Same as MySQL but with POSTGRES_DB
, POSTGRES_USER
and POSTGRES_PASSWORD
variables.
- MongoDB
The MONGO_INITDB_DATABASE
variable specifies the name of the database to be created on image startup.
User MONGODB_USERNAME
with password MONGODB_PASSWORD
will be created with the dbOwner
role to this database.
Finally, MONGO_INITDB_ROOT_USERNAME
and MONGO_INITDB_ROOT_PASSWORD
let you customize root user.
Commands
Note: symfony
is the default value for the user, password and database name. You can customize them in the .env
file.
# bash
$ docker-compose exec app /bin/bash
# Symfony console
$ docker-compose exec -u www-data app bin/console
# configure permissions, e.g. on `var/log` folder
$ docker-compose exec app chown -R www-data:1000 var/log
# MySQL
# access with application account
$ docker-compose -f docker-stack.yaml exec mysql mysql -usymfony -psymfony
# PostgreSQL
# access with application account
$ docker-compose -f docker-stack.yaml exec postgresql psql -d symfony -U symfony
# MongoDB
# access with application account
$ docker-compose -f docker-stack.yaml exec mongodb mongo -u symfony -p symfony --authenticationDatabase symfony