En este tutorial, vamos a echar un vistazo al historial de contenedorización, Docker, sus componentes y cómo comenzar a usarlo en nuestro trabajo diario. Pero antes de profundizar demasiado en el tutorial, echemos un vistazo a lo que es Docker para que podamos comprender qué es con lo que trabajaremos..
Docker es una plataforma abierta para construir, enviar y ejecutar aplicaciones distribuidas. Proporciona a los programadores, equipos de desarrollo e ingenieros de operaciones la caja de herramientas común que necesitan para aprovechar la naturaleza distribuida y en red de las aplicaciones modernas..
Como se indica en la definición formal de Docker anterior, ayuda a los desarrolladores o ingenieros de operaciones a automatizar el entorno de infraestructura que necesitan las aplicaciones..
Digamos que tiene una aplicación escrita en Node.js que utiliza Express para el servicio RESTful y MongoDB para la persistencia de datos. Hagámoslo más complejo y agregue varias instancias de Node.js y Nginx Load Balancer delante de las instancias de Node.js.
¿No sería mejor si escribo los pasos de instalación en un archivo de texto y permito que alguien instale el entorno completo para mí? Docker le ayuda a contener todos los componentes de la arquitectura (instancia de Node.js, servidor web Nginx, base de datos MongoDB, etc.) de manera muy sencilla.
Sin embargo, ¿qué es la contenedorización de todos modos? Echemos un vistazo a la historia de la tecnología de contenedorización..
El primer proyecto de contenedorización que puedo recordar es OpenVZ, que es una virtualización basada en contenedor para Linux lanzada por primera vez en 2005. OpenVZ le permite crear múltiples contenedores de Linux seguros y aislados para ejecutarlos en el mismo servidor físico sin ningún conflicto entre aplicaciones..
Al mismo tiempo, surgió otro proyecto de FreeBSD, llamado Jails. Esto le permite poner aplicaciones y servicios en una cárcel (podemos llamar a esto un contenedor) usando chroot.
Hubo otros proyectos como Solaris Containers, pero ¿por qué Docker se hizo popular a pesar de que todos los proyectos de contenedorización anteriores son ocho años más antiguos que Docker? Continúa leyendo para subir de nivel tus conocimientos de Docker.
Antes de explicar cómo funciona Docker, permítame explicarle cómo funcionan los contenedores. Un contenedor es algo relacionado con la virtualización a nivel de sistema operativo que nos permite crear múltiples espacios de usuarios aislados en lugar de uno solo. Este aislamiento se realiza mediante el uso de la chroot
.
La principal diferencia entre los contenedores y las máquinas virtuales es la siguiente. Cuando crea múltiples máquinas virtuales mediante VM, los sistemas operativos y los hardware virtualizados se duplican para cada invitado. Sin embargo, si crea varios contenedores, solo las carpetas relacionadas con la distribución del sistema operativo se crean desde cero, mientras que las partes relacionadas con el kernel de Linux se comparten entre contenedores. Puede ver la imagen de abajo para ver la diferencia de manera visual..
Como también puede ver en el esquema, si crea invitados de Ubuntu y Mint mediante VM, su sistema operativo invitado se duplicará incluso si utilizan el mismo kernel de Linux. En realidad, la distribución significa diferenciación de la contenedores y libs carpetas, y el kernel de Linux es el mismo.
Si observa la segunda imagen de arriba, verá que toda la arquitectura a nivel de sistema operativo se comparte entre contenedores, y solo la contenedores y libs Se crean desde cero para diferentes contenedores. Docker Engine tiene espacios de nombres, cgrupos
, y SELinux, y le ayuda a organizar contenedores. Si necesita información adicional sobre Docker Engine, puede consultar el sitio web de Docker.
Antes de continuar con la explicación de los componentes, puede instalar Docker en su computadora. Tiene pasos bastante básicos para instalar..
Docker tiene principalmente dos componentes: Docker Engine y Docker Hub. Docker Engine es para organizar contenedores, como dije anteriormente, y Docker Hub es un servicio SaaS para administrar y compartir pilas de aplicaciones. Por ejemplo, si desea utilizar Redis con Docker, puede arrastrarlo a su máquina local ejecutando el siguiente comando:
docker pull redis
Esto recuperará todas las capas de la imagen del contenedor y estará listo para ejecutarse en su entorno. Puedes echar un vistazo a Docker Hub para muchos repositorios..
Docker también tiene un sistema de archivos especial llamado AUFS (UNAdvanced Multi Layered Unificación File System). Con este sistema, cada cambio de compromiso se mantiene en capas, como el control de versiones. Si realiza un cambio en su imagen de Docker, se mantendrá como un compromiso diferente y no se reconstruirá completamente en la operación de compilación. Todas las otras capas están construidas antes.
Además, cuando tire de un repositorio a su computadora local, verá que la operación de búsqueda se realiza capa por capa. Digamos que ha realizado un cambio y prueba su nuevo contenedor, pero falla. No hay problema, puede revertir sus cambios y reconstruirlos como siempre lo hace en Git.
Suponiendo que Docker ya está instalado en su computadora, podemos comenzar con algunos comandos Docker muy interesantes.
docker pull ubuntu docker run -it ubuntu bash
Como puede adivinar, el comando anterior recuperará la imagen de Ubuntu de Docker Hub y la ejecutará, seguido del comando bash.
Verá que está dentro del contenedor después de ejecutar el comando anterior. Ahora se encuentra en el shell de Ubuntu y está libre de ejecutar comandos * nix. Puedes crear algo, borrar algo, ver procesos, etc..
Sin embargo, tenga cuidado porque cada vez que salga del contenedor, sus datos se perderán. ¿Por qué? Porque necesitas diseñar tus contenedores como inmutables..
Primero diseñe qué paquetes se incluirán, qué aplicaciones se clonarán en el contenedor, etc., y luego ejecute su contenedor. Cuando falla en algo, necesita poder cambiar la configuración y ejecutar nuevamente. Nunca mantengas estado en tus contenedores..
Para ejecutar el contenedor, puede utilizar el siguiente formato.
ventana acoplable ejecutar [OPCIONES] IMAGEN [: TAG | @DIGEST] [COMANDO] [ARG ...]
Hay muchos parámetros disponibles en Docker para la operación de ejecución. Puede consultar la documentación para todas las opciones, pero le daré un par de ejemplos para el uso de la vida real..
ventana acoplable -d redis
Este comando ejecutará una imagen de Redis en modo separado. Esto significa que todas las E / S se realizarán a través de la red o conexiones compartidas. Puede suponer que se está ejecutando en modo daemon. Hemos dicho Redis
aquí, pero puede especificar el autor y la etiqueta de la imagen también utilizando un comando como el que se encuentra a continuación.
ventana acoplable ejecutada -d huseyinbabal / mongodb: 1.0
Estamos ejecutando un mongodb
imagen que pertenece a Huseyinbabal
con versión específica 1.0
.
También puede ejecutar su imagen interactivamente de esta manera:
docker run -it huseyinbabal / ubuntu: 1.2 bash
Cuando ejecute el comando anterior, se ejecutará ubuntu 1.2
y luego ejecuta un golpetazo
comando para poner su prompt en la terminal dentro del contenedor.
Hemos ejecutado imágenes que se han extraído de Docker Hub Repository. ¿Qué hay de construir nuestra propia imagen? Podemos hacerlo usando el comando de compilación de Docker, pero necesitamos especificar un Dockerfile
para permitir que Docker ejecute cada sentencia definida dentro de Dockerfile.
DESDE ubuntu MAINTAINER Huseyin BABAL RUN apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list RUN apt-get update RUN apt-get -y install apt-utils RUN apt-get -y install mongodb-10gen RUN echo "some configs" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf"]
Esta es una definición muy sencilla de Dockerfile que nos ayudará a construir nuestra imagen. En esta definición de Dockerfile, en primer lugar, estamos diciendo que heredaremos todas las propiedades de la imagen de ubuntu. Esta imagen se buscará primero desde su servidor local. Si no se puede encontrar, se buscará en Docker Hub.
En la segunda línea, estamos definiendo el autor o mantenedor de la imagen. En los siguientes archivos, simplemente ejecutamos algunos comandos * nix con el comando RUN para instalar paquetes esenciales y paquetes relacionados con MongoDB. Para comenzar MongoDB, estamos escribiendo mongodb.conf
, y en el paso final estamos ejecutando el comando utilizando CMD
.
Para ejecutar nuestra imagen, debemos construir la imagen utilizando este Dockerfile. Puedes usar lo siguiente para construir la imagen.
docker build -t huseyinbabal / mongodb: 1.0 .
Simplemente, esto construirá una imagen con una etiqueta huseyinbabal / mongodb: 1.0
y usará Dockerfile en la carpeta actual (vea el punto al final del comando). Para probar si está creado o no, puede usar el siguiente comando.
imágenes docker
Esto mostrará una lista de todas las imágenes que existen en su computadora como a continuación.
Si desea ejecutar una imagen construida, simplemente puede ejecutar:
ventana acoplable ejecutada -d huseyinbabal / mongodb: 1.0
¡Pero espera! Este es el nodo daemon. Entonces, ¿cómo puedo entrar en este contenedor? Es muy simple. Primero, obtenga el nombre del nombre de los contenedores mongodb usando el siguiente comando.
docker ps
Verás una salida como la de abajo..
Puedes ver el nombre en la columna NOMBRES. Ahora es el momento de entrar en el contenedor con el siguiente comando.
docker exec -i -tgolpetazo
Puedes ver los procesos en ejecución dentro de este contenedor..
Como dije antes, si cierra el contenedor en ejecución, todos los datos relacionados con ese contenedor se perderán. Esto es normal en el mundo Docker..
Por ejemplo, en nuestro contenedor, MongoDB escribe todos los datos en una ruta especificada en mongodb.conf. Esta carpeta existe en el contenedor, y si cierra el contenedor, todos los datos se perderán. Si conserva los datos en una carpeta que se comparte en una computadora host que ejecuta Docker, puede usar la -v
opción dentro de la correr
mando. Por ejemplo:
ventana acoplable ejecutada -d -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Esto mapeará /host / mongo_db_path
que está en su máquina host para /container / mongo_data_path
que se encuentra en el contenedor. Siempre que mongo escriba datos en la ruta dentro del contenedor, se podrá acceder automáticamente dentro de la máquina host. Incluso si cierra el contenedor, los datos permanecerán en la ruta dentro de la máquina host.
Digamos que MongoDB se está ejecutando dentro del contenedor. Puede exponer el puerto MongoDB fuera del contenedor en el puerto 27017, y puede usar el siguiente comando para acceder desde fuera del contenedor con el puerto 5000.
ventana acoplable ejecutada -d -P 5000: 27017 -v / host / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0
Por lo tanto, puede conectarse a MongoDB dentro del contenedor desde el exterior utilizando el puerto 5000.
Digamos que necesita la información de red del contenedor especificado. Puedes agarrar ese detalle usando el inspeccionar
mando. Este comando imprimirá muchos metadatos sobre el contenedor.
es la parte que existe en ID DE CONTENEDOR
en el docker ps
salida. La salida de la inspección será en formato JSON. Para obtener la dirección IP del contenedor, puede utilizar:
Docker inspeccionar --format '.NetworkSettings.IPAddress'
Los comandos anteriores son los básicos mientras haces cosas de Docker. Si necesita aprender mucho sobre los comandos de Docker, consulte la documentación.
Es una buena práctica otorgar solo una responsabilidad a cada contenedor. Lo que quiero decir aquí es que no debe instalar las aplicaciones MongoDB y Spring Boot en un contenedor para servir las capas DB y Application en un contenedor. En lugar de eso, puedes poner una aplicación en un contenedor. Cada instancia de la aplicación, miembro de la base de datos, cola de mensajes, etc., debe indicar solo un contenedor.
Digamos que coloca las capas de la aplicación y la base de datos en un contenedor. Será muy difícil medir el rendimiento o los diagnósticos de la aplicación o la base de datos. De la misma manera, si desea escalar su aplicación, no podrá escalar ese contenedor, porque también hay una aplicación de base de datos instalada en ese contenedor..
Cuando ejecute su contenedor, nunca ssh en ese contenedor para actualizar o eliminar algo. La razón principal para usar Docker es mantener sus cambios en Dockerfile históricamente. Si desea cambiar algo, cambie Dockerfile, genere la imagen y ejecute el contenedor. Incluso si cambia algo dentro del contenedor manualmente, se eliminará si ese contenedor se vuelve a ejecutar.
Normalmente, es posible que desee escribir cada comando en líneas separadas como a continuación.
DESDE ubuntu MAINTAINER Huseyin BABAL RUN apt-get update RUN apt-get install -y build-essential RUN apt-get install -y php5 RUN apt-get install -y nginx CMD ["nginx", "g", "daemon off; "] EXPONER 80
Esto significa una capa para cada línea. No es una forma sugerida de construir Dockerfile. Puede separar sus comandos con una barra invertida (\) para cada grupo de trabajos, como se muestra a continuación:
DESDE ubuntu: 15.04 MANTENIMIENTO Huseyin BABAL RUN apt-get update \ -y build-essential -y php5 \ -y nginx = 1.7.9 \ apt-get clean CMD ["nginx", "g", "daemon off;"] Exponer 80
En el Dockerfile anterior, hemos planeado instalar los paquetes necesarios en una línea y realizar una limpiar
Operación para limpiar el medio ambiente. Al hacer esto, no creamos capas separadas para cada comando.
Construir y manejar un contenedor es algo muy fácil. ¡Después de dos meses, puede terminar con 50 contenedores para la arquitectura de su aplicación! Será muy difícil encontrar la causa raíz de un problema si se produce algún error en sus contenedores.
La manera fácil de manejar esto es registrar sus actividades de contenedor en un sistema de registro central. Por ejemplo, redirija sus registros de la salida estándar a un archivo de registro dentro de cada contenedor. Y un agente puede transmitir esos contenidos de registro a un sistema de administración de registro central como ELK o Splunk. Si envía datos específicos del contenedor dentro de los registros, por ejemplo, la identificación del contenedor, será muy fácil filtrar los errores en el panel de administración de registros.
Es posible que desee controlar el contenedor en sí. Esta vez, puedes echar un vistazo a Google cadvisor. Esto le permite controlar su contenedor a través de un servicio REST. Por ejemplo, para ver la información del contenedor, puede hacer una solicitud GET para http: // nombre_host
/api/v1.0/containers/
.
Si aplica procedimientos estándar a su ciclo de vida del contenedor, será muy fácil controlar su arquitectura general. Por ejemplo, puede crear un contenedor base para heredar algunas operaciones dentro de otros contenedores. Por otro lado, puede usar ubicaciones estándar para archivos de configuración, archivos de registro y archivos de origen. Tenga cuidado al usar un Dockerfile separado para cada contenedor. Finalmente, aplique el control de versiones a todos sus contenedores para separar las funciones y use diferentes versiones de acuerdo a sus necesidades.
La seguridad es un tema muy importante en el caso de los contenedores. Siempre ejecute sus contenedores en modo no privilegiado. Le sugiero que utilice Apparmor para proteger su contenedor de subprocesos externos, incluso ataques de día cero. También sugiero SELinux para que sus contenedores apliquen políticas de seguridad de control de acceso de acuerdo con sus necesidades. Además, manténgase al día con las actualizaciones de las imágenes que utiliza dentro de los contenedores para aplicar los últimos parches al contenedor. Mientras hace esto, no olvide fijar su imagen a una versión estable..
Modulus es una plataforma de implementación y orquestación empresarial totalmente compatible. Primero comenzaron con un PaaS centrado en Node.js sobre LXC, y luego decidieron cambiarse a Docker, y esto les permitió admitir más idiomas diferentes de Node.js, es decir, PHP, Java, Python y proyectos estáticos.
Lo que quiero decir con el soporte de idiomas aquí es que puede implementar su aplicación escrita en los idiomas anteriores en Módulo con un solo comando con propiedades predefinidas. Digamos que implementará una aplicación Node.js en Módulo, y lo único que debe hacer es ejecutar módulo de despliegue
dentro de la carpeta raíz de su proyecto. El módulo consta de los siguientes componentes.
Modulus CLI es para la operación de implementación para su aplicación desde la línea de comandos y se puede instalar simplemente con npm install -g modulus
. Puede crear proyectos, implementar proyectos, transmitir registros y realizar algunas operaciones relacionadas con la base de datos con Modulus CLI. Alternativamente, puede implementar su proyecto cargando a través del panel de administración.
Puede crear e implementar su aplicación con un par de pasos simples. Puede seleccionar el idioma, el tamaño del servo y la ubicación. Entonces prepárate para desplegar tu proyecto.
Alternativamente, puede crear un proyecto en la línea de comando con módulo de proyecto crear
y entonces módulo de despliegue
.
Es posible que desee almacenar algunos datos dentro de su aplicación. Módulo también le permite agregar una base de datos a su aplicación. MongoDB se utiliza detrás de las escenas. Puede ir y crear una base de datos dentro del panel de control, y también puede crear una base de datos en la línea de comandos. Puedes ver la pantalla de la base de datos a continuación..
Puede tomar la URL de la base de datos en la pantalla de detalles y utilizarla en sus aplicaciones.
Puede seguir los registros de aplicaciones desde la línea de comandos con registros de módulo cola
, o puede transmitir los registros en el panel como se muestra a continuación.
Cuando haces clic en el CORRIENTE Botón, puedes ver los registros en tiempo real..
Esos son los componentes principales del módulo. Puedes echar un vistazo a otros componentes como Métrica, Autoescalado, Addons, Notificaciones, y Administración en el panel de módulo.
Hemos discutido los contenedores y dado una breve historia. En comparación con las máquinas virtuales, Docker tiene muchas alternativas para administrar la infraestructura de su aplicación..
Si está utilizando Docker para su arquitectura, debe tener cuidado con algunos conceptos, como Responsabilidad única, Servidores inmutables, Seguridad, Monitoreo de aplicaciones y contenedores.
Cuando tu sistema crezca, será muy fácil de controlar. Modulus es una de las empresas que utiliza Docker para su sistema PaaS. Al utilizar el poder de Docker, Modulus ha diseñado un gran sistema para ayudar a las personas a implementar sus aplicaciones escritas en Node.js, PHP, Java y Python con mucha facilidad..