Using Docker to Run a Laravel Application in PHP7
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:
- Testing worker microservices locally that will run on Iron.io
- Switching between Apache and Nginx for local development
- Ensuring that an application will run in PHP7 before deploying it to a production server
That last use case is where I’ll spend the rest of my time in this post.
Running a Laravel Application Locally Using Docker
Note: Since this project is ongoing, I’d recommend checking out the latest updates to the Readme on Github. I’ll try to keep the blog post up to date too, but I don’t want to make any promises.
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