This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
docker:build_create_run_image_phpinfo [2020/03/05 14:35] admin created |
docker:build_create_run_image_phpinfo [2020/03/05 16:20] (current) admin |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Build and modify PHP-7-Apache image ====== | + | ====== Build and modify PHP-7-Apache Docker Image ====== |
+ | |||
+ | |||
+ | To build and modify docker image create new folder in your Linux Docker machine | ||
+ | |||
+ | <code bash> | ||
+ | [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]# | ||
+ | </code> | ||
+ | |||
+ | |||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | # 000-default.conf | ||
+ | |||
+ | <VirtualHost *:80> | ||
+ | ServerAdmin webmaster@localhost | ||
+ | DocumentRoot /var/www/public | ||
+ | |||
+ | <Directory /var/www> | ||
+ | Options Indexes FollowSymLinks | ||
+ | AllowOverride All | ||
+ | Require all granted | ||
+ | </Directory> | ||
+ | </VirtualHost> | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | #!/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 | ||
+ | </code> | ||
+ | |||
+ | And ensure the file is executable: | ||
+ | |||
+ | <code bash> | ||
+ | $ chmod 755 start-apache | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | # Dockerfile | ||
+ | FROM php:7-apache | ||
+ | </code> | ||
+ | |||
+ | The MAINTAINER instruction should contain the developer or company name. | ||
+ | <code bash> | ||
+ | # Dockerfile | ||
+ | FROM php:7-apache | ||
+ | MAINTAINER SemaphoreCI <dev@example.com> | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | Now, we need COPY the file into the image: | ||
+ | |||
+ | <code bash> | ||
+ | ... | ||
+ | COPY 000-default.conf /etc/apache2/sites-available/000-default.conf | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | ... | ||
+ | RUN a2enmod rewrite | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | To get the source files inside the container, we can use the COPY command again: | ||
+ | |||
+ | <code bash> | ||
+ | ... | ||
+ | COPY src /var/www/ | ||
+ | RUN chown -R www-data:www-data /var/www | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | CMD ["executable","param1","param2"] | ||
+ | </code> | ||
+ | |||
+ | We’ll call the start script we created earlier: | ||
+ | |||
+ | <code bash> | ||
+ | ... | ||
+ | CMD ["start-apache"] | ||
+ | </code> | ||
+ | |||
+ | The final Dockerfile should look like this: | ||
+ | |||
+ | <code bash> | ||
+ | #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"] | ||
+ | </code> | ||
+ | Our folder contains a Dockerfile, a 000-default.conf and start-apache. The docker build command will build the Dockerfile inside the current directory: | ||
+ | |||
+ | <code bash> | ||
+ | [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 | ||
+ | </code> | ||
+ | |||
+ | If we list our Docker images now, we’ll see our new built image: | ||
+ | |||
+ | <code bash> | ||
+ | [root@localhost v1]# docker images | ||
+ | REPOSITORY TAG IMAGE ID CREATED SIZE | ||
+ | php-7-apache v1 6f4b2f7f4ec3 2 hours ago 414MB | ||
+ | </code> | ||
+ | |||
+ | Finally run a container on port 80: | ||
+ | |||
+ | <code bash> | ||
+ | [root@localhost v1]# docker run -d -p 80:80 php-7-apache:v1 | ||
+ | 051f5da1a58e483ff672ef32b7a6124a809893b31a3caa27c907a100e8d935e9 | ||
+ | </code> | ||
+ | |||
+ | Check is container running: | ||
+ | <code bash> | ||
+ | [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 | ||
+ | </code> | ||
+ | |||
+ | Result : | ||
+ | {{ :linux:docker_phpinfo_v1.png |}} | ||
+ | |||