Seleccionar página

El ecosistema de Dockers en AWS ha ido creciendo en muy poco tiempo y actualmente se dispone de una solución muy robusta e integrada con el mundo de los contenedores. Es verdad que muchos nombres cambian, pero los conceptos son los mismos. El uso de los contenedores ha ido creciendo en muy poco tiempo y de hecho es el proyecto en GitHub más activo en meses en su categoría DevOps, el hecho de ser una herramienta tan versátil como independiente de la plataforma se convierte en una navaja suiza.

En este post vamos a crear una imagen que ejecute PHP7 bajo en Apache y basada en Ubuntu, la registraremos en ECR y la desplegaremos en ECS. Este ejercicio es para darnos cuenta la sencillez y potencia de los nuevos servicios para Dockers de AWS, su compatibilidad y su flexibilidad.

Damos por hecho que tienes instalada la versión Docker y el AWS Cli instalado en tu ordenador, ah! y una cuenta en DockerHub.

Para comenzar vamos a crear la imagen de nuestro Docker con el fichero Dockerfile y el siguiente contenido en él.

######################################
# Docker File to Build PHP 7 #
# Base image ubuntu 16.04 #
######################################

FROM ubuntu:16.04
# Author: Victor Adsuar victor@victoradsuar.com
MAINTAINER Victor Adsuar <victor@victoradsuar.com>

# Install Software repo common

RUN locale-gen en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
ENV LANG en_US.UTF-8

RUN apt-get update
RUN apt-get install -y python-software-properties
RUN apt-get install -y software-properties-common


# Install PHP 7 repository
RUN add-apt-repository -y ppa:ondrej/php && apt-get update

RUN apt-get install -y --allow-unauthenticated apache2 php7.0
php7.0-cli php7.0-common php7.0-curl php7.0-fpm php7.0-gd
php7.0-json php7.0-mbstring php7.0-mcrypt php7.0-mysql 
php7.0-opcache php7.0-readline php7.0-soap php7.0-xml 
libapache2-mod-php7.0

RUN apt-get clean

# Copy php.info
RUN rm -rf /var/www/html/*
ADD src /var/www/html

# Apache config
RUN a2enmod rewrite
RUN chown -R www-data:www-data /var/www
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock
ENV APACHE_PID_FILE /var/run/apache2.pid

EXPOSE 80
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Posteriormente vamos a crear un directorio donde se encuentra nuestro fichero Dockerfile llamado “src” que incluya el típico fichero info.php.

En los siguientes pasos vemos a subir nuestra imagen a nuestro registro privado ECR.

Registro autenticación Docker (Necesario para hacer push y pull de imágenes)

aws ecr get-login –region eu-west-1

docker login

Construir una imagen

docker build -t php7 .

Etiquetar imagen

docker tag php7:latest numcuenta.dkr.ecr.eu-west-1.amazonaws.com/php7:latest

Subir imagen a ECR

docker push numcuenta.dkr.ecr.eu-west-1.amazonaws.com/php7:latest

También podemos bajar una imagen de nuestro registro privado ECR

docker pull arn:aws:ecr:eu-west-1:numcuenta:repository/php7:latest

Ahora que tenemos nuestra imagen en ECR vamos a proceder a crear una tarea. Para ello vamos al servicio ECS – “Tasks Definitions” y creamos una nueva tarea según el siguiente JSON. Debes de renombrar el número de cuenta por el tuyo.

{
“requiresAttributes”: [
{
“value”: null,
“name”: “com.amazonaws.ecs.capability.ecr-auth”,
“targetId”: null,
“targetType”: null
},
{
“value”: null,
“name”: “com.amazonaws.ecs.capability.task-iam-role”,
“targetId”: null,
“targetType”: null
}
],
“taskDefinitionArn”: “arn:aws:ecs:eu-west-1:numcuenta:task-definition/PHP70”,
“networkMode”: “bridge”,
“status”: “ACTIVE”,
“revision”: 5,
“taskRoleArn”: “arn:aws:iam::numcuenta:role/AmazonECSTaskS3BucketRole”,
“containerDefinitions”: [
{
“volumesFrom”: [],
“memory”: 128,
“extraHosts”: null,
“dnsServers”: null,
“disableNetworking”: null,
“dnsSearchDomains”: null,
“portMappings”: [
{
“hostPort”: 80,
“containerPort”: 80,
“protocol”: “tcp”
}
],
“hostname”: null,
“essential”: true,
“entryPoint”: null,
“mountPoints”: [],
“name”: “php70”,
“ulimits”: null,
“dockerSecurityOptions”: null,
“environment”: [],
“links”: null,
“workingDirectory”: null,
“readonlyRootFilesystem”: null,
“image”: “numcuenta.dkr.ecr.eu-west-1.amazonaws.com/php7″,
“command”: null,
“user”: null,
“dockerLabels”: null,
“logConfiguration”: null,
“cpu”: 512,
“privileged”: null,
“memoryReservation”: null
}
],
“placementConstraints”: [],
“volumes”: [],
“family”: “PHP70”
}

Y ya tenemos nuestra definición realizada.

Task Definition AWS

Posteriormente creamos nuestro Cluster y servicio para poner en ejecución nuestro Docker. El cluster va a ser muy sencillo, una sola instancia y sin balanceador. Hay que tener en cuenta los roles empleados y que los grupos de seguridad dejen pasar el tráfico.

En la definición de cluster tenemos que indicar los siguientes parámetros:

  • Cluster Name. El que quieras
  • Instance Type. Para la prueba una t2.micro va bien.
  • Instances number. Con 1 sobra.
  • EBS. Con 22Gb es suficiente.
  • Key Par. Debes seleccionar uno ya existente para poder conectarte a las instancias que ejecutarán el docker.

En la sección de Networking puedes seleccionar el que quieras, si ya tienes una VPC definida con subnets puedes personalizar dónde quieres que se despliegue la instancia EC2 y el Docker.

Finalmente hay que definir el rol ECS que se va a asignar a la instancia para que pueda tener acceso a la API de servicios ECS. El asistente de creación puede crear tu ecsInstanceRole automáticamente.

Con este último paso ya tenemos nuestro cluster en marcha con su servicio y tarea corriendo sobre una instancia EC2.

Cluster AWS ECS

Y podemos acceder a nuestro servicio PHP7 poniendo en un navegador la dirección de nuestra instancia EC2 y haciendo referencia a info.php.

PHP7 Docker ECS

A partir de aquí podemos ir actualizando las tareas definidas, añadir nuevas instancias que ejecutan el servicio y miles de posibilidades más. ¡La versatilidad de ECS + ECR es increíble!