Introducción a Docker – Parte 3

Dificultad: Intermedio
Tiempo de Lectura: 4 minutos

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:


¿Te resultó útil el artículo? Compártelo con tus colegas: