Lightweight dev environment for Symfony 4 with Docker.
It provide :
- Nginx - 15.3MB
- PHP 7.4-fpm - 123MB
- MariaDB - 183MB
- NodeJS (latest) - 67.9MB
- Maildev - 67.6MB
It use Alpine container to reduce the weight
- Docker
- Docker-compose
-
Clone this repo at the racine of the Symfony's project
-
Rename .env.dist to .env
-
Update .env with your information (port, database....)..
-
!! BE CARREFULL !! : Now, with Symfony 4+, the .env file is now committed !! you should either add .env to .gitignore
or rename this file and change is name inside the env_file variable of the docker-compose.yml file for each services
to avoid sensibles informations like password to be expose on your repository -
Inside docker-compose.yml Comment useless service or uncomment the one you need
-
For the build container (nodejs), you must have a valid package.json file.
In docker-compose.yml build section , for command, replace the npm command with a command to build the assets (npm run dev, npm run prod, npm run watch...) -
Run
docker-compose up -d
-
Go to "localhost:80" in a web browser (replace the port with the nginx port you set)
-
Enjoy
You must log into the Engine container :
docker-compose exec engine sh
Inside the container, you can use Composer or Symfony console commands
You must log into the Build container :
docker-compose exec build sh
Inside the container, you can use npm or node commands
You must log into the Database container :
docker-compose exec database sh
Inside the container, you can log to the databse (with the user information from the docker-compose.yml:
mysql -uuser -p
Outside the container, you can log to the databse (with the user information and the port on the host from the docker-compose.yml:
mysql -uuser -p --host=127.0.0.1 --port=3306
Outside the container, you can export a database like this :
mysqldump -uuser -p --host=127.0.0.1 --port=3306 --databases database_name > /path/to/export/database_name.sql
Outside the container, you can import a database like this :
mysql -uuser -p --host=127.0.0.1 --port=3306 < /path/to/import/database_name.sql
Note : the root user cannot access to the database container from outside, just from inside. The root user must have a password.
You can automatically import scripts and databases when building the database container. Simply put the scripts and/or databases in the /docker/database/initdb.d/ folder. Scripts extension must be _.sh and for databases _.sql or *.sql.gz .
To connect Symfony to the database, you must have an ORM (Doctrine) installed and you must update the .env file
In the ORM section, you must update this url : DATABASE_URL=mysql://db_user:db_password@database:3306/db_name
Replace from the docker-compose.yml:
- db_user with the MYSQL_USER value
- db_password with the MYSQL_PASSWORD value
- db_name with the MYSQL_DATABASE value
It should look like this with the default docker-compose.yml file : DATABASE_URL=mysql://user:pwd@database:3306/database
Go to database, in Data Source, select MariaDB
In Port, indicate the port of the database service from the host (not the container : -3307:3306 -> 3307 is the host port)
In User,indicate the username
In Password,indicate the password
In Database,indicate the database name
Click on Check connection to test and save with Ok.
MailDev allow to test your projects' emails during development
If you use SwiftMailer with Symfony, in the .env file, replace the Mailer_URL with :
MAILER_URL=smtp://maildev:25
You can run PHP Unit test and use Xdebug with Docker on your IDE (PHPStorm/Intellij/VSCode)
If you use Intellij, you have to install 2 plugins : PHP Remote Interpreter & PHP Docker
- Go to File -> Settings -> Build, Execution, Deployment -> Docker
Click on + to add a new configuration, and add a name. Check Unix *Socket
- Go to the sub menu Tools
For Linux, you should have something like that :
You have to indicate where is located your docker's installation.
-
Go to File -> Settings -> Langages & Framework -> PHP
As we use a Docker container to run PHP, we have to tell our IDE to use this container as a CLI Interpreter.
In CLI Interpreter, click on + to add a new configuration, and choose From Docker, Vagrant,VM, Remote:
Check Docker. In Image name, the IDE should find automatically the PHP's container. If not, you can add it manually (Your PHP container is something like Your_Project_engine)
And click ok
You can test if everything is ok by clicking on the refresh button:
!! Your project must have an installation of PHP Unit!!
A PHP interpreter must be installed, because your IDE use it to run the tests.
If you are using Symfony 4, you can install PHPUnit Bridge :
-
Connect to your PHP container :
docker-compose exec engine sh
-
Install PHPUnit Bridge :
composer require --dev symfony/phpunit-bridge
-
Important Configure PHPUnit Bridge :
php bin/console
-
Go to File -> Settings -> Languages & Frameworks -> PHP -> Test Framework
Click on + and choose PHPUnit by Remote Interpreter:
Choose your php CLI Interpreter
- In the new configuration window, in PHPUnit Library, you have to tell to your IDE where is located the PHPUnit script to run the test :
If you are using PHPUnit Bridge, check Path to PHPUnit.phar. The path is something like /opt/project/bin/.phpunit/phpunit-(major).(minor)/phpunit (replace phpunit-(major).(minor) by the current version of PHPUnit, like phpunit-7.5)
If you have installed PHPUNit without PHPUnit Bridge, check Use Composer Autoload and tells where the autload.php is located (/opt/project/vendor/autoload.php)
Now, you should have something like this :
Note : /opt/project is the root project for Docker volume. It's equivalent to /home/docker
Choose a name and check Defined in the configuration file.
To run the test, choose your Test runner and click on the green arrow :
Note : there is a lazy way to run the test :
- Go to your PHP container :
docker-compose exec engine sh
- And run the test manually :
php bin/phpunit
To use Xdebug with Intellij/PHPStorm, we need to have 2 environments variables which are defined in docker-compose.yml:
environment:
XDEBUG_CONFIG: "xdebug.idekey='xdebug'"
PHP_IDE_CONFIG: "serverName=xdebug"
We gonna use them to parameter Intellij/PHPStorm.
- Go to Run -> Edit Configuration, click on + and choose PHP Remote Debug
Add a name and for IDE key(session id) you must indicate the same value as the env variable XDEBUG_CONFIG: "xdebug.idekey='xdebug'" so xdebug (if the value don't match, it won't work)
For Server click on ... to add a new xdebug server.
Click on + to add a new configuration:
Name must be equal to the value of the env variable PHP_IDE_CONFIG: "serverName=xdebug" so xdebug (if the value don't match, it won't work)
Host : I indicate my local ip (hostname -i
) I think localhost should work fine.
Check Use path mapping and map your local root path of the project to the container root path (/home/docker)
Click OK
-
In the top right menu, click to start listenning for PHP debug connection
-
Go to your web browser and refresh the page
And a menu to navigate into your php's script :
First, you have to install PHP Debug by Felix Becker.
Once it's down, open launch.json and replace port by the value of xdebug.remote_port in docker/engine/php.ini
(9000 was already in use on my computer, so i use 10000 instead, but the default 9000's port is fine if it's free on your computer. Just match the value in php.ini and launch.json)
You have to edit pathMappings to map the root project's path (/home/docker) to ${workspaceFolder}.
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 10000,
"log": true,
"pathMappings": {
"/home/docker": "${workspaceFolder}",
}
},
in this example, I enable log but it's up to you. You can find others options in the plugin's documentation.
And a menu to navigate into your php's script :
docker-compose up -d
: Create and start containers. Each time the docker-compose.yml is modified, run this command.
docker-compose build
: Build or rebuild containers. Each time a Dockerfile is modified, run this command.
docker-compose down
: Stop and remove containers, networks, images and volumes. Usefull to restart with a clean state
docker-compose ps
: Display the list of containers and their status.
docker-compose logs
: Display the logs
docker-compose exec service_name sh
: Connect to a running container with a shell terminal. Usefull to test the container
docker-compose run --rm service_name sh
: Run a container and log into it with a shell terminal. This container is removed when it is stop. Usefull for debug
docker images
: Display all the image and their size
docker rmi $(docker images -q) -f
: Force to remove every unused images. Usefull to optimize the size
docker rm $(docker images -q) -f
: Force to remove every unused containers. Usefull to optimize the size
docker system prune --volumes -f
: Force to remove all stopped containers, all dangling images, and all unused networks, all volumes
docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##';|
: List all docker container name and their respective IPs.