En esta oportunidad siguiendo con nuestra muestra de como utilizar Docker en nuestros ambientes de desarrollo y orientandonos netamente en hacer ejercicios prácticos hoy queremos guiarlos en la instalación de un ambiente LEMP (Linux Nginx MySQL PHP-FPM) en sistema operativo Centos 6.8 y le vamos a realizar la instalación de estos contenedores mediante archivos DockerFile.
Instalando contenedores mediante DockerFile
El DockerFile en resumen es un archivo de texto que nos permitirá centralizar de una manera ordenada los comandos que interactuen con Docker los mismos se ejecutaran de forma secuencial, uno detrás de otro. Conociendo esto entonces vamos paso a paso hasta lograr crear una imagen base con la instalación de los servicios antes comentados via DockerFile. Para luego en base a esta imagen personalizada poder crear nuestros contenedores de prueba.
Crear carpeta para separar nuestros Dockerfiles en este caso vamos a crear una carpeta llamada Centos6.8
mkdir Centos6.8; cd Centos6.8; touch Dockerfile; nano -w Dockerfile;
Agregamos al DockerFile la imagen del sistema operativo Centos y la versión 6.8 con el comando FROM https://hub.docker.com/explore/
# El Comando FROM nos permite importar cualquier imagen en este caso Centos 6.8 FROM centos:6.8
* Para probar este punto solo podemos ejecutar lo siguiente en nuestra consola, en donde crearemos una imagen en base al contenido del dockerfile
#Nos ubicamos en la carpeta que contiene el dockerfile cd Centos6.8; #Creamos una imagen llamada infranetworking en base a el dockerfile, se utiliza el "." para seleccionar el dockerfile actual sudo docker build -t infranetworking .
Se debe ver algo como esto que indica que se esta creando la imagen llamada infranetworking y esta descargando la imagen de Centos 6.8
Step 1 : FROM centos:6.8 7: Pulling from library/centos a3ed95caeb02: Download complete da71393503ec: Downloading 44.33 MB/70.58 MB
Al finalizar podemos ejecutar lo siguiente para ver la lista de imagenes actuales en Docker en donde figurara una imagen llamada infranetworking
[infra@localhost Centos6.8]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 6.8 904d6c400333 2 weeks ago 196.7 MB infranetworking latest 904d6c400333 2 weeks ago 196.7 MB
Importante para seguir haciendo pruebas es conocer como borrar la imagen que hemos creado de prueba, seria con el siguiente comando
#docker rmi : se utiliza para borrar cualquier imagen sudo docker rmi infranetworking:lastest # Tambien se puede utilizar el ID de la imagen para borrarla sudo docker rmi 904d6c400333
Incluimos los datos de contacto del encargado de la imagen
# Correo de contacto de la persona encargada de esta imagen MAINTAINER Personal <tucorreo@dominio.com>
Agregamos los repositorios necesarios
# Agregamos repositorios a nuestra imagen RUN yum -y install epel-release RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
Instalamos algunas utilidades necesarias:
# Instalamos utilidades RUN yum install -y wget
Instalamos Nginx en la version 1.11
# Instalamos Nginx en la version 1.11 y liberamos el puerto 80 RUN echo "[nginx]" >> /etc/yum.repos.d/nginx.repo RUN echo "name=nginx repo" >> /etc/yum.repos.d/nginx.repo RUN echo "baseurl=http://nginx.org/packages/mainline/rhel/6/x86_64" >> /etc/yum.repos.d/nginx.repo RUN echo "gpgcheck=1" >> /etc/yum.repos.d/nginx.repo RUN echo "enabled=1" >> /etc/yum.repos.d/nginx.repo RUN cat /etc/yum.repos.d/nginx.repo RUN wget http://nginx.org/keys/nginx_signing.key RUN rpm --import nginx_signing.key RUN yum install -y nginx EXPOSE 80
Instalamos Php-fpm y la versión de php 5.5
#Instalar Php-fpm con Php 5.5 RUN yum -y install --enablerepo=remi-php55 php-fpm php-mysql php-gd php-mcrypt php-mbstring php-intl php-xml php-pgsql
Instalación de Mysql 5.5 (mariaDB)
#Instalar Mysql 5.5 (mariadb) y liberamos el puerto 3306 RUN yum -y install --enablerepo=remi,remi-test mysql mysql-server EXPOSE 3306
Creamos el acceso via shell
#Acceso via shell CMD ["/bin/bash"]
El archivo completo Dockerfile deberia quedar de la siguiente forma
# Procedemos a Instalar Centos 6.8 FROM centos:6.8 # Correo de contacto de la persona encargada de esta imagen MAINTAINER Personal <tucorreo@dominio.com> # Agregamos repositorios a nuestra imagen RUN yum -y install epel-release RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm # Instalamos utilidades RUN yum install -y wget # Instalamos Nginx en la version 1.11 y liberamos el puerto 80 RUN echo "[nginx]" >> /etc/yum.repos.d/nginx.repo RUN echo "name=nginx repo" >> /etc/yum.repos.d/nginx.repo RUN echo "baseurl=http://nginx.org/packages/mainline/rhel/6/x86_64" >> /etc/yum.repos.d/nginx.repo RUN echo "gpgcheck=1" >> /etc/yum.repos.d/nginx.repo RUN echo "enabled=1" >> /etc/yum.repos.d/nginx.repo RUN cat /etc/yum.repos.d/nginx.repo RUN wget http://nginx.org/keys/nginx_signing.key RUN rpm --import nginx_signing.key RUN yum install -y nginx EXPOSE 80 #Instalar Php-fpm con Php 5.5 RUN yum -y install --enablerepo=remi-php55 php-fpm php-mysql php-gd php-mcrypt php-mbstring php-intl php-xml php-pgsql #Instalar Mysql 5.5 y liberamos el puerto 3306 RUN yum -y install --enablerepo=remi,remi-test mysql mysql-server EXPOSE 3306 #Acceso via shell CMD ["/bin/bash"]
Ejecutar el archivo completo seria con el siguiente comando para que nos cree la imagen infranetworking
sudo docker build -t infranetworking .
Procedemos a crear nuestro contenedor llamado infratuto a partir de nuestra imagen
sudo docker run -t -i -p 80:80 -p 3306:3306 --name infratuto infranetworking /bin/bash
Con el anterior comando nos conectara automaticamente a nuestro contenedor se debe ver algo asi
[infra@localhost Centos6.8]$ sudo docker run -t -i -p 80:80 -p 3306:3306 --name infratuto infranetworking /bin/bash [root@e1827a12f80b /]# [root@e1827a12f80b /]# nginx -v nginx version: nginx/1.11.1 [root@e1827a12f80b /]# mysql --version mysql Ver 14.14 Distrib 5.5.50, for Linux (x86_64) using readline 5.1 [root@e1827a12f80b /]# php-fpm -version PHP 5.5.36 (fpm-fcgi) (built: May 25 2016 16:01:56) Copyright (c) 1997-2015 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies [root@e1827a12f80b/]# /etc/init.d/nginx start Starting nginx: [ OK ] [root@b4f9ec0b28f0 /]# /etc/init.d/php-fpm start Starting php-fpm: [ OK ] [root@b4f9ec0b28f0 /]# /etc/init.d/mysqld start Initializing MySQL database: Installing MySQL system tables... 160621 15:42:14 [Note] /usr/libexec/mysqld (mysqld 5.5.50) starting as process 118 ... OK Filling help tables... 160621 15:42:14 [Note] /usr/libexec/mysqld (mysqld 5.5.50) starting as process 125 ... OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h b4f9ec0b28f0 password 'new-password' Alternatively you can run: /usr/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd /usr ; /usr/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd /usr/mysql-test ; perl mysql-test-run.pl Please report any problems at http://bugs.mysql.com/ [ OK ] Starting mysqld: [ OK ]
Conclusión
Como pudimos ver tenemos la opción de poder crear nuestras imágenes personalizadas con instalaciones de servicios también personalizados y todo en un archivo de texto el cual podemos ir mejorando a través del tiempo, esta es la forma correcta de crear ambientes de desarrollo escalable para cualquiera que programe en nuestro equipo y que solo el desarrollador se preocupe por el código no por la infraestructura.
Ya que podemos crear un archivo base, luego al hacer algún cambio podemos decirle al desarrollador que borre su imagen actual y vuelva a instalar la nueva imagen para que tenga los nuevos cambios en la plataforma ya que sera siempre lo más parecido a producción. Para la siguiente entrega hablaremos de los Microservicios, donde exploraremos como una imagen nos sirve para tener cada servicio de forma independiente a nivel de contenedores y poder enlazarlos así vía Docker.
Lecturas recomendadas:
Si te gustó esta Parte 3, sígue con la Parte 04: