====== Build and modify PHP-7-Apache Docker Image ======
To build and modify docker image create new folder in your Linux Docker machine
[root@localhost v1]# ll /root/Docker_Php_Deploy/v1/
total 20
-rwxrwxr-x 1 root root 239 Mar 5 13:06 000-default.conf
-rwxr-xr-x 1 root root 300 Mar 5 14:24 Dockerfile
-rw-r--r-- 1 root root 432 Mar 5 11:22 howto.txt
-rwxr-xr-x 1 root root 242 Mar 5 14:23 index.php
-rwxrwxr-x 1 root root 164 Mar 5 13:36 start-apache
[root@localhost v1]#
The php:7-apache image set the Apache public directory to **''%%/var/www/html%%''**. However, in this case, following Laravel’s conventions, we need to set it to the **''%%/var/www/public%%''**. One way to achieve this is by setting up a virtual host configuration. Create a file called **''%%000-default.conf%%''** with the following contents:
# 000-default.conf
ServerAdmin webmaster@localhost
DocumentRoot /var/www/public
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Apache, by default, listens on port 80 (HTTP), this isn’t a problem when running the server on your machine. But some cloud providers require that containers use different ports.
We’ll create a script to dynamically override Apache’s port when the container starts. Create a file called start-apache with the following contents:
#!/usr/bin/env bash
sed -i "s/Listen 80/Listen ${PORT:-80}/g" /etc/apache2/ports.conf
sed -i "s/:80/:${PORT:-80}/g" /etc/apache2/sites-enabled/*
apache2-foreground
And ensure the file is executable:
$ chmod 755 start-apache
We’re set to create a production-ready image. Create a file called Dockerfile.
We’ll use the FROM clause to use the offical php apache images as a starting point:
# Dockerfile
FROM php:7-apache
The MAINTAINER instruction should contain the developer or company name.
# Dockerfile
FROM php:7-apache
MAINTAINER SemaphoreCI
...
Now, we need COPY the file into the image:
...
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
...
Laravel requires Apache’s mod_rewrite plugin to be enabled, we can do this using the a2enmod utility. With RUN, we run commands inside the container:
...
RUN a2enmod rewrite
...
To get the source files inside the container, we can use the COPY command again:
...
COPY src /var/www/
RUN chown -R www-data:www-data /var/www
...
The last thing we need to do is to run the Apache server in the background. The CMD command should be used only one time in a Dockerfile, and it needs to have the following form:
CMD ["executable","param1","param2"]
We’ll call the start script we created earlier:
...
CMD ["start-apache"]
The final Dockerfile should look like this:
#Donwloading and creating docker image from GitHub called php:7-apache
FROM php:7-apache
#Your email and information
MAINTAINER YOUR_EMAIL_OR_ORGANIZATION
#Copy local created file 000-default.conf to image-php-server right location
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
#Copy start-apache script to executible linux directory
COPY start-apache /usr/local/bin
#Laravel requires Apache’s mod_rewrite plugin to be enabled, we can do this using the a2enmod utility. With RUN, we run commands inside the container
RUN a2enmod rewrite
# Copy application source and permissions for source folder
COPY index.php /var/www/public/
RUN chown -R www-data:www-data /var/www
CMD ["start-apache"]
Our folder contains a Dockerfile, a 000-default.conf and start-apache. The docker build command will build the Dockerfile inside the current directory:
[root@localhost v1]# docker build -t php-7-apache:v1 .
Sending build context to Docker daemon 6.144kB
Step 1/8 : FROM php:7-apache
7-apache: Pulling from library/php
68ced04f60ab: Pull complete
1d2a5d8fa585: Pull complete
5d59ec4ae241: Pull complete
d42331ef4d44: Pull complete
408b7b7ee112: Pull complete
570cd47896d5: Pull complete
2419413b2a16: Pull complete
2c7832852643: Pull complete
8b0b209a25bc: Pull complete
46011418685f: Pull complete
68be3748ea55: Pull complete
4e3af655ec1e: Pull complete
9f579d3b7159: Pull complete
Digest: sha256:c496c0f962eaaea0f52d9c068bf331fe477703d4657f99b955a2a35a4c3486c4
Status: Downloaded newer image for php:7-apache
---> d753d5b380a1
Step 2/8 : MAINTAINER YOUR_EMAIL_OR_ORGANIZATION
---> Running in 39e672a90b5a
Removing intermediate container 39e672a90b5a
---> 4d25a2d00117
Step 3/8 : COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
---> 19a2cdc56a9f
Step 4/8 : COPY start-apache /usr/local/bin
---> 603ec78bbed1
Step 5/8 : RUN a2enmod rewrite
---> Running in a7fff2718075
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart
Removing intermediate container a7fff2718075
---> 9bdfd2fefddd
Step 6/8 : COPY index.php /var/www/public/
---> 1c116f043a28
Step 7/8 : RUN chown -R www-data:www-data /var/www
---> Running in 84452265396e
Removing intermediate container 84452265396e
---> d059277e4af0
Step 8/8 : CMD ["start-apache"]
---> Running in a82d06ffb356
Removing intermediate container a82d06ffb356
---> 6f4b2f7f4ec3
Successfully built 6f4b2f7f4ec3
Successfully tagged php-7-apache:v1
If we list our Docker images now, we’ll see our new built image:
[root@localhost v1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php-7-apache v1 6f4b2f7f4ec3 2 hours ago 414MB
Finally run a container on port 80:
[root@localhost v1]# docker run -d -p 80:80 php-7-apache:v1
051f5da1a58e483ff672ef32b7a6124a809893b31a3caa27c907a100e8d935e9
Check is container running:
[root@localhost v1]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
051f5da1a58e php-7-apache:v1 "docker-php-entrypoi…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp jovial_vaughan
Result :
{{ :linux:docker_phpinfo_v1.png |}}