What is Docker?
No, we’re not talking about a clothing brand, but a tool that’s become essential for almost every developer.
Before Docker, software teams had to wrestle with multiple technologies, their different versions, constant switching between projects, and onboarding new developers who had to manually install full environments. All of that is time—something we rarely have to spare.
What if we could spin up a complete development environment in seconds? Switch to another project just as fast with a single command? Mirror production locally? Those are some of the advantages Docker brings developers today.
Why is it so important for us?
At Bloonde we work daily on different projects using different stacks: Laravel, Angular, Vue.js, Ionic, Node.js. Sometimes the same technologies run on different major versions across projects—making a containerised approach indispensable.
But… what exactly are containers? Docker lets us create, in record time, an isolated environment fully sandboxed from our host OS. It’s not a “heavy” virtual machine; containers share parts of the host kernel so they start dramatically faster than a VM (no new kernel boot, no full OS init, no hardware emulation).
Under the hood Docker leverages Linux cgroups and namespaces: processes inside a container are still real host processes—but isolated so they don’t touch the rest of the system.
For more, see the official docs.
Spinning up Docker containers
Fast via the command line
Let’s skip the theory and get practical. How easy is it to run a Docker container? One command is enough to have a fresh Ubuntu container running:
docker run -it ubuntu
The word ubuntu refers to the Docker image we’ll use to create the container. Images are templates bundling the libraries, runtimes and tools required for our application.
Defining our own images
That’s just a quick example. On Docker Hub you’ll find a huge catalogue of official and community images. And if none fits perfectly, you can craft your own with a Dockerfile. Below we start from a PHP + Apache base and install the xdebug extension:
FROM php:8.0-apache
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
RUN echo 'zend_extension=xdebug.so \n\n' \
'xdebug.mode=debug\n' \
'xdebug.client_host=172.23.0.1\n' \
'xdebug.client_port=9003 \n' \
'xdebug.start_with_request=yes' > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
Then build it and reuse it as many times as you need:
docker build -t my_image_name .
What if we need multiple containers?
Use docker-compose to define a multi‑container environment (app + database + more) in a single docker-compose.yml, then bring it up with one command:
docker-compose up
Example compose file:
version: '3'
services:
app:
container_name: app-project
image: php:8.0-apache
working_dir: /var/www/html
volumes:
- ./:/var/www/html/
ports:
- 80:80
networks:
- web-net
depends_on:
- mysql
mysql:
image: mysql
container_name: mysql-project
env_file: ./.env
volumes:
- dbdata:/var/lib/mysql
environment:
MYSQL_DATABASE: project_db
MYSQL_USER: develop
MYSQL_PASSWORD: StrongPass123
ports:
- 3306:3306
networks:
- web-net
restart: on-failure:3
networks:
web-net:
volumes:
dbdata:
Just like that we have PHP + MySQL up, networked, and editable from our IDE through mounted volumes.
I need it yesterday
Tools like Laradock provide prebuilt scaffolds for Laravel + Docker, but at Bloonde we prefer to “cook” tailored environments per project. That’s a methodological choice—your context may differ.
Have a project in mind? Contact us and we’ll build it with the right technology.