on March 27, 2018. in Programming, Development, Software. A 3 minute read.
This past weekend I was playing around on some pet projects and wanted to get up and running quickly. My initial reaction was to reach for a Vagrant box provisioned with Ansible. After all, that’s what I’ve been using for a really long time now.
Recently I’ve been also learning a bit more about Docker, so I figured maybe this pet project would be a good project to replace the standard Vagrant set up and go with Docker instead. When it comes to Docker, by now I believe I have a fairly good understanding of how it works and how it’s meant to be used in a development environment. I’ve learned a lot about it from Vranac, as well as poked around it on my own.
While trying to write a set of Docker files and Docker compose files for this project, I thought there must be an easier way to do this… And then I remembered that some time ago I came across a generator to generate Docker environments for PHP projects: PHPDocker.io. As they state on their website:
PHPDocker.io is a tool that will help you build a typical PHP development environment based on Docker with just a few clicks. It supports provisioning of the usual services (MySQL/MariaDB, Redis, Elasticsearch...), with more to come. PHP 7.1 is supported, as well as 7.0 and 5.6.
What I like about PHPDocker is that it takes a couple of clicks and filling out a couple of text fields to get a nice zip with all the things needed to get a project up and running. It has support for a “generic” PHP application, like Symfony 4, Zend Framework and Expressive, or Laravel, as well as for applications based on Symfony 2⁄3, or Silex. PHP versions supported range from 5.6 to 7.2 and a variety of extensions can be additionally enabled. Support for either MySQL, MariaDB, or Postgres is provided, as well as a couple of “zero-config” services like Redis or Mailhog.
The zip file comes with a phpdocker
directory that holds the configurations for the specific containers such as the nginx.conf
file for the nginx container. In the “root” of the zip there’s a single docker-compose.yml
file which configures all the services we told PHPDocker we need:
###############################################################################
# Generated on phpdocker.io #
###############################################################################
version: "3.1"
services:
mysql:
image: mysql:<span style="color:#ae81ff">5.7</span>
container_name: test-mysql
working_dir: /application
volumes:
- .:/application
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=test
ports:
- <span style="color:#e6db74">"8082:3306"</span>
webserver:
image: nginx:alpine
container_name: test-webserver
working_dir: /application
volumes:
- .:/application
- ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- <span style="color:#e6db74">"8080:80"</span>
php-fpm:
build: phpdocker/php-fpm
container_name: test-php-fpm
working_dir: /application
volumes:
- .:/application
- ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/<span style="color:#ae81ff">7.2</span>/fpm/conf.d/<span style="color:#ae81ff">99</span>-overrides.ini</code></pre></div>
Run docker-compose up
in the directory where the docker-compose.yml
file is located and it’ll pull and build the required images and containers, and start the services. The application will be accessible from the “host” machine at localhost:8080
, as that’s the port I defined I wanted exposed in this case. You can see that in the ports
section of the webserver
service.
One thing I noticed is that the mysql
service doesn’t keep the data around, but that can be fixed by adding a new line to the volumes
section of that service: ./data/mysql:/var/lib/mysql
. The mysql
service definition should now read:
mysql:
image: mysql:5.7
container_name: test-mysql
working_dir: /application
volumes:
- .:/application
- ./data/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=test
ports:
- "8082:3306"
Other than this, I didn’t notice any issues (so far) with the environment.
Inside the phpdocker
folder there’s also a README
file that provides additional information how to use the generated Docker environment, what services are available on what port, a small “cheatsheet” for Docker compose, as well as some recommendations how to interact with the containers.
Happy hackin’!
Tags: php, docker, phpdocker.io.