Introducción
Antes de empezar con la instalación de Docker en Linux , si no sabemos de que va seria bueno echarle un ojo a esta introducción rápida.
¿Que es docker?
Es un software de TI, es una tecnología de creación de contenedores para nuestras aplicaciones, proporcionando una capa de abstracción en múltiples sistemas operativos.
Utilizando características de aislamiento de recursos del kernel linux, permitiendo así que los contenedores se ejecuten independientemente dentro de una sola instancia de linux evitando así la sobrecarga de iniciar y mantener maquinas virtuales.
Cambio ideológico
Para tener una infraestructura de sistema optima usando docker, debemos cambiar un poco el pensamiento a como se vienen haciendo las cosas de manera tradicional.
Debemos crear contenedores no por plataforma sino por servicio, Cada servicio debe ser autónomo y estar aislado del entorno de los otros, permitiéndole la comunicación únicamente ya sea creando un enlace entre ellos o usando mensajes a través de la red. Esto tiene total sentido si nos ponemos a analizar la industria actual donde prácticamente todo tiene un “As A Service”.
Bases de datos, herramientas de análisis, plataformas para continuous integration (integración continua), etc. Inclusive la forma en que se construyen algunas aplicaciones/plataformas siguen este tipo de arquitectura orientada a servicios o microservicios.
Estamos ante la “nueva” tendencia en la construcción de plataformas donde todo se encuentre dentro de contenedores. Todos como servicios independientes los cuales por separado brindan una funcionalidad específica y en conjunto forman una plataforma robusta, escalable y fácil de mantener.
¿En que me ayuda usar contenedores docker?
- Mediante el uso de contenedores, los recursos pueden ser aislados, los servicios restringidos, y se otorga a los procesos la capacidad de tener una visión casi completamente privada del sistema operativo con su propio identificador de espacio de proceso, la estructura del sistema de archivos y las interfaces de red.
- Contenedores múltiples comparten el mismo núcleo, pero cada contenedor puede ser restringido a utilizar solo una cantidad definida de recursos como CPU, memoria y E / S.
- La flexibilidad para empaquetar nuestras aplicaciones en un entorno a medida solo con las dependencias necesarias. Dándonos una portabilidad para ejecutar nuestra aplicación de manera rápida ya sea en las instalaciones físicas, la nube pública, nube privada, etc.»
- Separar nuestros servicios en entornos distintos ejemplo: Podemos separar nuestra aplicación como un servicio independiente interconectado por una red sin acceso a internet a otro servicio que pudiese ser nuestra base de datos, dándonos mayor seguridad en caso de que algo le suceda al contenedor de nuestra aplicación, nuestra base de datos estaría aislada del entorno de nuestra aplicación en un caso de riesgo.
- Si un contenedor es atacado o infectado con malware, solo basta con destruirlo, es menos probable que nuestro host u otros contenedores sean dañados o infectados debido a la abstracción.
Imágenes
Las imagenes Docker son plantillas (que incluyen una aplicación, los binarios y las librerías necesarias) que se utilizan para construir contenedores docker y ejecutarlos (los contenedores ejecutarán una imagen previamente compilada).
También podemos decir que las imágenes docker son instancias de un contenedor, un contenedor se inicia ejecutando una imagen.
Dockerfile
El archivo Dockerfile define una imagen, y por tanto cómo será el contenedor que se creará a partir de esa imagen.
Y ese Dockerfile (que es un documento de texto) contiene todos los comandos que normalmente se ejecutan manualmente para construir una imagen para docker.
Docker puede leer las instrucciones de el archivo Dockerfile y construir una imagen para docker automáticamente.
Network
Ya sabemos que podemos crear redes aisladas que no se comuniquen con internet. Donde podemos decidir según nuestras necesidades donde agrupar nuestros contenedores para que se comuniquen entre ellos internamente en nuestro host.
Pudiendo crear redes tanto de uso interno como de uso externo, en estas ultimas exponemos los contenedores con algun proxy hacia internet o mediante la exposición del puerto del contenedor en caso de que el contenedor ya posea un proxy.
Modo Bridge (puente)
Este es el modo de trabajo predeterminado, permite ejecutar múltiples contenedores en el mismo host sin ninguna asignación de puerto dinámico.
Por lo tanto, el modo BRIDGE evita el conflicto de puertos y es seguro ya que cada contenedor está ejecutando su propio espacio de nombres de red privada.
Modo host
Utiliza el espacio de nombres de la red del host, no es necesaria una configuración especial, pero puede provocar problemas de seguridad.
Un contenedor en modo host se expone directamente por algun puerto que especifiquemos de nuestro host.
Por ejemplo:
El contenedor del proxy inverso traefik funciona en modo host directamente y nos ayuda a exponer otros contenedores por los puertos http y https de nuestro host sin que halla conflicto de puertos.
Modo de contenedor mapeado
Este modo esencialmente asigna un nuevo contenedor a una pila de red de contenedores existente.
Esto implica que los recursos de red como la dirección IP y las asignaciones de puertos del primer contenedor serán compartidos por el segundo contenedor.
Volúmenes
Cuando creamos un contenedor de Docker, al tratarse de ejecuciones no persistentes, tenemos el problema de donde almacenamos los datos.
Imaginemos que queremos montar una base de datos, pero cada vez que paramos el contenedor perdemos todos los datos almacenados, pues bien. Una de las formas que tenemos de solucionar ese problema es a través de los volúmenes de datos.
¿Qué es un volumen de datos (Data Volume)?
Un volumen de datos es una carpeta física en nuestro equipos donde se almacenan datos del contenedor, estos volúmenes se especifican en el fichero Dockerfile.
Podemos ver por ejemplo en el fichero Dockerfile de la imagen de mariadb. Aquí podemos ver como crea un volumen en /var/lib/mysql
a través de la sentencia VOLUME /var/lib/mysql
.
Esto significa que el contenido de la carpeta de /var/lib/mysql se encontrará dentro del sistema anfitrión como un volumen.
Tenemos un articulo donde hablamos sobre la administración de datos en docker
Docker compose
Docker Compose es una herramienta que permite simplificar el uso de Docker.
Generando scripts que facilitan el diseño y la construcción de servicios o de aplicaciones con múltiples componentes. Aquí resumimos algunos tips:
Con compose puedes crear diferentes contenedores y al mismo tiempo, en cada contenedor, diferentes servicios, unirlos a un volúmen común, iniciarlos y apagarlos, etc.
Es un componente fundamental para poder construir aplicaciones y microservicios.
En vez de utilizar una serie de comandos bash y scripts, Compose implementa recetas en YAML, para poder instruir al engine a realizar tareas, programaticamente.
Instalación de Docker y Docker Compose
Arch
$ sudo pacman -Sy docker
$ sudo systemctl enable --now docker
Alpine
$ apk add docker
$ rc-update add docker boot
$ service docker start
Centos
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
Debian
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
Fedora
$ sudo dnf -y install dnf-plugins-core
$ sudo dnf config-manager \
--add-repo \
https://download.docker.com/linux/fedora/docker-ce.repo
$ sudo dnf install docker-ce docker-ce-cli containerd.io
#Excepción de Cgroups Para Fedora 31, deberá habilitar la compatibilidad con versiones anteriores de Cgroups
$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
$ sudo systemctl enable --now docker
Open SUSE
Ya tenemos un articulo sobre la instalación de docker en Linux Open SUSE en el blog.
Ubuntu
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
Post-instalacion
Creando y agregando al grupo docker para usar docker sin root o sudo.
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker
Instalación de Docker-Compose en Linux
Para la instalación de docker compose en alpine linux sera necesario instalar algunas dependencias, los demás sistemas están exentos.
#alpine dependencias
$ apk add python3-dev libffi-dev openssl-dev gcc libc-dev make py-pip
$ pip install docker-compose
Otros sistemas
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
#si al ejecutar el comando docker-compose -v falla lo cual dificulto hacemos un enlace
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Experiencia personal
La experiencia obtenida hasta ahora trabajando con contenedores ha sido muy fructífera y emocionante, la flexibilidad y rapidez de los despliegues es una maravilla.
Este blog de wordpress esta corriendo en un contenedor docker como un servicio independiente y su base de datos también.
En este mismo server para uso domestico también tenemos un servidor de correos e incluso un servidor de Jitsi.
Este articulo es una recopilación abajo dejare los enlaces referentes, también dejare otros artículos relacionados a Docker que nos servirán para tener un modesto servidor ágil y versátil.
Artículos relacionados
- https://blog.saiyans.com.ve/administracion-tecnologias/traefik-proxy-docker-con-ssl/
- https://blog.saiyans.com.ve/administracion-tecnologias/servidor-de-correos-con-docker/
- https://blog.saiyans.com.ve/administracion-tecnologias/jitsi-meet-en-docker-con-traefik/
- https://blog.saiyans.com.ve/administracion-tecnologias/netdata-monitor-en-docker-con-traefik-1-7/
Referencias
- https://platzi.com/blog/contenedores-como-servicio/
- https://docs.docker.com/install
- https://riptutorial.com/es/docker/example/29778/modo-de-puente–modo-de-host-y-modo-de-contenedor-asignado
- https://eltallerdelbit.com/imagenes-docker/
- https://dockertips.com/utilizando-docker-compose
- https://moidev.com/posts/docker-volumenes-de-datos/
- https://wiki.archlinux.org/index.php/docker
- https://wiki.alpinelinux.org/wiki/Docker
- https://es.wikipedia.org/wiki/Docker_(software)
Administrador de sistemas, un curioso amante de las tecnologías.