Watch this Tech Talk: https://do.co/video_eheidi
Erika Heidi, Software Engineer at DigitalOcean, demonstrates how to create a PHP development environment with Docker Compose, a tool for running multi-application environments. Learn how to define and integrate services, share files between containers, and manage your environment with Docker Compose commands.
About the Presenter
Erika Heidi is a Software Engineer at DigitalOcean as well as a DevOps turned writer. She is super passionate about creating and presenting technical content for a variety of audiences. You can also find her working as a technical writer for the DigitalOcean Community.
New to DigitalOcean? Get US $100 in credit when you sign up: https://do.co/deploytoday
To learn more about DigitalOcean: https://www.digitalocean.com/
Follow us on Twitter: https://twitter.com/digitalocean
Like us on Facebook: https://www.facebook.com/DigitalOcean
Follow us on Instagram: https://www.instagram.com/thedigitalocean/
We're hiring: http://do.co/careers
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
How to Create PHP Developer Environments With Docker Compose
1.
2. Hi there! I'm Erika
● DevOps Technical Writer
● Linux and open source enthusiast
● SysAdmin and PHP dev background
● Twitter: @erikaheidi
3. ● Part 1: PHP development environments in the wild,
how Docker Compose fits in
● Part 2: Building a multi-container environment for
Laravel with Docker Compose
● Part 3: Demo
Talk Goals
Setting Expectations
6. ● Part 1: PHP development environments in the wild,
how Docker Compose fits in
● Part 2: Building a multi-container environment for
Laravel with Docker Compose
● Part 3: Demo
Talk Goals
Setting Expectations
9. ● Pros:
○ Share, dispose and replicate full envs
○ Easy to Understand
● Cons:
○ Big Footprint
○ Depends on Automation Tools
~2012
Vagrant / VMs
10. ● Pros:
○ Small footprint, fast and lightweight
○ Eliminates need for heavy automation
● Cons:
○ Not as intuitive as VMs
○ Defining and managing (micro) services
~2014
Docker / Containers
12. What is Compose
Docker Compose is a tool that allows you to run
multi-container application environments
based on definitions set in a YAML file.
It uses service definitions to build fully
customizable environments with multiple
containers that can share networks and data
volumes.
● Easy to set up and
manage
● Multiple composed
envs on a single host
● Preserves volume data
● Variables to allow
customization
18. Environment Needs
Requirements for running PHP
Web Server: Nginx
We'll use Nginx to serve
the application in our
development
environment.
Database: MySQL
The application uses a
MySQL database to store
places and mark them as
"visited" or "to go".
PHP-FPM
PHP-FPM is required to
parse the PHP content
and return the results to
Nginx.
19. Application Needs
Laravel Requirements (DEV)
PHP Extensions
Laravel requires a few
different PHP extensions
that should be installed
on the application
container.
Artisan Commands
We need the ability to run
Artisan and Composer
commands from the host
machine.
Composer PHP
In order to install and
update Laravel's
dependencies, we'll need
Composer installed on the
application container.
20. Containers & Images
● Nginx
○ pre-built image
● MySQL
○ pre-built image
● App (PHP-FPM)
○ Image based on custom Dockerfile
23. App+PHPdocker-compose.yml
app:
build:
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- travellist
This service will be
responsible for parsing
all PHP requests and
command-line calls
made with Composer
and Artisan. It will build
a new image based on
the provided Dockerfile.
24. Nginxdocker-compose.yml
nginx:
image: nginx:1.17-alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
networks:
- travellist
This service will be
responsible for serving
the application via
Nginx. A port
redirection will allow us
to access port 80 inside
the container through
port 8000 in the host.
25. DBdocker-compose.yml
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
...
This service will run a
MySQL database to
store the application's
data. It will extract
values from the .env
Laravel file to create a
new DB and user.
28. Dockerfile
App+PHP
container
Dockerfile
FROM php:7.4-fpm
ARG uid=1000
ARG user=sammy
RUN apt-get update && apt-get install -y
git
curl
libpng-dev
libonig-dev
libxml2-dev
zip
unzip
...
This Dockerfile will build
a new image based on
the php:7.4-fpm
official PHP image.
We start by installing
some required system
packages.
29. Dockerfile
App+PHP
container
Dockerfile
…
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer &&
chown -R $user:$user /home/$user
...
Variables are used to
create a new user and
grant them the same
privileges as your
current system user on
the host, so that you
don't run into
permission issues with
synced files.
30. Dockerfile
App+PHP
container
Dockerfile
...
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
USER $user
We then install
Composer, set the work
dir and change to the
new user, so that when
we run commands via
docker-compose exec,
they are executed as
the new system user.
31. Directory
Tree
TERMINAL
application/
├── docker-compose
│ ├── mysql
│ │ └── init_db.sql
│ └── nginx
| └── travellist.conf
├── Dockerfile
└── docker-compose.yml
Here's an overview of
what our Docker
Compose setup looks
like, excluding the
application files.