Contact me

Using Docker to Run a Laravel Application in PHP7

2016, Mar 24

Like what you see?

Sign up for my weekly newsletter of advice, tools, and news for startup founders and digital entrepreneurs.

Email Address

PHP7 has been out for a few months now; the performance benefits have been demonstrated, and most of the bugs worked out. Now is the time for early to mid-stage adopters to get moving! That said, nobody wants to go through a difficult upgrade process. Fortunately, I’ve found that upgrading most Laravel 5.0+ applications to PHP7 is almost completely pain-free. If you are worried though, there’s a simple way to test them out using Docker.

What is Docker, and how can it help us test PHP7 applications?

Docker is a service for running containers. Containers are small, contained microservices that can run on a single machine. I see them as the next logical step in virtualization: where virtual machines let you emulate an entire operating system, containers let you emulate everything on top of the kernel, so more of the underlying infrastructure is shared while keeping a sharp separation of concerns. If that just went completely over your head, it’s okay. I’m not an expert either, but that doesn’t mean we can’t use Docker as a tool to make our lives a little easier.

Setting up Docker

One important note about Docker: it only runs on Linux. So, if you use a Mac or Windows computer for development, you’ll need to create a virtual machine running Linux to get Docker running. Docker has some tools that make this relatively easy, and the documentation has improved greatly even in the last six months. Install Docker locally before you move on to the rest of this tutorial.

Once you get Docker running, what can you do with it?

There are a number of good use cases for Docker, but I’d recommend starting small with local testing and development. Moving it into production can be challenging, but using it to test a new version of a language or test a new service might be an ideal use case for beginners. I’ve used Docker for:

1. Prerequisites

2. Prep work

Navigate to the root of your Laravel project. Change the /storage folder permissions to “777” using “chmod -R 0777 storage/”. I know, “777” permissions are bad, but you’re just doing this locally and so far it’s the best way I’ve found to allow Docker to access the folder and write to it.

3. Download the container

Download the latest version of the base PHP7/Laravel Docker container: ”docker pull karllhughes/laravel-php-7”. The Dockerfile does a build of PHP7 on Ubuntu and installs some tools you’ll need like vi, Composer, and Apache.

4. Run the container

From the root of your Laravel project, run “docker run -it -v $PWD:/www -p 80:80 karllhughes/laravel-php-7” to bring up the container’s command line. Note: Docker pros will probably pick a fight with me at about this point. I know, you’re not supposed to log into a running container and start services. I don’t care; this is a quick and dirty working solution to test PHP7 without a lot of setup. Also, I welcome pull requests if any of you wants to help improve the container: https://github.com/karllhughes/laravel-php-7

5. Start Apache within the container

From the container’s command line, navigate to the web root with “cd /www”. Then run “apachectl start” to get the webserver running within the container.

6. Make sure things are working

Your application should be available at http://localhost:80 if everything is wired up correctly. You can also attach the application to another port by modifying the command above to something else: “docker run -it -v $PWD:/www -p :80 karllhughes/laravel-php-7". If you get a 500 error, make sure your file permissions are open and you have a valid .env file in the project. You can also run "composer install" or "composer update" to make sure your packages work with PHP7\. Finally, you can run your unit tests with "php vendor/bin/phpunit". Now you've got your Laravel application running in PHP7\. Congrats! Feel free to leave me feedback [on the repo](https://github.com/karllhughes/laravel-php-7) or on [Twitter](https://twitter.com/karllhughes) if you have questions or trouble setting this up.