For a long time I used to use Laravel Valet as a local development environment. It was fine until we started to build more complex projects in different programming languages at TEAM23. We needed a solution flexible enough to manage different stacks in a convenient way. Instead of predefining an environment on all MacBooks, the development environment should be defined by the project. The dependencies should also be easy and fast to install for fast onboarding of new developers.
We developed b5. A modular task runner which wraps host system commands in a convenient way. It also helps us to provide company wide conventions into more than 100 different projects based on PHP, Python and/or Node.js.
As the whole company uses MacBooks, this guide is only tested on macOS (10.15.2 as time of writing).
This will be a series of articles
To provide detailed instructions on the single topics I have decided to split the full setup into different articles.
- Docker and Docker Compose (this article)
b5 - a modular task runner
Example project with Laravel
How to use traefik as a reverse proxy in development
At the end of the series we will have set up a local development environment based on Docker (especially docker-compose) where any service (which is basically a running docker container) of any project is reachable by its custom domain.
What is docker?
Docker is a software to run a single process inside of an encapsulated environment called container. You can build these containers by yourself and share them via an open source registry like Docker Hub which is used by default. This means that you can run a software on your system without installing it because it will be shipped as an image from Docker Hub and runs encapsulated on your host system.
Here an example where we run Composer in the current directory:
docker run -it -v $(pwd):$(pwd) -w $(pwd) composer:latest composer install
-it makes an interactive shell. With
-v we can mount directories into the container and
-w sets the working directory. With pwd we get the current directory.
composer:latest tells which image should be used. And at the end is the actual command which should be executed in the container.
Composer could not find a composer.json file in /Users/bambamboole
To initialize a project, please create a composer.json file as described in the https:
We see, the composer.json file is missing. But this means that we have executed composer without installing PHP or composer locally. Pretty cool.
What is Docker Compose
With Docker Compose it is possible to run multi container environments inside of a virtual network. This environment is defined by a
Let’s take a look at a simple example.
Create a new directory and change to it.
mkdir docker-compose-example && cd docker-compose-example
Create a PHP file in the current directory:
echo “ phpinfo();” >> index.php
Now create a
docker-compose.yml file with the following content:
In this example above we built a simple setup which contains both an apache and php-fpm service. The apache image is not from Docker Hub but from the company where I work TEAM23 . But it is also open source. The image is not special and can be simply built by yourself. It provides an environment variable to configure the document root which is the main reason why I use the self made image in this example. The second container is the official 7.4
php-fpm container. We mount the current directory into the containers
/app directory. The apache container has a port mapping which will map the containers port 80 to port 8000 on the host system.
To run the example execute the following command:
Now we should see a
phpinfo() page on
localhost:8000 . This was pretty easy, don’t you think?
To stop the project execute the following command:
Later on in this series we will build bigger environments with services such as MySQL, phpMyAdmin, Redis , Node.js and Mailhog .
In the next article of this series we will learn about b5.
If you have any questions, do not hesitate to write me a mail.