[Hilo Oficial] Docker

B

docker-header


¿Que es Docker?

Proyecto de codigo abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstraccion y automatizacion de virtualizacion a nivel de sistema operativo Linux. Utiliza las caracteristicas de aislamiento de recursos de kernel de Linux, tales como cgroups y namespaces para permitir que contenedores independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener maquinas virtuales.

El soporte de kernel de Linux para los namespaces aisla de vista, en su mayoria, una aplicacion del entorno operativo, incluyendo arboles de procesos, red, ID de usuario y sistemas de archivos montados, mientras que los cgroups del kernel proporcionan aislamiento de recursos, inluyendo CPU, memoria, bloque I/O y red.

docker-graph

Desde la version 0.9, se inluye la libreria libcontainer como su propia manera de utilizar directamente las facilidades de virtualizacion que ofrece el kernel de Linux, ademas de utilizar las interfaces abstraidas de virtualizacion mediante libvirt, LXC (Linux Containers) y systemd-nspawn.


Docker vs Maquinas virtuales

La principal diferencia es: Una maquina virtuales un sistema operativo completo, mientras que Docker se ejecuta sobre el sistema operativo donde se ejecuta aprovechando los recursos.

docker-vs-mv


Arquitectura

Docker utiliza la arquitectura cliente-servidor. El cliente de Docker habla con el Daemon de Docker que hace el trabajo de crear, correr y distribuir los contenedores. Tanto el cliente como el Daemon pueden ejecutarse en el mismo Sistema, o puede conectar un cliente remoto a un daemon de docker.

Para entender como funciona docker internamente, debemos conocer tres componentes.

Imagenes (docker-images)
Son una plantilla de solo lectura, es decir, una imagen puede contener el Sistema operativo de CentOS o Ubuntu con Nginx instalados, pero esto solo nos permitira crear los contenedores basados en esta configuracion. Si hacemos cambios en el contenedor ya lanzado, al detenerlo esto no se vera reflejado en la imagen.

Registros (docker-registries)
Los registros guardan las imagenes, estos son repos publicos o privados donde podemos subir o descargar imagenes. El registro publico lo provee el Hub de Docker que sirve una coleccion de imagenes para nuestro uso. Los registros de dockers basicamente son el componente de distribucion de docker.

Contenedores (docker-containers)
El contenedor aloja todo lo necesario para ejecutar una aplicacion. Cada contenedor es creado de una imagen de docker. Cada contenedor es una plataforma aislada.

docker-graph-arch


Primeros pasos

Busqueda de imagenes

docker-search-ubuntu

Una vez instalado docker, en una terminal ejecutamos docker search ubuntu y nos apareceran resultados sobre imagenes listas para utilizar.

NAME proporciona el nombre de la imagen
DESCRIPTION proporciona una descripcion sencilla de la imagen
STARS indica la popularidad de la imagen
OFFICIAL devuelve un [OK] si es oficial
AUTOMATED indica si es una imagen creada automaticamente (modificacion de otra)

Otra opcion de busqueda, es ir al Hub de Docker y realizar la busqueda.

docker-hub-search

Descarga de imagen

Cuando tengamos localizada la imagen que queramos descargar, procedemos a su descarga.

docker-pull-image

El comando es docker pull ubuntu (siendo ubuntu el NAME que nos proporciono la busqueda). Tambien encontraremos el comando de como ejecutarlo, desde el Hub, a la derecha de la descripcion del repositorio.

docker-pull-command-hub

Una vez completada la descarga, comprobamos que esta la imagen.

docker images y nos aparecera la imagen descargada.

docker-images-list

Trabajar con la imagen

Para ejecutar la imagen, procedemos a ello con docker run -i -t ubuntu /bin/bash

docker-run-image

Siendo -i interactivo, -t tty, ubuntu nombre de la imagen y /bin/bash el comando que ejecutara.

Si por ejemplo, ejecutamos docker run -i -t ubuntu echo "Hello World" obtendremos unicamente la respuesta del echo.

docker-run-image-hello-world

_ **El post se ira actualizando _

+info

36
gbpepe

Muy currado, gracias #1

Me quedo por aquí que me interesa bastante...

NoRelaX

Muy bueno.
Justo hace pocas semanas toqué Docker por primera vez para instalar Sonarqube.

D

Para el que quiera empezar de 0, recomiendo el libro:

The Docker Book

No está a la última pero si bastante actualizado y es ideal para iniciarse. Trata desde como empezar a descargar y utilizar contenedores ya creados por terceros, a crear los tuyos propios usando Dockerfiles. Oferce ejemplos prácticos (montar una web estática, una aplicación web usando redis, o un sistema de CI con jenkins que dentro vuelve a ejecutar contenedores).

Llevo la mitad leído (y practicado) por eso. El precio de libro es barato, pero, por la red se puede conseguir su versión en PDF.

Luego, una vez finalizado, me recomendaron leer The DevOps 2.0 Toolkit donde ya explican a nivel avanzado la gestión de contenedores, microservicios y demás tecnologías de moda que aún no he acabado de pillar bien.

Personalmente, Docker está bastante maduro, pero docker en si, lo que está aún en pañales es todo el número de aplicaciones que le rodea. Pocas empresas lo usan en producción, pero en staging y development si.

Un consejo es asociar un contenedor a un proceso. No asociarlos o compararlos con Virtual Machines.

Y ya a nivel personal, una buena práctica es intentar "dockerizar" una plataforma que tengas funcionando. Es la mejor forma de aprender, y de como hay que crear las imagenes para que los contenedores se vean entre ellos, interactuen con el host que los contiene,, etc...

5
HeXaN

¿Y para todo este follón no es mejor tirar de máquinas virtuales en VMWare o VirtualBox? Porque vamos, tener que estar con la terminal y todo el rollo...

2 2 respuestas
RaCe

#1 gracias por el hilo, Docker es amor

#5 no soy ningún experto (si digo algo mal por favor corregidme y así aprendemos todos) pero entiendo que el enfoque de una VM y de Docker es bastante distinto, por tanto dependerá bastante del caso que estemos hablando.

Que diferencias tiene Docker frente a una VM?

  1. El rendimiento de un contenedor Docker será mejor ya que compartes kernel con tu OS
  2. Usando Docker Compose puedes montar varios containers y hacer que se comuniquen y trabajen entre ellos, p.ej: uno con Node, otro con MySQL, otro con Redis... cada uno su función
  3. Una vez has montado tu 'stack' lo puedes volcar en el servidor de producción, en el PC de tu compañero, etc.
  4. Ventajas de escalibilidad, si quieres siempre puedes añadir más containers según los necesites

Y aprovecho para comentar un proyecto que estoy probando y la verdad que me está gustando mucho para complementar a Docker y hacerlo más amigable: http://rancher.com/

¿Alguien más lo ha probado?

3 2 respuestas
sPNkKkKkKkKk

A favoritos.

p0stm4n

Pillo sitio, buen hilo.

B

#6 Ummm, pero también puedes hacer que varias maquinas virtuales se comuniquen entre si.
Puedes, es difícil pero es posible, pasar de una maquina virtual a un disco duro físico y de ahí a una maquina real.
Y si nos ponemos una maquina virtual también es escalable.
No es por llevar la contraria ni en modo hater, entiendo que la mejora de rendimiento tiene que ser bestial, pero fuera de eso la idea para mi se desmonta un poco

1 respuesta
RaCe

#9 creo que la cosa es que Docker digamos está más pensado para eso y con sus herramientas se puede montar sistemas modulares de manera muy muy fácil.

Me explico con un ejemplo, con Docker puedes montar dos containers que se comunican entre sí en 20 líneas:

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - "./.data/db:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    links:
      - db
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

Esto por ponerte un ejemplo random (sacado de aquí https://docs.docker.com/compose/wordpress/ ) obviamente se pueden hacer cosas mucho más complejas como meter Swarm/Kubernetes en la ecuación que trae todavía más features interesantes.

Imagino que montar sistemas parecidos con VMs sería más complicado

1 1 respuesta
B

#10 Tal y como lo pones si, efectivamente puede tener sentido. Claro yo el problema es que estaba viendo el servidor/Sistema con su interfaz gráfica y ahí no entendía porque leñe usar comandos o porque liarla tanto si en conectar 2 ordenadores es facil

1 respuesta
M

Sigo sin ver las ventajas de esto, teniendo en cuenta que la ultima versión de vSphere puede crear hasta 128 cpu virtuales.

Luego si partimos de la premisa de que este gráfico esta mal:

Como es posible que el guest OS sea mas grande que el Host OS y el Hypervisor juntos.

Luego estas condenado a compartir el SO del host, todo el mundo sabe que es mejor exchange que cualquier otro servicio de correo de código abierto por ejemplo.

Explicarlo con un Docker vs virtualizacion tradicional o algo así! gracias.

2 respuestas
RaCe

#12 igual esto es lo que buscas: http://www.slideshare.net/BodenRussell/kvm-and-docker-lxc-benchmarking-with-openstack

D

#11 meter GUI en un servidor Linux debería estar penado con lapidación, pero eso es otra batalla.

A lo que va #6 es que docker es uan vuelta mas de tuerca en el campo de la virtualización, eliminando una capa como el Hypervisor. Además que aprovechas mas lo recursos.
Si quiero correr un proceso de nginx, ¿Por qué he de instalar todo un SO? Docker te proporciona eso.

Luego lo miras desde el punto de vista de montarlo en tu casa para hacer 4 pruebas. En plataformas va muy bien a la hora de hacer deploys ya que le environemnt de la aplicación siempre es la misma, y si el contenedor funciona en tu portátil, ha de funcionar en producción, ya que ambos tienen la misma versión de kernel.

Por otro lado, está el tiempo de la disponibilidad. ¿Cuanto tardas en levantar una VM caída? minimo N segundos. Con contenedores es instantáneo. Y ya no hablemos cuando han de comunicarse con otros servicios. Con Docker puedes levantar todo un stack configurado de forma casi instantánea.

4 1 respuesta
Sr_RoS

por fin un hilo de docker.
cuando se crea un hilo sobre una tecnología en mv es que la tecnología es presente y no futuro.

#1
una pregunta.
solo puedo ejecutaar docker con sudo. no se si a los demás os pasa.
me aparece el siguiente mensaje

docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.

funciono con ubuntu 14.04
a alguien mas le pasa?

1 1 respuesta
B

#14 Bueno, lo de la interfaz dalo por perdido, básicamente porque estaba pensando en el Windows Server en vez de en Linux, es mejor Linux ya lo se, pero simplemente paso de pensar en él, odio Linux de cliente y por tanto prefiero pasar de su server, pero como has dicho eso es otra batalla.

Pero ya puesto a sacar todas las ventajas que tiene el Docker, cada "Dock" tiene limite de aplicaciones que pueden ejecutar?

1 respuesta
X-Crim

Vaya tela lo que hay que leer

D

#15 Primero comprueba que el servicio docker daemon está corriendo, si no, es que el usuario con el que ejecutas comandos, no tienen permisos para acceder a dicho servicio.
Si es le caso, solo hay que seguir estos pasos:

https://docs.docker.com/engine/installation/linux/ubuntulinux/#create-a-docker-group

Crear grupo docker y agregar tu usuario a dicho grupo

#16 Bueno, soporte para Windows y Mac de forma nativa, tiene desde hace 4 días como quien dice, es mas. diría que aún está en fase beta. Edit: Está en fase de beta pública, anunciado ayer en la DockerCon16 que es estos días en Seattle (https://blog.docker.com/2016/06/docker-mac-windows-public-beta/)

Respecto a la pregunta, ¿a que te refieres con limitación? ¿Cuantos números de procesos puede ejecutar un contenedor? ¿Si hay aplicaciones que no son soportadas?

2 respuestas
Sr_RoS

#18 tks.
el caso es que he hecho eso antes y no me funcionó.

sudo groupadd docker //ya existía
sudo usermod -aG docker ${USER}
1 respuesta
B

#19 vete al VirtualBox y arranca la máquina en headless mode

bultack

Muchas gracias #1 por crear el thread, aquí creo que vamos a aprender bastante entre todos :)

Aún debería darle caña más a Docker para ver todo lo que se puede hacer, tan sólo he hecho algunos ejemplos sencillos. Me llamaba bastante el tema de poder crear múltiples contenedores y empecé a mirar Compose que permite hacerlo y es bastante sencillo.

pineda

si que ha tardado en llegar el hilo oficial!!

Para la gente de barcelona, os dejo un grupo donde soy bastante activo, y suelen hacer charlas de todos los niveles, desde introducción pura a management de contenedores, services discoveries y otros http://www.meetup.com/es-ES/docker-barcelona-spain/

1
FRJ8

Me uno al hilo, parece interesante! Buen curro #1

D

Acabo de salir de un workshop que muestran como funciona contenedores docker gestionado por Kubernetes, todo corriendo en el cloud de Google, Cloud Google Platform.

Muy interesante para saber como trabajar con contenedores distribuidos en diferentes hosts.

Si consigo las slides de la presentación, las subo.

Por otro lado, a los que són de Barcelona, que estén al loro de la web de Capside, que van a hacer mas workshops del estilo.

1 respuesta
pineda

#24 muy aconsejable el tema de kubernetes. En mi actual empresa tenemos uno de los proyectos en un pequeño cluster de 15 servidores virtuales, con kubernetes. El tema de tener visibilidad de los contenedores del cluster, poder realizar despliegues por web, escalar y otras opciones, es una maravilla!! (http://kubernetes.io/docs/user-guide/ui/)

Como consejo a los novatos, empezad por docker, para luego dar el salto a docker-compose (antiguo fig). Una vez tengáis cierta soltura en esto, es cuando podréis empezar a pensar en temas de clustering con docker swarm, kubernetes, fleet, mesos o lo que sea.

B

#18 Perdon por no responder antes no me habia fijado, si esta para Windows le dare un test si o si. A limitación me referia a cuantas aplicaciones puede ejecutar un contenedor...y ya que estoy hago otra pregunta, docker como usa los recursos fisicos del equipo? Hace una imitación como una maquina virtual o los usa tal cual son los componentes?

1 respuesta
pineda

#26 Sobre limitación, no tienes. Pero la gracia de trabajar con contenedores es tener cada aplicación o servicio en un contenedor separado, y luego relacionarlos usando links. De esta forma puedes escalar solo el servicio que necesites.

Sobre la otra pregunta, trabaja a nivel de SO. El mismo docker daemon hace de hypervisor por así decirlo. Si lo tienes por defecto, desde no recuerdo que versión (por encima de go 1.2) él mismo ya se asigna todos los procesadores, ram y disco.

También tienes la opción de asignarlo manualmente. En un ejemplo práctico, tenemos en una misma máquina una aplicación con 16 instancias desplegadas, + 8 instancias de Redis. Lo que hicimos es asignar 1 core al SO, 8 cores a los redis (uno a cada uno), y los otros 7 cores para aplicación. Pero esto en un uso "normal" no es necesario!

Espero que esto responda a tu pregunta

1 1 respuesta
B

#27 Yo me referia más al que..eh..."tipo" de hardware usa para cada aplicación, como ejemplo seria que si instalas un Windows en una maquina virtual y vas al panel de administrar dispositivos estos son dispositivos simulados...aunque ahora que lo pienso bien en verdad da igual. Se puede poner a cada Docker una ip/dirección distinta o usan todos la IP del equipo?

1 respuesta
MartiONE

Han puesto un minitutorial en reddit, tiene pinta de estar muy bien.

http://prakhar.me/docker-curriculum/

pineda

#28 cada contenedor tiene una IP interna, y entre contenedores al hacer link puedes ver sus ip's. Además, de cara a fuera, puedes publicar puertos. Por ejemplo, imaginate que tienes dos contenedores con cada uno un apache propio, con su web en el puerto 80. Entonces publicamos el contenedor 1 en el puerto 88, y el contenedor en el puerto 89.

Esto es, que internamente la aplicación esta publicada en el 80, pero para acceder desde fuera, será mediante el 88 u 89. También puedes montar una carpeta del host con el contenedor para por ejemplo, publicar ficheros de logs o que se yo

1 respuesta