Qué es Docker
Docker es un software Open Source que hace uso del sistema de contenedores en Linux, permitiendo añadir una capa de abstracción (virtualización) a nivel de sistema operativo y poder ejecutar varias instancias de un sistema/contendor/software dentro de un único sistema Linux. Esto permite automatizar y lanzar en cuestión de segundos contenedores con distintos sistemas operativos Linux, además hay una gran cantidad imágenes preestablecidas con sistemas y software ya instalado descargables e indexadas directamente desde el buscador de Docker. Su facilidad de instalación, configuración, rendimiento y portabilidad lo hacen ideal para tener entornos de desarrollo o ejecución de aplicaciones de forma compleetamente aislada en un mismo entorno.
Cómo instalar Docker
Docker está disponible a través de repositorios, vamos a ver como instalarlo en RHEL y CentOS, tanto en versión 6 como 7.
RHEL 7
RHEL 7 ofrece el RPM de docker a través del repositorio RHEL Server Extras. Es necesario activarlo para posteriormente instalar docker:
# subscription-manager repos --enable=rhel-7-server-extras-rpms # yum install docker
CentOS 7
CentOS 7 también ofrece docker a través de sus repositorios oficiales, en este caso a través de CentOS Extras. Es necesario pues, activar el repositorio de Extras y ejecutar la instalación .
Ejemplo de repositorio de extras:
/etc/yum.repos.d
[extras] name=CentOS-$releasever - Extras mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch enabled=1 gpgcheck=0 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos protect=0
CentOS y RHEL 6
En la versión 6 de CentOS y RHEL todavía no se ofrecía Docker en los repositorios oficiales pero sí que están disponibles en el repositorio de terceros EPEL:
# wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # yum install epel-release-7-2.noarch.rpm
En este caso se instala con el nombre de paquete «docker-io»:
# yum install docker-io
Activar y arrancar docker
En el caso de CentOS y RHEL 6:
# chkconfig docker on # service docker start
Y en RHEL y CentOS 7:
# systemctl enable docker # systemctl start docker
Ver información de Docker
A partir de aquí, toda la gestión de docker se realiza con el comando «docker» seguido de los distintos parámetros. En primera instancia, para tener una visión general de docker, como por ejemplo el número de imagenes disponibles en el sistema, número de contenedores, versión, almacenamiento, etc:
# docker info Containers: 2 Images: 3 Storage Driver: devicemapper Pool Name: docker-202:2-2712-pool Pool Blocksize: 64 Kb Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 712.4 Mb Data Space Total: 102400.0 Mb Metadata Space Used: 1.0 Mb Metadata Space Total: 2048.0 Mb Execution Driver: native-0.2 Kernel Version: 3.10.0-123.8.1.el7.x86_64 Operating System: Red Hat Enterprise Linux Server 7.0 (Maipo)
Buscar y descargar imágenes de contenedores Docker
A través de la línea de comandos podemos buscar y descargar imágenes tanto de sistemas operativos (CentOS, Debian, Fedora…) como de sistemas operativos + aplicativos y software y preinstalado.
Buscando «centos», vemos que además de la imagen oficial del sistema operativo (primer resultado), también hay imágenes de terceros con software y aplicaciones ya instaladas:
# docker search centos | more NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 598 [OK] tianon/centos CentOS 5 and 6, created using rinse instea... 28 [OK] steeef/graphite-centos CentOS 6.x with Graphite and Carbon via ng... 6 [OK] tutum/centos Centos image with SSH access. For the root... 6 [OK] tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. ... 5 [OK] gluster/gluster GlusterFS 3.5 - CentOS 6.5 Docker repo 5 [OK] ingensi/oracle-jdk Official Oracle JDK installed on centos. 4 [OK] [...]
El siguiente paso sería descargar una de estas imágenes para poder ejecutarla en un contenedor. Vamos a descargar las imágenes del sistema Debian, Ubuntu y Fedora:
# docker pull ubuntu # docker pull fedora
# docker pull debian Pulling repository debian b5fe16f2ccba: Pulling dependent layers f6fab3b798be: Download complete fee2ea4e24af: Pulling dependent layers 511136ea3c5a: Download complete f10807909bc5: Download complete 5a7d9470be44: Downloading [==========================>] 37.16 MB/37.16 MB 798202714a7c: Downloading [==========================>] 37.14 MB/37.14 MB df7844587b22: Downloading [==========================>] 34.48 MB/34.48 MB 92fd7bcf9115: Pulling fs layer 3c0b3ee63a7e: Pulling fs layer 405cce5cd17d: Downloading [==================> ] 38.18 MB/45.13 MB 5s 584162d19e17: Pulling fs layer 69807a440ac3: Pulling fs layer fc771a104334: Downloading [==========================>] 175 B/175 B ec3443b7b068: Downloading [==========================>] 37.16 MB/37.16 MB
Una vez descargadas, podemos visualizar todas las imagenes que tenemos descargadas en nuestro sistema, y por ende, disponibles para ejecutar un contenedor con ellas:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE debian wheezy f6fab3b798be 9 days ago 85.1 MB debian 7 f6fab3b798be 9 days ago 85.1 MB debian 7.7 f6fab3b798be 9 days ago 85.1 MB debian latest f6fab3b798be 9 days ago 85.1 MB fedora latest 7d3f07f8de5f 6 weeks ago 374.1 MB
Crear y acceder a un contenedor Docker
Para crear un nuevo contenedor ejecutamos el siguiente comando:
# docker run IMAGEN COMANDO_INICIAL
Por ejemplo, para arrancar un contenedor basado en la imagen «debian» y accediendo directamente a la shell bash:
# docker run -i -t debian /bin/bash
Además, en caso de que la imagen no esté disponible en nuestro repositorio local vemos como la busca y descarga automáticamente:
# docker run -i -t fedora /bin/bash Unable to find image 'fedora' locally Pulling repository fedora 7d3f07f8de5f: Download complete 511136ea3c5a: Download complete 782cf93a8f16: Download complete
Y en ambos casos, tras la ejecución del comando accedemos a nuestro contenedor fedora con ID «83fada315585»:
[root@83fada315585 /]#
Si queremos crear el contenedor con un nombre personalizado lo podemos especificar con «-name»:
# docker run -name fedora01 fedora /bin/bash
Para detener la ejecución del contenedor ejecutamos el siguiente comando:
# docker stop [container ID]
# docker stop debian01
# docker stop 83fada315585
Guardar cambios realizados en los contenedores
Si no hacemos un «commit» de los cambios que vayamos realizando en el contenedor, al pararlo perderemos toda la información y configuraciones realizadas. El modo de ejecutar el «commit» es el siguiente:
# docker commit ID_CONTENEDOR NOMBRE_IMAGEN
# docker commit 6639d05aa53f fedora cc8f6edb4f4898279853a938e5e30a14f80065d4409e530a194d91b4848abc41
O si le hemos asignado un nombre personalizado:
# docker commit fedora01 fedora cc8f6edb4f4898279853a938e5e30a14f80065d4409e530a194d91b4848abc41
Eliminar un contenedor
Para eliminar un contenedor, tan sencillo como pasar el parámetro «rm» a docker seguido del ID de contenedor a borrar:
# docker rm ID_IMAGEN
# docker rm debian01
Ver listado de contenedores
Para realizar las gestiones anteriores de iniciar, parar, guardar un contenedor, etc es necesario conocer ya sea el ID del contenedor o el nombre asignado. La forma más rápida de visualizar estos y otros datos relacionados con los contenedores es el parámetro «ps»:
Rl comando «docker ps» muestra sólo los contenedores activos y «docker ps -l» los activos y parados:
# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 257e1ff40370 fedora:latest "/bin/bash" 7 seconds ago Exited (0) 4 seconds ago sleepy_babbage d98af487177b debian:7 "/bin/bash" 12 seconds ago Exited (127) 3 seconds ago debian01
Configuración avanzada de red
Con todo lo descrito anteriormente ya se puede empezar a trabajar con Docker y tener una visión de como funciona. A partir de aquí es interesante conocer como funciona la configuración avanzada de red en la cual podemos, entre otras cosas, especificar un bridge de conexión para el contenedor, activar la comunicación entre contenedores, configuración de IPTABLES, DNS, IP, etc. Estos son algunos de los parámetros disponibles a la hora de arrancar el contenedor que establecen estas configuraciones:
Configuración de bridges:
--bridge=BRIDGE
Activar la comunicación entre contenedores:
--icc=true|false
Especificar la IP a la que responderá el contenedor:
--ip=IP_ADDRESS
Habilitar IP Forwarding:
--ip-forward=true|false
Habilitar iptables:
--iptables=true|false
Especificar DNS y dominio de búsqueda DNS:
--dns=IP_ADDRESS --dns-search=DOMAIN
Todo esto ya son configuraciones avanzadas que es recomendable ir investigando conforme os vais familiarizando con el funcionamiento de Docker. Para una visión inicial esto es suficiente. Para más información y documentación, visitad el sitio web de docker.
Muy interesante!
Básicamente podría por ejemplo iniciar un contenedor por web de cliente, no? Se podría crear un contenedor con un servidor web por cada cliente y tenerlos separados en diferentes entornos, pero finalmente corriendo todos sobre un sistema o servidor.
Es una idea muy interesante!
Sí. Lo que habría que ver a posteriori es que tal anda de rendimiento con una buena cantidad de contenedores web ;)
Una duda, ¿estás seguro de que la opción «–ip=IP_ADDRESS» que comentas para establecer la ip del conetedor existe? Es que viendo la documentación de docker no la veo por ninguna parte, en mi empresa llevamos un tiempo trabajando con docker y una de las mayores dificultades a las que nos enfrentamos es el hecho de no poder asignar una ip al contenedor y que docker la asigne una automáticamente. Es más, cuando reinicias un contenedor este cambia de ip. En cualquier caso, enhorabuena por el post, me parece que es muy útil para dar a conocer una herramienta genial como es docker ;)
No lo he llegado a probar todavía. Quizás lo que hace es que las peticiones que el servidor recibe hacia esa IP son redirigidas al docker. Esto dice la documentación:
Or if you always want Docker port forwards to bind to one specific IP address, you can edit your system-wide Docker server settings (on Ubuntu, by editing DOCKER_OPTS in /etc/default/docker) and add the option –ip=IP_ADDRESS. Remember to restart your Docker server after editing this setting.
Te dejo el link para que lo puedas revisar.
https://docs.docker.com/articles/networking/#binding-ports
Muy interesante, acabo de empezar a trabajar con dockers y tu información me ha resultado de ayuda.