Mostrando entradas con la etiqueta Docker. Mostrar todas las entradas
Mostrando entradas con la etiqueta Docker. Mostrar todas las entradas

jueves, 18 de junio de 2020

Instalar Openshift Origin en Ubuntu

¿Que es Openshift?

A grandes rasgos podría decirse que es el Kubernetes de Red Hat, aunque en realidad Kubernetes es parte de Openshift, y Red Hat lo que hace es introducirle mejoras y comercializarlo. Con lo cual quizás podríamos decir que es un "Kubernetes con esteroides", y pago (la versión comercial).

¿Que es Kubernetes? Lo explico acá.

Ahora, ¿que es Openshift Origin?
RedHat suele tener dos versiones de sus productos, la versión de la comunidad, que es gratuita y sin soporte, salvo el soporte que uno puede conseguir en la comunidad obviamente, y la versión de pago.
Openshift Origin es la versión gratuita de código abierto de Openshift.
También existe Minishift, que seria el equivalente a Minikube de Kubernetes (son versiones para ser instaladas en una única máquina para probar el producto de forma fácil).

Dicho esto, pasemos a lo importante.
Para instalar Openshift Origin primero tenemos que tener funcionando Docker en nuestra maquina.

Instalar Docker:

Importamos la clave GPG de Docker:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Agregamos el repo:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

Actualizamos el sistema e instalamos:

sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli

Agregamos nuestro usuario al grupo de Docker:

sudo usermod -aG docker ardillasenlared

Instalar Openshift Origin:

Descargamos el archivo con el software:

wget https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit.tar.gz

Lo descomprimimos:

tar xvzf openshift*.tar.gz

Ingresamos a la carpeta de Openshift recién creada:

cd openshift-origin-client-tools*/

Movemos los binarios oc y kubectl a /usr/local/bin:

sudo mv  oc kubectl  /usr/local/bin/

Verificamos la versión:

oc version

Habilitamos que pueda usar registries inseguros:

cat << EOF | sudo tee /etc/docker/daemon.json
{
    "insecure-registries" : [ "172.30.0.0/16" ]
}
EOF

Reiniciamos el servicio de Docker:

sudo service docker restart

Iniciamos el cluster en el servidor:

oc cluster up

Bajamos el cluster:

oc cluster down

Configuramos para que Openshift no redirija constantemente a 127.0.0.1.
Para ello, abrimos el archivo de configuración con el comando:

sudo nano ./openshift.local.clusterup/openshift-controller-manager/openshift-master.kubeconfig

Y cambiamos:

server: https://127.0.0.1:8443

Por:

server: https://SERVER_IP:8443

Guardamos y levantamos nuevamente el cluster pero esta vez especificando la IP:

oc cluster up --public-hostname=SERVER_IP



viernes, 5 de junio de 2020

Crear Volumen Persistente en Docker

¿Como dice el dicho? ¿Lo bueno, si breve, dos veces bueno?
Vamos con algo breve entonces... pero 2 veces bueno ¬¬

Iniciar contenedor con volumen persistente:

sudo docker run --name VirtualArdillasConVolumen00 -v ~/DatosArdillasLocal:/DatosArdillasContenedor -it ubuntu:latest /bin/bash

--name es para elegir el nombre del contenedor (en este caso VirtualArdillasConVolumen)

-v para elegir el volumen persistente que vamos a montar

~/DatosArdillasLocal es la ruta local de la maquina donde va a crear el volumen con la información persistente (en mi caso /home/ardillasenlared/DatosArdillasLocal)

DatosArdillasContenedor es el volumen del contenedor donde guarda la información que quedará almacenada localmente

ubuntu:latest es la imagen de Docker Hub a partir de la cual se va a generar el contenedor

/bin/bash es para que arranque el contenedor con una shell bash 

Ingresamos al volumen y creamos 3 archivos:

cd DatosArdillasContenedor/

touch Ardillas00 Ardillas01 Ardillas02

ls

Ahora salimos del contenedor:

exit

Lo eliminamos:

sudo docker rm iddelcontendor (podemos ver el ID haciendo sudo docker ps -a)


Y volvemos a generar otro contenedor con otro nombre pero con el mismo volumen para ver si siguen estando los archivos:

sudo docker run --name VirtualArdillasConVolumen01 -v ~/DatosArdillasLocal:/DatosArdillasContenedor -it ubuntu:latest /bin/bash

Ingresamos al volumen:

cd DatosArdillasContenedor/

Y listamos los archivos a ver si están:

ls

Vemos que están. Para probar creamos uno mas:

touch Ardillas03

Salimos de nuevo del contenedor:

exit

Lo borramos:

docker rm iddelcontendor

Y ahora verificamos en nuestra maquina local si están los archivos (los del primer contenedor mas los del segundo):

cd DatosArdillasLocal/

ls

Y vemos que nos figuran todos.

Excelente, ¿no?

Antes de irme no quiero dejar de recomendarles estos 4 posts históricos del blog:

Instalar y configurar FTP en Debian con ProFTPd

Instalar y configurar proxy Squid en Debian y Ubuntu

Quitar bloqueo automático de pantalla en Ubuntu

Sincronizar la hora en Manjaro Linux Ascella

Nada mas.

COMPARTI, ¿que te cuesta?

Arrivederci (?)

jueves, 4 de junio de 2020

DockerFile: Crear imagen personalizada con Docker

La otra vez veíamos en este impresionante post, como descargar una imagen, crear un contenedor, modificarlo y luego subir la imagen a Docker Hub para poder descargarla desde cualquier maquina del planeta tierra, y desde otras galaxias también (siempre que tengan el motor de Docker instalado).

Bueno, mucha gente me paró por la calle y me dijo "¿hay alguna forma de automatizar todo esto de manera que sean solo 2 clicks?". A lo que yo respondí: "No uso mouse, no hago clicks... y para tener tu contenedor con todo listo, solo tenes que ejecutar este comando":

sudo docker run --name VirtualArdillas -it ardillasenlared/ubuntu:ardillas /bin/bash

- Con esto te bajas la imagen de Ubuntu que subí la otra vez a Docker Hub y ya tenes todo listo para usar, no necesitas DockerFile, ¿para que lo queres? ¬¬
- Bueno, perdón que te contradiga, o mejor dicho, que me contradiga, pero si quiero personalizar esa imagen que está subida voy a tardar mas tiempo, porque esa imagen solo me sirve si busco lo que ya tiene instalado, de lo contrario una imagen a partir de un DockerFile seria mas útil.
- ¿Por que? ¿Que es DockerFile?.
- Dockerfile es un documento de texto que contiene todos los comandos que un usuario quiere ejecutar para crear una imagen. Docker puede construir imágenes automáticamente leyendo las instrucciones de Dockerfile. Usando docker build los usuarios pueden crear una compilación automatizada que ejecuta varios comandos y que nos sirve para instalar programas y/o realizar configuraciones que formaran parte de una imagen de manera simple y rápida.
- Que bien, ganaste. Me convenciste con eso del Docker Fail.
- DockerFile.
- Eso, y aprende a pronunciar.

En este DockerFile vamos a hacer lo mismo que la otra vez pero a partir de un archivo, repasemos:

1. Actualizar los repos:

apt-get update

También hicimos una actualización del sistema operativo con apt-get upgrade pero en este caso tenemos que evitar el RUN apt-get upgrade y dist-upgrade ya que hay muchos paquetes que pueden no actualizarse dentro de un contenedor sin privilegios. Podemos ejecutarlo manualmente luego.

2. Crear el usuario ardillasenlared

adduser ardillasenlared

3. Instalar nano, sudo, iputils-ping, net-tools, ssh:

apt-get install nano
apt-get install sudo
apt-get install iputils-ping
apt-get install net-tools
apt-get install ssh
apt-get install nmap (este en realidad no estaba, pero va de yapa)

4. Dar permisos de sudo al usuario ardillasenlared:

En el post hicimos esto:

nano /etc/sudoers

Y agregar lo siguiente:

ardillasenlared ALL=(ALL:ALL) ALL

Pero en el Dockerfile vamos a agregarlo al grupo sudo, el resultado es el mismo.

5. Y por ultimo corregir el error:

sudo: setrlimit(RLIMIT_CORE): Operation not permitted

Para ello teníamos que crear el archivo /etc/sudo.conf con la siguiente linea:

Set disable_coredump false

¿Como hacemos todo esto con un DockerFile? Así:

#Bajar la imagen base de Ubuntu 20.04
FROM ubuntu:20.04

#Actualizar repos e instalar iputils-ping, net-tools, ssh y nmap
RUN apt-get update && \
      apt-get -y install sudo nano iputils-ping net-tools ssh nmap

#Crear el usuario ardillasenlared con contraseña password y agregarlo a sudoers
RUN useradd -m ardillasenlared && echo "ardillasenlared:password" | chpasswd && adduser ardillasenlared sudo

#Crear archivo sudo.conf con la linea Set disable_coredump false para que no aparezca el error
RUN touch /etc/sudo.conf && echo "Set disable_coredump false" > /etc/sudo.conf

#Iniciar shell bash al levantar le contenedor con el usuario ardillasenlared
USER ardillasenlared
CMD /bin/bash


A la hora de crear nuestro Dockerfile siempre tenemos que tener en cuenta que su ejecución no tiene interacción, con lo cual tenemos que armarlo de manera que no tengamos que hacer absolutamente nada (por ejemplo, cuando hace un apt-get install programa siempre te pregunta si queres instalar las dependencias y demás, con el parametro "-y" le estamos diciendo que le diga que si a todo sin preguntar).

Una vez creado el archivo con ese código, pasamos a crear la imagen con todo lo que definimos en el Dockerfile. Para eso ejecutamos:

sudo docker build -t ubuntuardillas:1.0 . (hay un punto al final)


Si hacemos un sudo docker images vamos a ver una nueva llamada ubuntuardillas.

Luego levantamos un contenedor a partir de la imagen recién creada:

sudo docker run --name ardillas1.0 -it ubuntuardillas:1.0


Vemos que directamente nos da una shell de bash, como configuramos en el Dockerfile, y ademas nos loguea con el usuario ardillasenlared creado en el mismo procedimiento.

Vamos a probar un ping, nmap y luego a instalar algo con sudo:


Cuando me solicita la contraseña de sudo ingreso password que es la que configuramos en el Dockerfile.
Vemos que todo responde según lo esperado, y que el nmap a 192.168.2.106 nos indica que el puerto 22 esta abierto, entonces aprovecho y pruebo el ssh contra esa virtual:


Y vemos que tiene ssh instalado también.

En caso de querer cambiar la contraseña del usuario ardillasenlared tenes que ejecutar:

passwd ardillasenlared


Te va a solicitar primero la contraseña actual (password) y luego una nueva.

Para crear otro usuario podes seguir los siguientes pasos.

Con esto ya creamos nuestra imagen personalizada a partir de lo que definimos en el archivo Dockerfile.

Espero que le haya servido!

COMPARTAN, dejen de guardarse el conocimiento para uds, no sean egoístas!

Bye!

miércoles, 3 de junio de 2020

Subir imagen de Docker a Docker Hub

Recién buscaba como instalar Ubuntu con Docker (mas precisamente, como crear un contenedor con Ubuntu 20.04 a partir de una imagen de Docker Oficial), y la mayoría de los resultados me decía como instalar Docker en Ubuntu. Así que, si buscabas lo mismo que yo, este es el lugar.

¿Para que nos puede servir tener un contenedor con Ubuntu? Para un millón de cosas, pero por ejemplo, en un entorno de pruebas, en lugar de crear 2 o 3 máquinas virtuales con VirtualBox y Ubuntu podríamos simplemente crear 2 o 3 contenedores con dicho sistema operativo, algo que sería muchísimo mas rápido y práctico. Y yendo un poco mas lejos, podríamos tener una imagen de Ubuntu con todo lo necesario para que solamente tengamos que descargarla, levantar el contenedor y ya tendríamos todo a disposición. Esto es lo que vamos a hacer en este post.

Primero vamos al Docker Hub y buscamos la imagen Oficial de Ubuntu.
En este caso vamos a instalar la ultima (que es la 20.04) con el siguiente comando:

sudo docker pull ubuntu:latest

Si quisieramos otra versión podríamos revisar las etiquetas  y ver que por ejemplo para instalar la 19.10 deberíamos usar docker pull ubuntu:19.10 o si quisieramos la Bionic que es la 18.04 deberíamos ejecutar docker pull ubuntu:bionic.

Luego de ejecutar el comando aguardamos unos minutos dependiendo nuestra conexión y quedará descargada:


Para chequear:

sudo docker images


Ahora vamos a levantar un contenedor a partir de dicha imagen, llamado VirtualUbuntu00 y al mismo tiempo vamos a iniciar una shell de bash en el contenedor:

sudo docker run --name VirtualUbuntu00 -it ubuntu:latest /bin/bash

Vamos a verificar la versión del Kernel del mismo con:

uname -a


lunes, 1 de junio de 2020

Instalar Kubernetes en Azure

Bueno vamos a probar Kubernetes en Azure, así de una, sin vueltas, sin caretearla (?).
Para empezar ingresamos al Portal de Azure con nuestras credenciales y en "Inicio" a la izquierda vamos a ver los servicios que nos ofrece Azure para desplegar.
Uno de ellos es "Servicios de Kubernetes", clickeamos ahí:


Luego vamos a crear nuestro primer cluster haciendo click en "Agregar" o "Crear Servicio de Kubernetes":


Elegimos nuestra suscripción, creamos un nuevo grupo de recursos o resource group, elegimos el nombre del cluster y la región. Y mas abajo elegimos el tamaño del nodo y la cantidad, este paso es muy importante, porque al definir el tamaño del nodo básicamente estamos eligiendo las especificaciones técnicas (cpu, memoria, disco) que van a tener las maquinas virtuales que van a formar los nodos del cluster y esto no se podrá cambiar después de crearlo. El numero de nodos si se puede cambiar.
En mi caso elijo la maquina virtual mas barata que es la DS2 v2, que tiene un 2 CPU y 7GB de RAM.



Fijense que a la derecha aparecen los precios de las virtuales (Costo Mensual Estimado):



sábado, 30 de mayo de 2020

Rollback de Deployments y Namespace en Kubernetes

Hola Ardillas, para estos posts largos prefiero ir directamente al asunto y evitar chistes como el del hacker, así que arranquemos.

Para los que no quieren leer todo (aunque lo recomiendo) podríamos dividir el post en 3 grandes títulos que voy a marcarlos en mayúscula, azul y subrayado así TITULO
Los títulos son:
CREAR NAMESPACE
CREAR DEPLOYMENT
ROLLBACK DE UN DEPLOYMENT

Antes de avanzar con el post de rollback de un deployment en si vamos a ver que tengo corriendo actualmente en mi cluster de Kubernetes:

Para ver un listado de lo que tenemos corriendo en el cluster:

kubectl get all


Fijense que diferencia los PODs, de los servicios, de los deployments y las replicas.

Ver detalle de todos los PODs en el namespaces actual:

kubectl get pods -o wide


Ver detalle de todos los PODs en todos los namespaces:

kubectl get pods --all-namespaces  


En este caso vemos los mismos ya que tengo solo un namespace (los otros que aparecen son del sistema).

Ver cantidad de replicas:

kubectl get rs


Ver historial de cambios de un deployment:

kubectl rollout history deployment/nombredeldeploy



lunes, 25 de mayo de 2020

Kubernetes para principiantes

Bueno, ya vimos Ansible, ya vimos Docker y ahora vamos con Kubernetes.
No, hoy no te voy a hacer el chiste del hacker, aunque si, me sigue causando gracia.
Hoy vamos al grano, porque es un post largo que creo que les va a resultar útil.

Kubernetes (K8s) es un proyecto open source que nació en Google y sirve para orquestar contenedores (Docker), aunque no nos permite crear imágenes, ni subirlas al registry, solo sirve para gestionarlos. Es un buen complemento, sino el ideal, de Docker (motor de contenedores) para los entornos de producción grandes en donde Docker solo, no puede escalar.
Distribuye de la mejor forma posible la carga de todos los NODOS.

POD: La unidad mas chica en Kubernetes es un POD, que agrupa dentro suyo diferentes contenedores (en general uno solo) que tienen un componente (kubelet) "que le avisa" al NODO MASTER si la aplicación se encuentra o no corriendo. Y si no esta corriendo entonces Kubernetes levanta una nueva para mantener la cantidad de replicas que configuramos para que se encuentren corriendo. Estas instancias se levantan en base a una imagen, como los containers de Docker.
Los PODs por definición son stateless, y Kubernetes los crea o destruye de manera constante en función de las necesidades. Si los PODs deben tener datos persistentes, deben utilizarse volúmenes.
Los containers levantados en el mismo POD comparten el stack de red y pueden hablar entre si, así como también pueden compartir un volumen y acceder a la misma información. Cada POD tiene su propia direccion IP.
La desventaja de que los containers dentro del POD compartan el stack de red es que no podes tener 2 containers adentro del mismo POD escuchando en el mismo puerto, porque al tener la misma red hay colisión de puertos, pero esto se resuelve poniendo esos 2 containers en PODs diferentes.

NODO: Un NODO conjunto de PODs.

NODO MASTER: Se encargan de coordinar el clúster. Tiene que haber mínimo uno por cluster. Generalmente no ejecutan contenedores, sino que deciden en qué nodo se ejecuta cada contenedor. Usualmente son 3 nodos para alta disponibilidad. Esto es debido a etcd, que guarda el estado global del clúster y su información es crítica. Si hay 3 nodos de etcd y se pierde uno, el sistema puede seguir funcionando, ya que los dos nodos restantes pueden seguir verificándose el uno al otro. Pero ya no se puede perder ningún otro. Por eso, los nodos de etcd se escalan siempre de dos en dos, si hay 3 se puede perder 1, si hay 5 se pueden perder 2 y así sucesivamente.

El NODO MASTER ejecuta los siguientes procesos:
- kube-apiserver que es la forma en la que interactuamos con los otros NODOS del cluster.
- Kubernetes Controller (kube-controller) que compara el estado actual del cluster con el estado que debería tener (chequea por ejemplo si la cantidad de PODs que hay en un NODO es la que debería haber, y sino los levanta).
- Kubernetes Scheduler (kube-scheduler) que es el que se encarga de escuchar al controller y cuando el controller le avisa que le faltan PODs, el scheduler se fija en que NODO pueden estar mejor ubicados y los levanta ahí.
- etcd que es una base de datos que se utiliza para mantener la configuración global del clúster. La información contenida en etcd es crítica y debe tenerse siempre un plan de copias de seguridad.

NODO MINION (WORKERS): Se encargan de la ejecución de los contenedores desplegados en el clúster. Tienen instalado el agente de Kubernetes llamado kubelet (que se encarga de monitorizar que un contenedor se inicie, funcione correctamente y en caso de error, reiniciarlo inmediatamente) y un kube-proxy, que gestiona la red virtual y las IPs virtuales que de cada contenedor.

CLUSTER: Es un conjunto de NODOS.
Entre sus principales funciones se encuentran:
. Permite Escalar
. Permite balanceo de carga
. Reparación automática del contenedor (si falla o muere, el cluster automáticamente levanta uno nuevo)
. Distribución inteligente de la carga de trabajo
. Permite almacenamiento persistente en la nube
. Optimiza nuestros recursos
Para entornos de Workstation se puede usar Minikube .

SERVICES: Los PODs no son visibles más allá de su propio contenedor. Para solucionar esto, existen los services, que son objetos que permiten reenviar tráfico de red a un conjunto de PODs, lo cual nos permite acceder a nuestras aplicaciones. Los services utilizan servidores DNS instalados en la red para registrarse en esta y permitir el acceso por nombres de servicio a sus PODs, facilitando el descubrimiento de los mismos.

VOLUMENES PERSISTENTES: Es una pieza de almacenamiento en el cluster que sirve para guardar los datos de nuestros PODs. Su ciclo de vida es independiente de los PODs individuales.

LABELS/SELECTORS: Los selectors son filtros de las etiquetas. Las labels son muy útiles cuando por ejemplo manejamos 500 contenedores que hacen de webserver y cuya etiqueta es webserver, entonces, si queremos eliminarlos a todos ponemos que borre todo lo que tenga esa etiqueta en lugar de borrar uno por uno.

En Kubernetes, podemos exponer nuestras aplicaciones de varias maneras:
ClusterIP, es el servicio que se genera de forma predeterminada y nos permite acceder a los servicios dentro del clúster. Este servicio no es accesible desde Internet, para que lo sea necesitaríamos habilitar el acceso a través del proxy de Kubernetes.
- Usando un servicio de tipo Kubernetes NodePort, que expone la aplicación en un puerto a través de cada uno de sus nodos. Sólo un servicio por puerto. No es para ambientes en Producción.
- Usando un servicio de tipo Kubernetes LoadBalancer, que crea un balanceador de carga externo que apunta a un servicio Kubernetes en su clúster.
- Usando un Kubernetes Ingress Controller, que permite un enrutamiento HTTP basado en host o URL. Ingress no es un tipo de servicio como el resto, se trata más de un enrutador que permite la entrada al clúster y gestionar el acceso a múltiples servicios. Hay que tener en cuenta que un Ingress Controller generalmente no elimina la necesidad de un LoadBalancer externo: el Ingress Controller solo agrega una capa adicional de enrutamiento y control detrás del balanceador de carga.
Estos son los patrones básicos para enrutar el tráfico externo a su clúster Kubernetes.

MINIKUBE: Es un proyecto que nos permite probar Kubernetes en una maquina local y utiliza maquinas virtuales de Virtual Box (por defecto). Kubernetes necesita al menos 3 nodos para funcionar, lo cual no siempre es posible en una maquina local. Para eso se creó Minikube, que es una versión reducida de Kubernetes, que corre en una única máquina virtual que hace de maestro y esclavo a la vez.
Ademas de Minikube también necesitara instalar kubectl para poder comunicarse con el servidor Kubernetes.

Kubernetes tiene también una parte Web, con un dashboard que permite monitorizar y gestionar el clúster. Minikube viene instalado con uno por defecto.

DEPLOYMENT: Para mantener los PODs prestando servicio sin interrupción utilizamos los deployments, acá definimos cuantas replicas queremos, como queremos desplegarlos, como queremos escalar y Kubernetes se encarga de mantener el clúster funcionando. Los deployments crean replication controllers que por defecto mantienen el número de réplicas que especificamos en el despliegue, pero nos permitirán cambiar este numero a futuro si así lo deseamos.

Bueno, hasta acá toda la teoría, pero estas aburrido, ¿no?
Queres tocar, queres poner manos a la obra, queres revolcarte en este chiquero (?).
Empecemos:


martes, 19 de mayo de 2020

Docker: La guia definitiva

¿Que titulo eh? Tremendo, uno entra a un posteo así y automáticamente piensa que va a entenderlo absolutamente todo.
Bueno, es mentira, no esta todo, lamento desilusionarte mi querida ardilla.
Pero, a pesar de esto, es una guía con bastantes comandos como para atesorar entre tus bienes mas preciados, compartir, recomendar, acompañar con una cerveza (?), etc.

Vamos a lo nuestro, ya se, nadie lee el principio ¬¬

¿Que es Docker
Supongo que ya lo sabes, sino te lo digo, así a grandes rasgos Docker es un administrador de contenedores ligeros y portables, la idea de Docker es que estos contenedores puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del sistema operativo de la misma y sin necesidad de estar viendo si la otra maquina donde queremos ejecutar nuestra aplicación cuenta con el software necesario para poder ejecutarla.
La funcionalidad de Docker, creo, que es a partir del Kernel 3.10, y los containers (si no estoy equivocado y si lo estoy me corrigen) nacen en 2009/2010 y Docker en el 2013. Docker llega directo al kernel no necesita un hypervisor.
Ya se, estas sudando, queres instalar Docker ya, te tiemblan las manos, estas realmente ansioso. Pasemos a esa parte:

Instalar Docker en Debian (Acá dejo un link para instalar Docker en Centos). Primero, instalamos las dependencias necesarias, agregamos las claves GPG, el repositorio estable de Docker y actualizamos:

sudo apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common build-essential

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 buster stable"

sudo apt-get update

Luego, instalamos Docker:

sudo apt-get install -y docker-ce docker-ce-cli

Ya tenemos Docker instalado, ahora podemos conquistar el mundo (?).
Para ver la versión de Docker:

sudo docker -v

Para ver si anda :)

sudo docker run hello-world


¿Que hizo acá? Vio que no teníamos ninguna imagen llamada hello-world, entonces fue a buscarla al repositorio para descargarla localmente y luego poder ejecutarla.
Con esto ya saben que existe un repositorio de imágenes que pueden usar.
Si volvemos a ejecutar el comando anterior, vemos únicamente el resultado de la imagen (no la vuelve a descargar).

Ahora vamos a ver que otra imagen descargar. 
En esta página (Docker Hub) hay decenas de imágenes para instalar. Un contenedor es un proceso que se levanta a partir de una imagen.

Vamos a probar con Wordpress por ejemplo. Buscamos a ver si hay una imagen y vemos que hay una oficial:


Para instalarla ejecutamos:

sudo docker pull wordpress


Para ver las imagenes descargadas ejecutamos:

sudo docker images

Y vemos que tenemos la de Wordpress:


Ahora vamos a levantar un contenedor con esta imagen:

docker run --name MiWordpress -p 8080:80 -d wordpress

El -d es vital, porque es para que se ejecute en segundo plano, sin esto no vas a poder interactuar con la terminal. El --name es para ponerle un nombre mas descriptivo y que nos guste, podrías ponerle Ramón (?).
Y el -p 8080:80 indica que cuando te conectas al puerto 8080 de tu equipo en realidad te estas conectando al 80 del contenedor. Lo ultimo (wordpress) es el nombre de la imagen a partir de la cual vamos a levantar el contenedor.

Para acceder escribimos en un navegador:

http://localhost:8080 


No es la idea del post, pero si siguen el asistente van a tener un Wordpress funcional para probar un montón de cosas (?). Aca estan los pasos que siguen.

Si no tienen interfaz gráfica pueden probar con lynx que es un navegador que funciona desde la terminal:

 lynx localhost:8080


Creanme que es Wordpress ¬¬, y si alguien les mira la pantalla les dicen que son hackers y después me lo comentan en el post así nos reímos juntos (?).

Bueno, ahora vamos con algunos comandos útiles:

Borrar imagen de Docker:

docker rmi nombredelaimagen

Lanzar contenedor e iniciar sesión en el mismo:

docker run --name MyWordpress -it wordpress /bin/bash

Este ultimo comando esta bueno, porque te da una shell bash en el contenedor y básicamente podes navegar por todo ese "linux minimalista" que lo corre:


Ver todos los procesos activos:

docker ps -a


Podemos ver en la imagen que hay 4 contenedores, uno corriendo (el de Wordpress) y 3 contenedores que estaban activos y ya no lo están. Y no, la traducción no es excitado ¬¬

Para saber la ip de un contenedor:

docker inspect nombrecontenedor

Van a ver varias lineas con información del contenedor, entre ella su dirección ip:


Pueden obtenerla directamente filtrando la salida con grep:

docker inspect WordpressARDILLASENLARED | grep 'IPAddress'


Eliminar contenedor:

docker rm nombrecontenedor

Reiniciar, detener e iniciar contenedor:

docker restart nombrecontenedor
docker stop nombrecontenedor
docker start nombrecontenedor


Para conectarse al contenedor con una shell bash:

docker exec -it nombrecontenedor /bin/bash 

Usar con cuidado este comando, sirve para eliminar todos los contenedores detenidos, las redes que no están siendo utilizadas y sus imágenes colgadas:

docker system prune


Para ver los logs de un contenedor ejecutamos:

docker logs nombredelcontenedor

Crear backup de un contenedor:

docker commit -p iddelcontenedor nombredelarchivodebackup

Guardarlo en un archivo .tar para moverlo a cualquier maquina con Docker:

docker save -o ~/nombrecontenedor.tar nombrecontenedorbackupeado

Restaurar backup del contenedor (vamos a poder ver la imagen con docker images a partir de la cual podemos levantar un nuevo contenedor con docker run):

docker load -i nombredelarchivodebackup.tar

Podría seguir hasta el fin del los tiempos (?), pero es todo por hoy.
Compartí, no seas malo ni egoísta, dale, ¿que te cuesta?
Si lo hace vas a motivarme, y el próximo post de Docker va a ser mucho mejor (?)

Saludos cordiales (?)