1 jul 2017

Docker I - Primera aproximacion

Imagen relacionada

1. Introducción


Voy a comenzar una serie de howto dedicados a una de las tecnologías que más se han puesto de moda en los ultimos tiempos : ‘Docker’.

En esta primera aproximación, vamos a describir que es Docker, su instalación, primeros pasos, y en los sucesivos vamos a adentrarnos un poco más para poner casos de uso reales.

2. Requisitos


Los posts están realizados sobre un equipo que corre una Ubuntu 16.04 LTS.
Para otros sistemas como Windows y demás, habría que cambiar varias cosas, que las iremos comentando.

3. Definicion


Resultado de imagen de docker

Siempre he pensado que una imagen vale más que mil palabras, por lo que si nos fijamos en la imagen de arriba, y lo comparamos con algo que ya conocemos, como es la Virtualización de una máquina, nos fijamos que la diferencia es grande.
En la virtualización de una máquina al completo, estamos virtualizando todos y cada uno de los componentes de la misma, algo que seguramente en la mayoría de los casos no nos sea de utilidad.
En el caso de Docker, es una herramienta openSource que nos permite realizar una ‘virtualización ligera’, con la que poder empaquetar entornos y aplicaciones que posteriormente podremos desplegar en cualquier sistema que disponga de esta tecnología.

Para ello Docker extiende LXC (LinuX Containers), que es un sistema de virtualización que permite crear múltiples sistemas totalmente aislados entre sí, sobre la misma máquina o sistema anfitrión.

La gran diferencia es que una máquina virtual necesita contener todo el sistema operativo mientras que un contenedor Docker aprovecha el sistema operativo sobre el cual se ejecuta, comparte el kernel del sistema operativo anfitrión e incluso parte de sus bibliotecas.
Respecto al almacenamiento en disco, una máquina virtual puede ocupar varios gigas ya que tiene que contener el sistema operativo completo, sin embargo los contenedores Docker sólo contienen aquello que las diferencia del sistema operativo en las que se ejecutan.

Desde el punto de vista del consumo de procesador y de memoria RAM, los contenedores Docker hacen un uso mucho más eficiente del sistema anfitrión, pues comparten con él, el núcleo del sistema operativo y parte de sus bibliotecas, con lo que únicamente usarán la memoria y la capacidad de cómputo que estrictamente necesiten.

Por ultimo, la filosofía de Docker, es una orientación a servicios, lo que nos va a permitir que tengamos que pensar a partir de ahora, en nuestros "problemas" para darle la solución en base a los servicios que necesitemos. Esto nos permitirá escalar rápidamente, y ya veremos como con otra herramienta como son Kubernetes, nos podremos sentir tranquilos a la hora de obtener un buen rendimiento.

Otras ventajas destacables del uso de Docker serían:


  • Las instancias se arrancan en pocos segundos.
  • Es fácil de automatizar e implantar en entornos de integración continua.
  • Existen multitud de imágenes que pueden descargarse y modificarse libremente.

5. Imágenes y Contenedores


Los términos que hay que manejar con Docker son principalmente 2, las imágenes y contenedores.

Las imágenes en Docker se podrían ver como un componente estático, pues no son más que un sistema operativo base, con un conjunto de aplicaciones empaquetadas, mientras que un contenedor es la instanciación o ejecución de una imagen, pudiendo ejecutar varios contenedores a partir de una misma imagen.

6. Instalación


En el caso de Ubuntu, la vida es más fácil en Linux, solo debemos:


1
2
3
4
5
6
7
sudo apt-get update
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

sudo apt-get update
sudo apt-get install -y docker-engine

Y para activarlo y ver el estado


1
2
3
4
5
6
7
8
9
sudo systemctl status docker


Output
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
     Docs: https://docs.docker.com
 Main PID: 749 (docker)

Ejecutar el Comando Docker Sin Sudo (Opcional)


De forma predeterminada, ejecutar el comando docker requiere privilegios de root, es decir, tiene que prefijar el comando con sudo. También puede ser ejecutado por un usuario en el grupo docker, que se crea automáticamente durante la instalación de Docker. Si intenta ejecutar el comando docker sin prefijarlo con sudo o sin estar en el grupo docker, obtendrá una salida como esta:


1
2
3
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Lo solucionamos así:


1
2
3
sudo usermod -aG docker $(whoami)

sudo usermod -aG docker username


7. Uso del Comando Docker




1
docker [option] [command] [arguments]


8. Trabajar con Imágenes de Docker


Vamos a usar nuestra primera imagen de Docker, y crear nuestro contenedor.


1
docker run hello-world

El resultado es:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Esto es así porque la imagen ya la tenía descargada, si no se hubiera puesto a descargarla, eso es!, el solito.
Para ver las imágenes descargadas (en mi caso):

1
2
3
4
5
6
7
8
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lamp_php            latest              e086b8f727ab        11 hours ago        380MB
lamp_apache         latest              fb45ef33b220        12 hours ago        175MB
php                 7.0-fpm             9b2d6959af7b        9 days ago          380MB
debian              jessie              62a932a5c143        10 days ago         123MB
hello-world         latest              1815c82652c0        2 weeks ago         1.84kB
mysql               5.6.35              a0f5d7301767        3 months ago        329MB

Se puede apreciar que hay imágenes que son de hace tiempo, y otras de hace horas. Las que son de hace horas, es porque aparte de poder usar una imagen "estándar" por así llamarla, la podemos customizar, y crear una imagen nuestra, y además podremos compartirla en Docker Hub docker hub


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ docker search ubuntu

Output
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                            Ubuntu is a Debian-based Linux operating s...   3808      [OK]       
ubuntu-upstart                    Upstart is an event-based replacement for ...   61        [OK]       
torusware/speedus-ubuntu          Always updated official Ubuntu docker imag...   25                   [OK]
rastasheep/ubuntu-sshd            Dockerized SSH service, built on top of of...   24                   [OK]
ubuntu-debootstrap                debootstrap --variant=minbase --components...   23        [OK]       
nickistre/ubuntu-lamp             LAMP server on Ubuntu                           6                    [OK]
nickistre/ubuntu-lamp-wordpress   LAMP on Ubuntu with wp-cli installed            5                    [OK]
nuagebec/ubuntu                   Simple always updated Ubuntu docker images...   4                    [OK]
nimmis/ubuntu                     This is a docker images different LTS vers...   4                    [OK]
maxexcloo/ubuntu                  Docker base image built on Ubuntu with Sup...   2                    [OK]
admiringworm/ubuntu               Base ubuntu images based on the official u...   1                    [OK]

...


De esas que ya tenemos, podemos hacer una búsqueda para que nos sirva de base.
Y si queremos descargar alguna:


1
$ docker pull ubuntu

9. Ejecutar un Contenedor Docker


Vale, pues ya tenemos las imágenes, pero como hemos comentado al inicio, ahora lo que necesitamos es ejecutar el contenedor.


1
$ docker run -d --name sonarqube -p 9000:9000 sonarqube

Como se puede ver, si observamos el comando de arriba, hemos hecho uso de una imagen que es sonarqube, la hemos ejecutado como si fuera un daemon (-d) y le damos unos puertos de entrada y salida con los que comunicarnos (-p 9000:9000)

¿Y si necesitamos tener otro Sonar? Pues nada, instanciamos de nuevo la imagen para crear otro contenedor, pero en otro puerto de mi máquina, para que no se solapen.

1
$ docker run -d --name sonarqube2 -p 7000:9000 sonarqube

Y si es una imagen de SO y queremos trabajar "dentro", pues igual de sencillo:


1
2
3
4
$ docker run -it ubuntu

Output
root@d9b100f2f636:/#

Importante: Observe el identificador del contenedor en el símbolo del sistema. En el ejemplo anterior, es d9b100f2f636.


10. Hacer Cambios en un Contenedor a una Imágen de Docker


Pues cuando paremos el contenedor, todo se perderá, pero como hemos visto antes, podemos crear nuestras imágenes, o guardar estados de las mismas.
Confirmar los cambios en una nueva instancia de imagen de Docker mediante el siguiente comando:


1
$ docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name

 El modificador -m es para el mensaje de confirmación que le ayuda a usted ya los demás a saber qué cambios hizo, mientras que -a se utiliza para especificar el autor. El identificador del contenedor es el que anotó anteriormente en el tutorial cuando inició la sesión de docker interactivo. A menos que haya creado repositorios adicionales en Docker Hub, el repositorio suele ser el nombre de usuario de Docker Hub.

11. Trabajar con contenedores


Después de usar Docker por un tiempo, tendrá muchos contenedores activos (en ejecución) e inactivos en su computadora. Para ver los activos:


1
2
3
4
5
$ docker ps

Output
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f7c79cc556dd        ubuntu              "/bin/bash"         3 hours ago         Up 3 hours                              silly_spence


1
2
3
4
5
$ docker ps -a

$ docker ps -l

$ docker stop container-id


Con los comandos anteriores podemos ver todos los contenedores, listar el ultimo modificado, y para el correspondiente.

12. Subiendo Imágenes de Docker a un Repositorio Docker


Es la parte final, para tener controlados nuestros cambios.
Deberíais haceros cuenta en Docker Hub, para tener vuestros repositorios, no solo controlados, si no también privados.



1
$ docker login -u docker-registry-username


Ahora ya podemos pushear nuestra imagen:


$ docker push docker-registry-username/docker-image-name

13. Conclusión


Ha sido un poco largo, y eso que eso la introducción. Hay un mundo de Docker, mucho más de lo que he escrito en este artículo, pero esto debería ser suficiente para empezar a trabajar con él en Ubuntu 16.04.
Al igual que la mayoría de los proyectos de código abierto, Docker se construye a partir de una base de código de rápido desarrollo, así que os invito a que le pregunteis a Google.

En próximos posts revisaremos como unir contenedores.




Share This!



No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.