Docker Registry con AWS/GCP

Luego de mas de 10 meses sin hacer una publicación, les traigo este sencillo tutorial de como configurar nuestro Docker Registry con las soluciones cloud de Amazon Web Services y Google Cloud Platform. Asumo que muchos ya deben conocer el manejo de imágenes con Docker, hacer pull y push, por lo que para poder continuar con este tutorial, tendrán que tener cuentas activas en AWS o GCP.  Antes de comenzar vamos a usar como referencia un Dockerfile para una aplicación escrita en Python:

FROM python:3.6
RUN apt-get update && \
    apt-get install -y gettext cmake build-essential default-libmysqlclient-dev python3-dev && \
    pip3 install uwsgi
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
EXPOSE :80
CMD ["uwsgi", "--ini", "uwsgi.ini"]


GCP Container Registry

Antes de avanzar, es necesario contar con el SDK instalado y tener configurado las cuentas, proyectos y perfiles, por lo que te recomiendo leer un post anterior que hice sobre: Como configurar las command line interface para AWS/GCP. Construimos nuestro Dockerfile:

docker build -t python/webapp:latest . 

Luego de lo anterior, tenemos que configurar Docker para que permitia loguearnos con CGP Container Registry, para ello tan solo debemos ejecutar:

gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://gcr.io 

Para las versiones antiguas de Docker que no aceptan el parametro --password-stdin, ejecutamos:

docker login -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io

Una ves que tenemos habilitado el login con GCP Container Registry, debemos etiquetar la imagen construida:

docker tag python/webapp:latest gcr.io/[PROJECT_ID/webapp:1.0.1

Recuerden cambiar la variable PROJECT_ID por  el ID de su proyecto. Luego, podemos hacer un push de nuesta imagen construida hacia GCP Container Registry:

docker push gcr.io/[PROJECT_ID/webapp:1.0.1

Luego de lo anterior, quedara almacenada en GCP Container Registry. Si queremos utilizar la imagen almacenada, ejecutamos:

docker pull gcr.io/[PROJECT_ID/webapp:1.0.1

En muchos casos será necesario volver a autenticarse con GCP Container Registry:

gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://gcr.io 

Recuerden que para las versiones antiguas de docker que no aceptan el parametro --password-stdin, ejecutamos:

docker login -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io

 

AWS Elastic Container Registry

Para usar el servicio de Container Registry de AWS, es necesario tener configurado el command line interface, el cual explique en la siguiente publicación: Como configurar las command line interface para AWS/GCP. Para esta parte del tutorial, vamos a continuar usando el Dockerfile de la aplicación para Python, volvemos a construirla ejecutando:

docker build -t python/webapp:latest .

Posterior, procedemos con nuestro servicio de Docker para que auntentique con AWS Elastic Container Registry, para ello ejecutaremos:

docker login -u AWS -p "$(aws --profile $PROFILE ecr --region=$REGION get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2)" $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com

Recuerden reemplazar las variables de $PROFILE, $REGION y $ACCOUN_ID. Otra forma tambien y mas simple:

eval $(aws --profile $PROFILE ecr --region=$REGION get-login --no-include-email | sed 's|https://||')

Volvemos a etiquetar la imagen recien construida:

docker tag python/webapp:latest $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/webapp:1.0.1

Y luego hacemos el respectivo push, algo muy importante es que antes de la subida, deberemos tener creado el repositorio en AWS Elastic Container Registry:

docker push $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/webapp:1.0.1

Luego de la subida podremos verificar la correcta subida ingresando en el Dashboard de AWS o  haciendo un respectivo pull:

docker pull $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/webapp:1.0.1

Hasta acá este sencillo y explicativo tutorial, si tienen alguna duda dejala en la caja de comentarios.