Docker: ¡Tan fácil como construir, ejecutar y listo!

Docker ha recibido muchos comentarios recientemente, y por una buena razón. El servicio de contenedorización hace que la implementación de microservicios sea fácil y estable, ya que cada servicio puede ejecutar un sistema operativo en su propio entorno virtual. Eso significa compatibilidad total ... ¡no más preocupaciones por las versiones del sistema operativo, las dependencias y las diferencias entre sus máquinas de desarrollo y producción! Y para colmo, es liviano, por lo que puede ejecutar varios contenedores Docker en la misma máquina (instancia EC2). ¡Hoy aprenderemos cómo configurar e implementar Docker en Amazon EC2 en 3 sencillos pasos!

Antes de comenzar, eche un vistazo a este diagrama de alto nivel (cortesía de infoworld.com).

En el lado izquierdo está la configuración de su máquina virtual tradicional usando un hipervisor. Un hipervisor es simplemente su administrador de VM responsable de asignar recursos de hardware a cada sistema operativo virtual. Si cada sistema operativo invitado necesita 1 GB de memoria y el host usa 1 GB de memoria, la configuración de la izquierda requeriría 4 GB en total.

En el lado derecho hay una configuración de contenedor, que ejecutaría un motor de contenedor como Docker. La diferencia más significativa es que un motor de contenedor es más ligero porque puede compartir ciertos recursos de hardware con su sistema operativo host, a diferencia de las máquinas virtuales tradicionales que requieren su propia asignación separada. Esta configuración requiere 1 GB para el sistema operativo anfitrión y quizás 600 MB por contenedor (porque hipotéticamente se comparten 300 MB con el sistema operativo anfitrión), para un total de 2,8 GB necesarios. ¿Ves esos beneficios? Genial, ¡ahora podemos empezar!

Empezando

Ingrese su instancia EC2 y clone Kangzeroos-ES6-React-Redux-Boilerplate de Github. El código que verá será para configurar esta aplicación web, pero los pasos son los mismos para cualquier proyecto. Una vez que lo haya descargado, vaya a la carpeta y busque los archivos a continuación. Estos son los archivos que usaremos con Docker.

Dockerfile build.sh run.sh

Antes de que podamos usar Docker, primero debemos instalarlo. A continuación se muestra la forma rápida y sencilla de instalar Docker, pero si desea la configuración completa, consulte los documentos oficiales.

$ sudo apt-get update $ sudo apt-get install docker-engine $ sudo service docker start $ sudo docker run hello-world

El último comando verifica si Docker se está ejecutando correctamente y luego sale. Si todo esto funciona, ¡está listo para comenzar a Dockerizar!

Paso 1: compilar el Dockerfile

El primer paso es configurar los archivos necesarios para que Docker cree una imagen. Las imágenes de Docker son simplemente planos de entornos que desea crear, mientras que los contenedores son los entornos de ejecución y funcionales reales en los que se ejecutará su aplicación. En la raíz de nuestro directorio de aplicaciones, hay una carpeta llamada App. La aplicación web en sí reside en esta Appcarpeta, mientras que todas las cosas relacionadas con Docker están afuera. Esto es necesario ya que Docker contendrá todo el interior App. Así que hagamos el primer archivo de Docker llamado Dockerfile(sin extensión de archivo Dockerfile.sh, solo Dockerfile) y revisemos línea por línea.

FROM ubuntu # ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install nodejs -y && apt-get install npm -y # install curl for n RUN apt-get install curl -y RUN apt-get install vim -y # obtain latest stable version of node RUN npm cache clean -f RUN npm install -g n RUN n stable # setup working directory # ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

La primera línea es FROM ubuntu. El propósito de Dockerfilees configurar el sistema operativo y los programas dentro del sistema operativo, por lo que tiene sentido que la primera línea especifique qué versión del sistema operativo usar. ubuntuaquí se hace referencia a una imagen específica alojada en Docker Hub, específicamente la imagen oficial del sistema operativo Ubuntu.

# ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install curl -y RUN apt-get install vim -y

El siguiente conjunto de líneas se configura en Ubuntu. Queremos comprobar si hay actualizaciones de Ubuntu RUN apt-get update -yy actualizaciones con RUN apt-get upgrade -y… cosas bastante estándar para configurar su entorno. También instale curl RUN apt-get install curl -yy vim RUN apt-get install vim -y, ambos es bueno tenerlos para propósitos generales.

# obtain latest stable version of node RUN apt-get install nodejs -y && apt-get install npm -y RUN npm cache clean -f RUN npm install -g n RUN n stable

El siguiente conjunto de líneas está configurado específicamente para NodeJS. Dado que queremos utilizar las funciones de ES6, necesitaremos la última versión de NodeJS obtenida a través del módulo de nodo n. Instale NodeJS y NPM con RUN apt-get install nodejs -y && apt-get install npm -y. Luego limpie npm para dejar paso a su nuso RUN npm cache clean -f. Instalar ncon RUN npm install -g n. Y finalmente, podemos ejecutar n(última versión de NodeJS) con RUN n stable.

NodeJS es para Javascript, pero si estuviera trabajando con otros lenguajes como Python, instalaría los programas que necesite para ejecutar su aplicación Python.

# setup working directory ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

La última parte Dockerfilees configurar el directorio de trabajo de la propia aplicación. ADD /App /Apptoma la Appcarpeta de nuestra máquina y la copia en el contenedor Docker. A continuación, WORKDIR /Appconfigura el directorio de trabajo de Docker /Apppara que todos los comandos que ejecute dentro de Docker se ejecuten en /App. Esto es necesario para npm installinstalarlo en el lugar correcto (también conocido como /Appcontenedor Docker).

Finalmente, instalamos RUN npm installnuestras dependencias NodeJS en nuestra máquina. Por último, expondremos explícitamente el puerto 8080 de nuestra imagen de Docker EXPOSE 8080para que el mundo exterior pueda acceder a nuestra aplicación. El mundo exterior incluye Internet y otros contenedores Docker que se ejecutan en la misma máquina.

Paso 2: el script de construcción

docker build -t kangzeroo .

Cree un nuevo archivo en el directorio raíz de su aplicación llamado build.sh. Este es un archivo de shell para construir nuestro contenedor Docker. Este build.sharchivo no es realmente necesario ya que podemos ejecutar este comando directamente en la terminal. Sin embargo, es muy bueno para simplificar el proceso.

Aquí está el desglose de esta línea: docker buildes el comando que le dice a Docker que cree una imagen. -t kangzerooestablece el nombre de etiqueta de la imagen de Docker en kangzeroo, al que podemos hacer referencia más adelante. Tenga en cuenta que para tener un nombre de etiqueta válido, debe estar en minúsculas y no tener espacios (use nombres en mayúsculas y minúsculas). Finalmente, .le dice a Docker dónde buscar lo Dockerfileque se necesita para la compilación ( .significa aquí).

Si se encuentra en una instancia EC2, podemos ejecutar bash build.shdesde el directorio raíz de nuestro proyecto. Esto iniciará el proceso de compilación de Docker a medida que avanza por los pasos en el Dockerfilearchivo. Esto puede llevar un tiempo ... al final debería verse así: (No se preocupe por los errores no críticos, como la dependencia opcional omitida en la siguiente captura de pantalla).

Ahora veamos si nuestra imagen ha sido creada. Escriba docker imagespara ver las imágenes que se están ejecutando actualmente en nuestra máquina. Debería ver un resultado como este:

Si queremos eliminar esta imagen, simplemente escriba docker rmi kangzeroo. Si docker imagesvuelve a escribir después de eliminar, verá que la imagen ya no está allí. Por ahora, dejemos la imagen porque la usaremos para construir el contenedor Docker para que se ejecute nuestra aplicación.

Paso 3: el script de ejecución

Now that our image has been created, let’s make run.sh. Recall that Docker Images are simply blueprints of environments that you want to create. Containers are the actual running and functional environments that your app will be executed in. So run.sh will turn our images into containers. Here is what run.sh looks like:

docker run -d -it -p 80:8080 --name=kz kangzeroo npm run ec2 -- --host=0.0.0.0

Let’s walkthrough this short script. docker run is the command to run a container from an image. -d -it is the command for daemon (running tasks in the background) and interactive terminal (giving us a way to interact with the container). If you omit -d then the docker container will not run in the background and you will see log output from the app. -p 80:8080 maps port 80 of our machine to port 8080 of the container. Recall that earlier we specified EXPOSE 8080 in our Dockerfile. So now we take incoming connections on our machine’s port 80 (port 80 is the default for http) and redirect them to our container’s port 8080. If your app is not a webpage, then you can exclude this port mapping.--name=kz gives our container the name kz. Finally, kangzeroo npm run ec2 refers to our image called kangzeroo and npm run ec2 is a command specific to this boilerplate app (for starting up the app). The last part — — host=0.0.0.0 sets the boilerplate to run on 0.0.0.0 instead of localhost (This too is specific to the boilerplate). If you were running a Python backend app, it would look like docker run -d -it --name=kz kangzeroo python app.py.

Great! Save this file and run it with bash run.sh. Then check if the container is running by typing docker ps -a. This is what it should look like:

Your app is now online and running inside a Docker container! Check if it works… for this boilerplate you can check from a web browser.

And it’s working! Great, now let’s turn off our Docker container. Type docker ps -a to see all the containers again. Type docker stop kz and it stops the container. If you type docker ps you will not see the container anymore, but you will see it if you type docker ps -a ( -a means all, inclusive of running and not running container. omit -a if you only want to see running containers). To remove the container, type docker rm kz. If you type docker ps -a you won’t see the container anymore.

Conclusion

¡Ese fue Docker! A fin de cuentas, Docker es mucho más fácil que configurar una máquina virtual basada en hipervisor, y puede ver cómo una arquitectura de microservicio se vuelve mucho más fácil de administrar cuando adopta contenedores. Con nuestros Dockerfile, build.shy los run.sharchivos creados en EC2, podemos resumir los 3 pasos para ejecutar acoplable de nuestro directorio raíz aplicación:

$ bash build.sh $ bash run.sh $ exit

¡Eso es! Docker: ¡tan fácil como construir, ejecutar y listo!

Hoja de referencia adicional

Dado que este tutorial adoptó un enfoque paso a paso para enseñar a Docker, creo que es apropiado dejarlo con una descripción general de todos los comandos de Docker que necesitará para uso de propósito general.

$ docker images // To view install images $ docker rmi  // To remove an installed image $ docker ps -a // To view all docker containers $ docker stop  // To stop a docker container $ docker rm  // To remove a docker container $ docker exec -it  bash // Execute into container and run bash * If you want to see the log output from a docker container, omit the -d from run.sh
Estos métodos se utilizaron parcialmente en el despliegue de renthero.ca