Inicio Comandos Docker
Post
Cancel

Comandos Docker

Docker

Docker sirver para crear contenedores ligeros y portables para las aplicaciones/software/webs se puedan ejecutar en cualquier maquina donde docker se encuentre instalado, independiente del sistema operativo que se este ejecutando en ese momento.

Un contenedor es una “caja” donde se encontrara todo lo que la aplicacion necesita para poder ejecutarse, ademas de la propia aplicacion en si misma que se esta desarrollando.

Imagen VS Contenedor

Docker sirve para distribuir “Maquinas”.

  • Imagen: Lo que se distribuye.
  • Contenedor: Lo que se ejecuta.

Desde una misma imagen se puede crear multiples contenedores.

Ademas es posible generar dos tipos de contenedores, los cuales son:

  • windows: no lleva kernel de linux, por lo cual solo es recomendable para aplicaciones que requieran ejecutarse exclusivamente en windows server o similar.

  • Linux: incluye una capa del kernel de lix para ejecutar en cualquier sistema.

Docker Servicio - Comandos

Docker Exec

Exec es un comando de administracion de contenedores.

Permite ejecutar un comando sobre un contenedor que no posea entorno interactivo para trabajar, ejemplo:

1
docker exec ID/Nombre_Contenedor echo hola-mundo

El resultado de esto seria.

# Ejemplo 1
[XXXX@XXX ~]# docker exec ubuntu echo hola-mundo
hola-mundo
# Ejemplo 2
[XXXX@XXX ~]# docker exec -it Nombre_Contenedor bash

Este ejemplo se aplica a un contenedor que ya este en ejecucion.

Docker Logs

Permite ver que esta imprimiendo en pantalla un contenedor que se encuentre en segundo plano(Background).

1
docker logs ID/Nombre_Contendor

El unico problema del logs es que mostrara todo lo que ha realizado el contenedor

Para Ver ultimas lineas que esta ejecutando el contenedor, las que serian de importancia y evitar que muestre toda la informacion se ocupa el –tail mas el numero de lineas que desea ver.

Ejemplo

1
2
3
docker logs ID/Nombre_Contenedor --Tail N°_Lineas

docker logs 1234asd --Tail 20

Mostrara las 20 ultimas lineas ejecutadas por el contenedor.

Docker Top

Permite saber cual es el proceso que mas consume recursos dentro de un contenedor.

1
docker top ID/Nombre_Container

Docker stats

Permite ver informacion sobre un contenedor, como uso de CPU y memoria, ademas de otras cosas.

docker stats ID/Nombre_Contenedor

Docker Inspect

Permite recuperar la informacion de una imagen o contenedor, a nivel de propiedades y caracteristicas.

1
docker inspect ID_Contenedor/Imagen

Este comando entregara mucha informacion por lo cual es recomendable enviar dicha informacion a un archivo, para su posterior inspeccion`.

1
docker inspect ID_Contenedor/Imagen > Nombre_Archivo.txt

La informacion se entrega en formato JSON.

o realizar una busqueda especifica como la direccion IP.

1
docker inspect --format='{ {range.NetworkSettings.Networks} } { {.IPAddress} } { {end} }' ID/Nombre_Contenedor

La informacion que entrega es variada como la imagen con la cual el contenedor se genero, fecha de creacion, plataforma(linux-windows),su red, entre muchos otros.

Docker image

Sirve para administrar imagenes, agrupa todos los comandos que tienen relacion con las imagenes y sus Opciones son las siguientes:

ComandoDescripcion 
buildConstruir una imagen a partir de un Dockerfile 
historyMostrar el historial de una imagen 
importImportar el contenido de una tarball para crear una imagen del sistema de archivos 
inspectMostrar información detallada sobre una o más imágenes 
loadCargar una imagen de un archivo tar o STDIN 
lsListar imágenes 
pruneEliminar imágenes no utilizadas 
pullExtraer una imagen o un repositorio de un registro 
pushEmpujar una imagen o un repositorio a un registro 
rmEliminar una o más imágenes 
saveGuardar una o más imágenes en un archivo tar (transmitidas a STDOUT por defecto) 
tagCree una etiqueta TARGET_IMAGE que haga referencia a SOURCE_IMAGE 

Se puede considerar una alternativa a ciertos comandos. Ejemplo

Opcion 1Opcion 2
docker image lsdocker images
docker image rmdocker rm

Docker Container

Al igual que docker image, docker container agrupa todos los comandos relacionados con los contenedores.

Comandos

ComandoDescripcion
attachConecte flujos de entrada, salida y error estándar locales a un contenedor en funcionamiento.
commitCrear una nueva imagen a partir de los cambios de un contenedor.
cpCopiar archivos/carpetas entre un contenedor y el sistema de archivos local
createCrear un nuevo contenedor
diffInspeccionar cambios en archivos o directorios en el sistema de archivos de un contenedor
execEjecutar un comando en un contenedor en ejecución
exportExportar el sistema de archivos de un contenedor como un archivo tar
inspectMostrar información detallada sobre uno o más contenedores
killMatar uno o más contenedores en marcha
logsObtener los logs de un contenedor
lsListar Contenedores
pausePausa todos los procesos dentro de uno o más contenedores
portListar mapeos de puertos o un mapeo específico para el contenedor
pruneRetirar todos los contenedores parados
renameRenombrar un contenedor
restartReiniciar uno o más contenedores
rmRetirar uno o más contenedores
runEjecutar un comando en un nuevo contenedor
statsMostrar una secuencia en vivo de estadísticas de uso de recursos del contenedor(es)
stopParar uno o más contenedores en ejecución
topMostrar los procesos en ejecución de un contenedor
unpauseDespausa todos los procesos dentro de uno o más contenedores
updateActualizar la configuración de uno o más contenedores
waitBloquear hasta que uno o más contenedores se detengan, luego imprimir sus códigos de salida

Se puede considerar una alternativa a ciertos comandos. Ejemplo

Opcion 1Opcion 2
docker container lsdocker ps
docker container ls -adocker ps -a

Docker –help

En caso de necesitar ayuda para saber que hace un comando se agrega el –help.

Ejemplo

[XXXX@XXX ~]# docker conainer ls --help

Usage:  docker container ls [OPTIONS]

List containers

Aliases:
  ls, ps, list

Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print containers using a Go template
  -n, --last int        Show n last created containers (includes all
                        states) (default -1)
  -l, --latest          Show the latest created container (includes all
                        states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display numeric IDs
  -s, --size            Display total file sizes

Ejemplo Centos 7/Ubuntu 16

  • Docker status(systemctl status docker): sirve para saber el estado de docker en la maquina.
  • Docker start(systemctl start docker): arranca el servicio de docker(en linux).
  • Docker stop(systemctl stop docker): detiene el servicio.
  • Docker enable(systemctl enable docker): activa docker, en caso de reinicio del sistema este se ejecutara de manera automatica.
  • Docker –version: sirve para saber que version de docker se tiene instalada actualmente en la maquina.
  • Docker info: entrega multiples datos(Espacio, caracteristicas, etc), entre los cuales se destaca la cantidad de conetenedores e imagenes y el estado de estos.
  • Docker run: cada vez que se ejecuta este comando, crea un nuevo contenedor, no recicla contenedores ejecutados previamente.

imagenes

Buscar imagen docker por CMD

con este comando se buscara y entregara una lista de imagenes que se encuentran en el HUB.

1
docker search NombreBuscar

Retorna como maximo 25 resultados.

Descargar imagen

para descargar una imagen del HUB de docker al entorno local se ocupa el siguiente comando.

1
docker pull NombreImagen

Ver imagenes en repositorio local

para ver las imagenes desdecargadas que tenemos en nuestro equipo, se ocupa el siguiente comando.

1
docker images

Ver IDs de las imagenes en repositorio local

Entregara una lista de todos los id de todas las imagenes que tengamos en el repositorio local de la maquina.

1
docker images -q

Filtrar imagenes

Se aplica de manera similar que al filtrar los contenedores.

1
docker images -f

Eliminar una Imagen

Para eliminar una imagen que se encuentre en nuestro repositorio local se eejcuta el siguiente comando:

1
docker rmi ID/Nombre_Contenedor

Importante

No es posible eliminar una imagen, si se creo un contenedor con dicha imagen. En resumen, si la imagen tiene asociada un contenedor, esta no podra eliminarse.

En caso de querer borrar la imagen asociada, se debera eliminar primero el contenedor, que esta coupando dicha imagen.

Si aun asi se desea eliminar la imagen asociada, antes que el contenedor el comando se debe forzar con la bandera ‘-f’.

Borrar todas las imagenes

con este comando se eliminaran TODAS las imagenes que se tengan almacenadas, en el repositorio local.

1
docker rmi $(docker images -q)

Historial cambios imagen

Para saber los cambios que ha sufrido una imagen en su proceso de construccion a lo largo del tiempo se puede ocupar:

1
docker image history Nombre_Imagen

Contenedores

Crear contenedor

Para crear un contenedor se ocupa el siguiente comando.

1
docker run nombre-Contenedor

Un contenedor se inicia desde una imagen.

Cada vez que se ocupa docker run se crea un nuevo contenedor, no reutiliza contenedores previamente ejecutados, aunque se ocupe la misma imagen.

  • Ejemplo:

Al ejecutar el siguiente comando se creara un contenedor a partir de una imagen que especifiquemos con su respectivo nombre ejemplo “hello-world”(plantilla).

Si la imagen que especificamos no esta en nuestro “repositorio” de imagenes local, docker procedera a descargarla desde el HUB.docker

1
docker run hello-world

Docker Hub es un registro online de imagenes.

Crear contenedor con nombre

Para crear un contenedor con nombre se ocupa el comando –name, ejemplo:

1
2
docker run -it --name ubuntu_personal ubuntu bash
                      Nombre_Asignado Imagen

Crear Contenedor Interactivo

Permite crear un contenedor interactivo si la imagen asi lo permite con el comando -it(i de interactivo, t de terminal), esto permite ingresar he interactuar con el contenedor(si este lo permite), ejemplo trabajar en la terminal de una imagen como ubuntu.

1
docker run -it ubuntu

La imagen contiene una version minima de ubuntu.

Crear contenedor en segundo plano (Background)

Para mantener en ejecucion un container en segundo plano, sin tener que mantener activa una ventana de comandos para interactuar con el(entorno interactivo).

1
docker run -d nginx

La opción -d ejecuta el contenedor en modo independiente. También es equivalente a -d=true.

Un contenedor en modo independiente no puede ser removido automáticamente cuando se detiene, esto significa que no se puede usar la opción –rm en combinación con la opción -d.

Crear contenedor con eliminado automatico

Para evitar que los contenedores detenidos se acumulen, esta la opcion que se eliminen de manera automatica, una vez finalizada su funcion, el cual es agregandole el –rm al comando.

1
docker run -it --rm --name Nombre_Contenedor Nombre_imagen

Ingresara en modo interactivo y cuando uno salga de ese modo el contenedor se eliminara.

Ingresar a contenedor en modo interactivo

Para ingresar a un contenedor que posea el modo interactivo y que ademas se ha creado con anterioridad y este en estado de detenido ejemplo, ubuntu, se ejecuta el siguiente comando para iniciarlo y ingresar a esté. Asi no se creara un nuevo contenedor.

1
docker start -i ID_Contenedor

Cuando el contenedor se detiene no se eliminan de manera automatica.

Salir de un Contenedor sin detener ejecucion

para salir del container sin detenerlo y que asi pueda seguir ejecutandose se ocupa la siguiente combinacion de teclado.

1
Ctrl+P+Q

Detener contenedor

Para detener un contenedor que se encuentre en ejecucion, se ocupa:

1
docker stop ID_Contenedor

Detener todos los contenedores

para detener todos los conteendores que se encuentren en ejecucion, se ocupa lo sigueinte.

1
docker stop $(docker ps -a -q)

Probado en PowerShell

Ver contenedores en ejecucion

Para poder ver los contenedores que se estan ejecutando en la maquina se puede ocupar una de las siguientes opciones.

1
2
3
4
5
# Primera Opcion
docker container ls

# Segunda Opcion
docker ps

Ver contenedores detenidos

Para ver los contenedores que estan creados pero al mismo tiempo detenidos se ocupa.

1
docker ps -a

Los contendores al terminar de ejecutarse no se eliminan si no que pasan a un estado de detenido.

Con este comando tambien se mostrara los que estan en ejecucion.

Ver ultimo contenedor arrancado

se puede visualizar el ultimo contenedor que ha realizado una operacion.

1
docker ps -l

Ver ultimos contenedores que se han ejecutado(cantidad)

Con esta opcion se podra ver los ultimos contenedores que han realizado alguna operacion, ademas se puede especificar la cantidad que se desea mostrar.

1
docker ps -n 4

mostrara los ultimos 4 contenedores que hayan realizado alguna operacion.

Este numero(4) se puede cambiar por cualquiera dependiendo de la necesidad.

Ver IDs de containers

para visualizar solamente los ID, y asi poder crear operaciones automaticas

1
2
3
4
# Opcion 1
docker ps -a -q
# Opcion 2
docker ps -aq

con esta opcion mostrara todas las IDs de los contenedores, independiente del estado en el que se encuentre.

Ver tamaño del contenedor

Para poder ver el tamaño que ocupa un contendor en el sistema se ocupa el -S, en este caso, se presenta un ejemplo para ver el tamaño de los ultimos 3 contenedores.

1
docker ps -a -n 3 -s

Filtrar lista de contenedores(–filter, -f)

Permite agregar una o mas opciones a la busqueda de contenedores, al momento de realizar una lista de estos. A continuacion se muestran las opciones disponibles.

FiltroDescripcion
idID del contenedor
nameNombre del contenedor
labelUna cadena arbitraria que representa una llave o un par llave-valor. Expresado como <key> o <key>=<value>
exitedUn número entero que representa el código de salida del contenedor. Sólo es útil con --all
statusuno de created, restarting, running, removing, paused, exited, o dead
ancestorFiltra los contenedores que comparten una determinada imagen como ancestros. Expresado como <image-name>[:<tag>], <image id>, o <image@digest>
before o sinceFiltra los contenedores creados antes o después de una identificación o nombre de contenedor determinado
volumeFiltros que funcionan con contenedores que han montado un volumen determinado o un soporte de fijación
networkFiltros que funcionan con contenedores conectados a una red determinada
publish o exposeFiltra los contenedores que publican o exponen un puerto determinado. Expresado como <port>[/<proto>] o <startport-endport>/[<proto>]
healthFiltra los contenedores en función de su estado de salud. Uno de starting, healthy, unhealthy or none.
isolationSólo daemon de Windows. Uno de dafault, process o hyperv
is-taskFiltra los contenedores que son una “tarea” para un servicio. Opción booleana (true o false)

Para obtener una descripcion mas detallada revisar el siguiente enlace filtros.

Ejemplo con filtro name.

1
docker ps -a -f "name=XX"

XX hace referencia al nombre del contenedor

Eliminar un Contenedor

Para eliminar un contenedor que se encuentre detenido se ocupa el siguiente comando:

Opcion 1

1
docker rm ID_Contenedor

Opcion 2

1
docker rm Nombre_Contenedor

En el extraño caso que se desee eliminar un contenedor que este en ejecucion se debe forzar la eliminacion, mediante el siguiente comando:

1
docker rm ID_Contenedor/Nombre_Contenedor -f

Eliminar todos los contenedores

Elimina todos los contenedores que hemos creado.

En windows(Powershell)

1
docker rm $(docker ps -a -q)

Si tenemos algun contenedor en ejecucion se debe usar -f, para forzar la eliminacion o detener la ejecucion.

Historial Cambios Contenedor

Para saber que cambios,instalaciones o modificaciones a sufrido un contenedor, condera los archivos y directorios.

1
2
3
4
# Opcion 1
docker diff Nombre_Contenedor
#Opcion 2
docker container diff Nombre_Contenedor

Los cambios se muestran con una letra al principio indicando que se le realizo:

  • A(Adicion): Para archivo nuevo.
  • C(Modificacion): Para archivo modificado.
  • D(Eliminado): Para archivo eliminado

Puertos Docker

Los contenedores deben ser accesibles desde afuera del contenedor para poder utilizarse(una API por ejemplo o apache), para esto se ocupan los puertos, estos por defecto son privados y no es posible acceder a ellos, por lo tanto es necesario pasarlos a publico y mapearlo con un puerto del host/sistema que aloja el contenedor.

Convertir puertos en publico

al iniciar un contenedor y que este tenga luspuertos en estado publico y no privado, que es por defecto se le agrega el -P, al comando.

docker run -d -P nombre_imagen

Al ejecutar el comando la “P” debe ser mayuscula o entregara un error.

para confirmar que el puerto es publico, se ejecuta docker ps y mostrara una columna llamada PORTS.

Con P(Mayuscula), docker se encargara de mapear los puertos, por lo tanto el numero será aleatorio y p(minusula) para indicar un puerto en especifico.

Explicacion Columna Ports

0.0.0.0:24312->80/tcp

  • 0.0.0.0: se podra acceder por cualquier direccion IP que posea el equipo. Este puede ser cambiado a una direccion especifica si se posee mas de una IP en el equipo.
  • 24312: Es el puerto del equipo que aloja docker, y el cual esta mapeado con el puerto 80 del contenedor.
  • 80/tcp: es el puerto del contenedor.

Para acceder al contenedor que tenga habilitada esta configuracion, se agrega la siguiente direccion en el navegador localhost:24312. Si el contenedor fuera apache, nginx o similar.

crear un contenedor con un puerto especifico

Los puertos que se generan en los contenedores son aleatorios y parten del puerto 32768. Pero para poder tener un mayor control en este aspecto, es posible especificar este parametro, con el siguiente comando.

docker run -d -p 8080:80 Nombre_Imagen

Tambien es posible agregar un nombre personalizado al contenedor con –name..

docker run -d –name Nombre_personalizado -p 8080:80 nombre_imagen

Con P(Mayuscula), docker se encargara de mapear los puertos, por lo tanto el numero será aleatorio y p(minusula) para indicar un puerto en especifico.

Redes Docker

Por defecto mostrara 3 redes, previemente creadas, las cuales son;

  • Bridge: Es la red que utilizan los contenedores de manera predefinida(por defecto), a menos que se le indique lo contrario.
  • Host: los conteendores en est red solo podran ver e interactuar con el host principal, y no podran interactuar entre ellos. Se utiliza para contenedores aislados y que funcionen de manera independiente.
  • None: Es un contenedor que no tiene red y necesita una. Su driver es null.

La columna SCOPE, muestra si el funcionamiento de la red es de manera local, o conectada a otros equipos.

Ver lista de redes en docker

Para ver todas las redes en docker, se ocupa lo siguiente:

1
docker network ls

Obtener direccion IP de un contenedor

para obtener informacion mas especifica de los datos devueltos por inspect, se ocupa –format, y ocupa una plantilla de Golang.

1
docker inspect --format='{ {range.NetworkSettings.Networks} } { {.IPAddress} } { {end} }' ID/Nombre_Container

la funcion de ping para comprobar que el contenedor este en la misma red, no se encuentra disponible wn windows ni en mac.

Otra opcion para obtener la direccion IP, por ejemplo es.

1
2
3
4
5
6
7
8
# Estructura
docker inspect Nombre/ID_Contenedor | FindStr/grep Objeto_Buscar

# windows
docker inspect Nombre/ID_Contenedor | FindStr IPAd

#Linux
docker inspect Nombre/ID_Contenedor | grep IPAd

Para guardar la informacion de una inspeccion en un archivo seria de la siguiente manera.

1
docker inspect Nombre/ID_Contenedor > Nombre_Archivo.txt

Obtener informacion detallada de una red

Entrega informacion detallada de una red seleccionada, similar al obtenido con inspect para los contenedores, ademas de incluir los contenedores que estan asociadas a la red.

1
docker network inspect Nombre_red

Para obtener el nombre de la red, puede coupar el comando docker network ls

Mostrara los contenedores que esten conectados y en ejecucion en la red que se esta inspeccionando.

Crear nueva red

Para crear una red nueva en docker se ocupa.

1
docker network create Nombre_Red

La red tipo bridge que uno crea posee mas caracteristicas que la que se encuentra por defecto en docker.

Si no se especifica un driver en especifico en la red que se esta creando este sera del tipo bridge. Esto se puede cambiar con –driver string.

Crear red con rango subnet

La direccion de subnet es de ejemplo.

1
docker network create --subnet=192.168.0.0/16

Asociar contenedor a red

Para ejecutar y asociar un contenedor a una red existente se ejecuta lo siguiente:

1
docker run -it --name Nombre_Contenedor --network Nombre_Red Imagen_Contenedor

El –network es el que asocia el contenedor creado, con la red especificada.

Para asociar un contenedor que ya esta en ejecucion se ocupa lo siguiente:

1
docker network connect Nombre_Red Nombre_Contenedor

Un contenedor puede estar conectado a multiples redes.

Para desconectar un contenedor de una red es:

1
docker network disconnect Nombre_Red Nombre_Contenedor

Enlazar contenedor

Se puede enlazar de dos maneras.

  • Bridge(Red por Defecto)

Una manera de realizar el enlace es mediante –links, aunque no es recomendable, ya que perdera soporte con el tiempo. Y es recomendable cuando se usa la red por defecto.

Ejemplo

Primero es necesario ejecutar un nuevo contenedor con una imagen que posea entorno interactivo

1
docker run -it --rm --name Nombre_contenedor Nombre_Imagen

Para saber que ip, posee el contenedor linux, se ocupa el siguiente comando

[XXXX@XXX ~]# cat /etc/hosts

Para conectarlo finalmente se ocupa el siguiente comando.

1
docker run -it --rm --name Nombre_contenedor --link Nombre_contenedor_destino:alias_contenedor_destino Nombre_Imagen 
  • El –rm no es necesario de ser el caso, ya que al terminar de utilizar el contenedor este se eliminara automaticamente. Lo mismo para -it, es opcional.

  • Los conteendores que se desean enlazar deben poseer el –name, para facilitar el proceso.

  • Cuando se desea realizar para contenedores que esten en otra red, no es necesaria esta opcion.

  • Tambien se ocupa para comprobar que el entorno esta funcionando de manera correcta.

  • Si el contenedor no se creo con –link no podra reconocer el enlace a otros contenedores mediante el nombre o el alias, solo por la direccion IP. Osea es unidireccional en este modo.

  • Red Perzonalizada

Para agregar un contenedor a una red personalizada se puede ocupar.

1
docker run -d --name Nombre_Contenedor --rm --network Nombre_Red Nombre_imagen

El –rm es opcional, ayuda para no juntar contenedores detenidos.

Para poder acceder al contenedor:

1
docker exec -it Nombre_Contenedor bash

Borrar Red

para borrar una red ya creada se ocupa.

1
docker network rm Nombre_Red

No es posible borrar una red que tenga contenedores asociados.

Volumenes en Docker

Es un componente de docker importante, por varias razones que se presentan a continuacion;

  • Una de ellas y la mas importante es que ayuda a que la informacion de los contenedores sea Persistente.
  • Permite respaldar o migrar informacion de manera facil.
  • Estos funcionan en windows y linux por igual.
  • Un volumen puede estar conectado a varios contenedores.
  • Se puede agregar informacion a un volumen, por medio de un contenedor, antes que por un usuario.
  • Los volumenes se administran mediante Docker.
  • Se pueden usar y administrar de manera remota.

Crear Volumen

Una forma sencilla de crear un volumen , es al momento de crear un contenedor.

1
docker run -it -v Carpeta_Volumen --name Nombre_Contenedor Nombre_Imagen bash

La carpeta_volumen es donde guardara la informacion en el volumen, ejemplo “/informacion”.

El lugar donde se crea, es por defecto docker/volumenes, pero puede perzonalizarse la ubicacion de ser necesario.

Listar Volumen

Para ver la lista de volumenes creados se ocupa:

1
docker volume ls

Se podra ver el driver y el nombre del volumen, si no se especifica este ultimo, se generara un codigo aleatorio para el nombre.

Obtener informacion de volumen

Para obtener informacion relacionada al volumen deseado se ocupa lo siguiente;

1
docker volume inspect ID/Nombre_Volumen

Se obtendra informacion, como fecha de creacion, tipo de driver, punto de montaje(direccion de carpeta que almacena los datos), el nombre, entre otros.

Crear un directorio compartido(Carpeta)

Al crear un volumen la direccion que se genera de manera automatica no es la mas “sencilla” con la que se puede trabajar ejemplo:

/var/lib/docker/volumes/XXXXXXXX000XXXXXXXXXXXX/_data

Asi que para compartir recursos(Archivos, Carpetas, Etc)entre la maquina que aloja los contenedores y los mismo contenedores, de manera sencilla es especificandolo desde el inicio al crear el contenedor, como se muestra a continuacion:

1
2
3
4
docker run -it -v Direccion_Maquina_Host:Direccion_Contenedor --name Nombre_Contenedor Nombre_Imagen

#Ejemplo
docker run -it -v /root/carpeta1:/carpeta1

Es recomendable realizarlo al momento de crear un contenedor.

Se asocia el directorio entre contenedor y la maquina que lo aloja, por lo tanto no se podria considerar un volumen esto se muestra como “HostConfig/Binds” al revisar los datos del contenedor

Compartir Volumen entre contenedor

para compartir un volumen entre dos contenedores.

Primero creamos el contenedor con el volumen, el cual vamos a compartir

1
docker run -it -v /datos --name Nombre_Contenedor Nombre_Imagen bash

Despues creamos el segundo contenedor, el cual se conectara al volumen del conteendor creado anteriormente:

1
docker run -it --name Nombre_Contenedor --volumes-from Nombre_Contenedor1 Nombre_Imagen bash

El contendor1, es el contenedor ya creado al cual queremos acceder a su volumen con este segundo contenedor.

Tambien es posible conectarse al ultimo contenedor creado que accedio a dicho volumen, en vez de hacerlo con el primer contenedor.

No es posible realizar esta accion directamente al volumen, es necesario que primero se encuentre un contenedor iniciado y conectado a dicho volumen para poder realizar esta accion.

Crear Volumen de forma independiente(Nombre Personalizado, permiso de lectura, uso windows)

Nombre Personalizado

En vez de ocupar un nombre que se genera de manera automatica, podemos ocupar uno personalizado creado por el usuario, de la siguiente manera:

1
docker volume create Nombre_Volume

Para asociarlo a un contenedor se ocupa como ejemplo lo siguiente:

1
docker run -it --name Nombre_Contenedor Nombre_Volumen:Nombre_Directorio Nombre_Imagen bash 

Permiso Lectura

Para que un contenedor no pueda realizar modificaciones en un directorio y solo realice lectura, se le agrega **:ro** al Nombre_Directorio.

1
docker run -it --name Nombre_Contenedor Nombre_Volumen:Nombre_Directorio:ro Nombre_Imagen bash 

Uso windows

Si se desea realizar lo mismo pero en windows, se ocupa de la siguiente manera:

1
2
3
docker run -it --name Nombre_Contenedor -v Nombre_Directorio:Nombre_Volumen Nombre_Imagen bash 
#Ejemplo
docker run -it --name ubuntu7 -v C:\\Users\\XXXX\\dir1:volumenDocker ubuntu bash

En windows se debe ocupar la ruta completa, ademas de cambiar el ”/” por ”\\“

Se debe tener la contraseña del equipo para que docker pueda acceder, ademas de los permisos en firewall.

Borrar Volumen Especifico

Para borrar un volumen se ocupa:

1
docker volume rm ID/Nombre_Volumen

Para poder eliminar exitosamente el volumen no puede terner asociado o que sea dependencia de un contenedor.

Borrar volumen inactivos o no asociados

Para eliminar volumenes que ya no esten en uso por almenos un contenedor o hayan quedado sin haber sido eliminados.

1
docker volume prune

Mostrara un mensaje de advertencia para confirmar la accion.

Manipulacion de Imagen y Contenedor

Modificar Imagen

Una de las primeras opciones a ocupar para crear una imagen es mediante la modificacione de conteendores.

Para modificar una imagen primero se tiene que crear un contenedor, a partir de la “imagen base”, por ejemplo ubuntu:

1
docker run -it --name Nombre_Contenedor Nombre_Imagen bash

Al tener el contenedor ejecutando, posteriormente se instala los softwares requeridos/solicitados(/necesitados?), y al final al dejar el contenedor como se desea.

Crear Imagen

Para crear una imagen con un contenedor modificado se puede ahccer de manera automatica o manual, en este caso se mostrara la manera manual.

1
docker commit ID/Nombre_Contenedor Nombre_Nueva_Imagen:tag

si no se especifica el tag, agregara latest de manera automatica.

DockerFile

Es un archivo de configuracion que permite construir imagenes de manera automatica.

Esta formado por un conjunto de instrucciones, que contiene para construir la imagen.

Ejemplo Hello-Word

1
2
3
FROM scratch
COPY hello /
CMD ["/hello"]

Crear imagen con Dockerfile

Para empezar se crea un archivo llamado Dockerfile(Se respera mayusculas).

Estructura basica:

  • FROM: Carga la imagen Base/Inicial.
  • RUN: Comando que se desea ejecutar.

Dockerfile no puede poseer comando interactivo.

Ejemplo

1
2
3
FROM XXXXX
RUN apt-get update
RUN apt-get install -y XXXXX

Posteriormente se ejecuta lo siguiente para crear la nueva imagen.

1
2
3
docker build -t Nombre_Imagen:Tag .Directorio
# Ejemplo
docker build -t imagen_nueva .

-t es para nombrar la nueva imagen

El .Drectorio es donde puede encontrar la url donde esta el dockerfile o se desea copiar algo nuevo. Este debe estar en el directorio donde se encuentra dockerfile si solamente aparece un .(punto). Ademas puede ser una direccion de internet.

En caso de estar en windows y crear un contenedor de linux mostrara la siguiente advertencia.

ADVERTENCIA DE SEGURIDAD: Está creando una imagen de Docker desde Windows contra un host que no sea Docker de Windows. Todos los archivos y directorios añadidos al contexto de construcción tendrán permisos ‘-rwxr-xr-x’. Se recomienda volver a comprobar y restablecer los permisos de los archivos y directorios sensibles.

Comando RUN

Para ejecutar multiples comandos en una misma capa en la imagen se ocupa &&, ejemplo:

Dockerfile

1
2
3
4
5
FROM Ubuntu
RUN apt-get update
RUN apt-get install -y python
RUN echo 1.0 >> /etc/version && apt-get install -y git \
    && apt-get install -y iputils-ping

Para los que no saben la \ sirve para que siga ejecutando la linea siguiente.

Comando CMD

Permite indicar el comando por defecto del contenedor, Puede haber muchos CMD en un Dockerfile, pero el ultimo es el que cuenta, por lo tanto lo recomendable es tener UNO por Dockerfile.

En resumen sirve para iniciar un comando.

1
2
3
4
5
6
7
8
9
10
FROM XXXXX
RUN apt-get update
RUN apt-get install -y XXXXX
CMD XXXXXXXXXXXXXXXX

# Ejemplo
FROM XXXXX
RUN apt-get update
RUN apt-get install -y XXXXX
CMD echo "XXXXXXXXXXXXXX"

El XXXXXXXX es el texto que podriamos ingresar y podra mostrar en la terminal.

Tambien permite colocar corchetes, para ejecutar como exec en vez de bash, en resumen formato JSON.

1
2
3
4
5
6
7
8
9
10
FROM XXXXX
RUN apt-get update
RUN apt-get install -y XXXXX
CMD [XXXXXXXXXXXXXXXX]

# Ejemplo
FROM XXXXX
RUN apt-get update
RUN apt-get install -y XXXXX
CMD ["echo", "Mensaje a Mostrar"]

Esta ultima manera permite ejecutar como exec, para asi evitar posibles errores al ocupar un bash. Ademas se evita el tener que depender del bash de un conteendor, ya que es seguro que se pueda ejecutar exec de docker.

Entrypoint

Es similar a CMD, ya que permite ejecutar algo cuando de inicia un contenedor, con la diferencia que el comando ejecutado con entrypoint se ejecutara siempre no es un comando “opcional”, a diferencia de CMD.

Y al igual que CMD solo se puede tener uno por Dockerfile.

En el ejemplo se mostrara el dockerfile configurado para ambos casos.

Ejemplo Dokerfile CMD

1
2
3
4
FROM imagen
RUN apt-get update
RUN apt-get install -y ALGO
CMD ["/bin/bash"]

Ejemplo Dokerfile Entrupoint

1
2
3
4
FROM imagen
RUN apt-get update
RUN apt-get install -y ALGO
ENTRYPOINT ["/bin/bash"]

Ejemplo de ejecucion dockerfile

1
2
3
4
5
6
7
# Ejemplo CMD 
[XXXX@XXX ~]# docker run -it --rm Nombre_Imagen ls
bin dev home lib64 mnt proc run srv tmp sys etc

# Ejemplo ENTRYPOINT
[XXXX@XXX ~]# docker run -it --rm Nombre_Imagen df -h
/bin/df: /bin/df: cannot excute binary file

Con el CMD es posible sustituir el comando que se ingreso.

Como se explico entrypoint siempre ejecutara el comando que se le coloco.

Se recomienda ocupar el modo exec(JSON), para ejecutar comando con entrypoint.

Workdir

Este comando permite el poder determinar el directorio de trabajo para otros comandos ejemplo entripoint, run, etc.

Este comando puede estar multiples veces en un Dockerfile.

Ejemplo

1
2
3
4
5
6
7
8
9
FROM imagen
RUN apt-get update
RUN apt-get install -y ALGO
RUN mkdir /info
WORKDIR /info
RUN touch archivo1.txt
WORKDIR /info2
RUN touch archivo2.txt
ENTRYPOINT ["/bin/bash"]

Al crear el contenedor he ingresar a la bash, se encontrara en el ultimo directorio creado.

[XXXX@XXX ~]# docker run -it --rm Nombre_Imagen
root@XXXXXXXXXXXX:/info2#

En resumen permite crear datos o componentes en carpetas especificas.

COPY-ADD

COPY

Permite copiar archivos de la maquina host a un contenedor. Ejemplo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM imagen
RUN apt-get update
RUN apt-get install -y ALGO

##WORKDIR##
RUN mkdir /info
WORKDIR /info
RUN touch archivo1.txt
WORKDIR /info2
RUN touch archivo2.txt

##COPY##
COPY index.html .
COPY app.log /info

##ENTRYPOINT##
ENTRYPOINT ["/bin/bash"]

el punto(.) en COPY hace referencia al ultimo directorio creado

El primer COPY copia el archivo index.html en /info2 a eso se refiere el punto(.).

El segundo COPY, copia el archivo app.log en la carpeta /info

Copy acepta metacaracteres.

ADD

copia o lleva ficheros o carpetas al contenedor. similar a COPY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM imagen
RUN apt-get update
RUN apt-get install -y ALGO

##WORKDIR##
RUN mkdir /info
WORKDIR /info
RUN touch archivo1.txt
WORKDIR /info2
RUN touch archivo2.txt

##COPY##
COPY index.html .
COPY app.log /info

##ADD##
ADD docs docs
ADD a* /info/
ADD f.tar .

##ENTRYPOINT##
ENTRYPOINT ["/bin/bash"]

En el primer ADD cuando se coloca una ruta como docs es relacionada al ultimo workdir ejecutado(info2), en resumen si la carptea docs no se encuentra en la carpeta info2, creara dicha carpeta(/info2/docs) y copiara su contenido.

En el segundo ADD agrega todos los archivos que empiecen con “a” a la carpeta designada en resumen acepta metacaracteres(a*)

ADD a diferencia de COPY puede copiar el contenido de el archivo comprimido f.tar al directorio especificado.

ADD tambien tiene la opcion de traer cosas desde una URL, ejemplo archivos.

ENV

Es posible utilizar variables con ENV, a demas la manera mas simple de ocupar variables es al momento de crear un contenedor.

1
2
3
4
5
6
7
8
9
# Opcion 1
docker run -it --rm -v [Argumento] Nombre_Imagen
# Opcion 2
docker run -it --rm --env [Argumento] Nombre_Imagen

# Ejemplo 1
docker run -it --rm --env x=10 Nombre_Imagen
# Ejemplo 2
docker run -it --rm --env x=`pwd` Nombre_Imagen

Es posible pasar comandos.

Ejemplo Ejecucion

1
2
3
[XXXX@XXX ~]# docker run -it --rm -e x=`pwd` Nombre_Imagen
root@XXXXXXXXXXXX:/info2#echo $x
/root/XXXXXXX

XXXXXX Nombre carpeta aloja proyecto

En un archivo Dockerfile se podria hacer de la siguiente manera.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
FROM ubuntu
RUN apt-get update
RUN apt-get install -y python
RUN echo 1.0 >> /etc/version && apt-get install -y git \
    && apt-get install -y iputils-ping

##WORKDIR##
RUN mkdir /info
WORKDIR /info
RUN touch archivo1.txt
WORKDIR /info2
RUN touch archivo2.txt

##COPY##
COPY index.html . 
COPY app.log /info

##ADD##
ADD docs docs
ADD a* /info/
ADD f.tar .

##ENV##
ENV dir=/datos dir1=/datos1
RUN mkdir $dir && mkdir $dir1

##ENTRYPOINT##
ENTRYPOINT ["/bin/bash"]

Al revisar se podra ver las carpetas creadas y agregadas al registro env, del contenedor.

ARG

Permite poner variables, es similar a env, pero arg permite recibir variables al momento de construir algo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
FROM ubuntu
RUN apt-get update
RUN apt-get install -y python
RUN echo 1.0 >> /etc/version && apt-get install -y git \
    && apt-get install -y iputils-ping

##WORKDIR##
RUN mkdir /info
WORKDIR /info
RUN touch archivo1.txt
WORKDIR /info2
RUN touch archivo2.txt

##COPY##
COPY index.html . 
COPY app.log /info

##ADD##
ADD docs docs
ADD a* /info/
ADD f.tar .

##ENV##
ENV dir=/datos dir1=/datos1
RUN mkdir $dir && mkdir $dir1

##ARG##
ARG dir2
RUN mkdir $dir2

##ENTRYPOINT##
ENTRYPOINT ["/bin/bash"]

dir2 da un error al no tener un valor

Para solucionar el error generado por falta de informacion en dir2, se agrega dicha informacion faltante al momento de construir la imagen.

1
docker build -t Nombre_Imagen --build-arg dir2=/datos2 .

Con esto no va a generar error

es posible pasar mas de una variable. Cada variable debe incluir el –build-arg

EXPOSE

Permite exponer puertos, se le indica que un puerto en especifico es publico al crear una imagen.

1
2
3
##EXPOSE##
RUN apt-get install -y apache2
EXPOSE 80

Esto instala apache y le asigna el puerto 80.

De igual manera al crear el contenedor se debe asignar el puerto ejemplo, -p 8080:80.

VOLUME

Permite crear volumenes de manera automatica a traves del dockerfile.

1
2
3
4
5
6
7
8
9
10
11
##EXPOSE##
RUN apt-get install -y apache2
EXPOSE 80
ADD entrypoint.sh /info2

##VOLUME##
ADD paginas /var/www/html
VOLUME ["/var/www/html"]

##CMD##
CMD /info2/entrypoint.sh

Comparte la misma direccion el volumen y el contenedor.

Recordar que los volumenes son externos al contenedor

Docker Hub

Es un repositorio de images donde encuentras imagenes creadas por empresas(repositorios oficiales) y otras creadas por usuarios.

Subir imagen a Docker HUB

Para poder subir la imagen primero se agrega la cuanta con el siguiente comando.

1
docker login

Pedira la cuenta de usuario y su contraseña respectiva. Al logearse correctamente aparecera Login Succeeded, y va a durar mientras este el terminal abierto o la coneccion funcionando.

Para subir imagen se ocupa docker push. Docker hub solicita un nombre “especial”, para el repositorio al no ser una imagen oficial(ubuntu), por lo cual nuestra imagen seria.

1
docker image tag Nombre_imagen:TAG NombreUsuario/Nombreimagen:tag

con esto se cambia el nombre a uno adecuado para docker hub. ejemplo

1
docker image XXXX:1 usuariodocker/XXXX:1

Posteriormente, se realiza el docker push

1
docker push usuarioDocker/Nombre_Imagen:TAG

Docker Compose

Es un servicio que “orquesta” servicios o componentes, mediante un archivo llamado docker-compose.yml que contiene instrucciones para crear los enlaces entre contenedores que contengan servicios(Base de datos, BackEnd, FrontEnd, etc.).

En resumen, permite gestionar/simplificar una arquitectura de manera sencilla, ejemplo el Stack MEAN (MongoDB, Express, Angular, Nodejs).

Instalar Docker Compose

Docker Compose ya esta instalado en windows, al instalar docker, para mac y linux se realiza manualmente, para mas detalles ver documentacion.

Docker-compose - Comandos

docker-compose up

Sirve para iniciar compose, con la configuracion del archivo docker-compose.yml

1
docker-compose up

docker-compose ps

Entrega informacion similar a docker ps, muestra los contenedores que conforman un servicio y su estado

1
docker-compose ps

docker-compose images

Permite ver las imagenes que se utilizan para los contenedores.

1
docker-compose images

docker-compose config

Permite saber si el archivo docker-compose.yml es correcto.

1
2
3
4
5
6
7
8
# Muestra la informacion contenido dentro del archivo.
docker-compose config

# Muestra solo los errores.
docker-compose config -q

#Muestra los servicios del archivo.
docker-compose config --service

Para ejecutarlo de manera correcta se debe estar en la carpeta donde se encuentra dicho archivo.

docker-compose start

Permite iniciar los contenedores que componen un servicio.

1
docker-compose start

docker-compose logs

Permite ver los logs(registros de sucesos que hizo el servicio incluye notas, warning, errores, etc.) de un servicio en especifico.

1
docker-compose logs Nombre_Servicio

docker-compose top

Muestra los procesos mas pesados de un servicio.

1
docker-compose top Nombre_Servicio

docker-compose pause

Se puede pausar de manera temporal, los contenedores y servicios que se esten ejecutando en docker.

1
docker-compose pause

Para volver a activarlos, se ocupa.

1
docker-compose unpause

docker-compose restart

reinicia los servicios.

1
docker-compose restart

Se debe ejecutar con cuidado ya que es posible que pierda, servicios.

docker-compose stop

Para detener los servicios que actualmente se ejecutan en compose.

1
docker-compose stop

docker-compose rm

Sirve para eliminar servicios que se esten ejecutando en compose.

1
docker-compose rm

docker-compose down

Detiene los servicios, ademas borra los servicios, contenedores, redes. Para eliminar los volumenes asociados al servicio que se estaba ejecutando, se ocupa docker volume prune.

Estructura fichero Docker-Compose

El fichero docker-compose.yml consta de una estructura que similar a la siguiente.

  • Servicio: Es para especificar la version de docker donde se lanzara docker-compose.
  • Services: Se colocan todos los servicios que contendra compose, con un nombre que pueda ser identificable. Todos los servicios que se agregen al docker-compose deben tener el comando ‘build’ o ‘images’

Ejemplo

version: '3'
services:
      web:
         build: .
         ports:
         - "5000:5000"
         volumes:
         - .:/code
         - logvolume01:/var/log
         links:
         - redis
      redis:
          image: redis
volumes:
  logvolume01: {}

El punto en build es la ubicacion del dockerfile, en este caso se encuentra en la misma carpeta que el docker-compose.

Link al igual que en los contenedores es para unirlo a una red especifica.

Construir Docker-Compose(Construir servicios)

Primero se crea el archivo docker-compose.yml con las instrucciones. Ejemplo

1
2
3
4
5
6
version:'3'
services:
  nginx:
  image: nginx:stable-alpine
  ports:
  - "80:80"

Despues se construye con el comando

1
2
3
4
# Construir servicios
docker-compose up
# Modo Background
docker-compose up -d

Se recomienda ejecutarlo en modo background con el comando -d Docker Compose va a crear una red nueva por defecto si no se le especifica.

Listar micro servicios

Al igual que con los contenedores uno puede listar los micro servicios de docker-compose, con el siguiente comando.

1
docker-compose ps

Enlazar contenedores, servicios, puertos y variables.

Se creara un micro servicio, mas completo.

Ejemplo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
  wordpress:
    image: wordpress
    environment:
      WORDPRESS_DB_HOST: dbserver:2222
      WORDPRESS_DB_PASSWORD: 123456
    ports:
      - 8080:80
      depends_on:
      - dbserver
  dbserver:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - 2222:2222

dbserver en WORDPRESS_DB_HOST es el nombre del servicio de la base de datos mariadb, configurada mas abajo.

Con depends_on se le indica como se inician los contenedores, en este caso wordpress tiene una dependencia de dbserver, por lo cual este ultimo inicia primero.

Docker construira una red personalizada para los contenedores sin necesidad de indicarlo, esto sucede en las ultimas versiones de docker. En caso contrario se tendra que ocupar el --link.

Estructura:

  • Servicios: Son los contenedores que se crean, basados en las especificaciones que se entregan.
    • wordpress
    • dbserver
  • Puertos: Puntos de coneccion, salida y entrada de datos de los contenedores.
    • wordpress - puerto 80 (dependen del servicio dbserver)
    • dbserver - puerto 3306
  • Enviroment: Son las variables que se le pueden entregar a las imagenes al momento de generar el contenedor.

Comando para ejecutar el archivo de docker-compose.yml

1
docker-compose up

Posteriormente acceder a localhost:8080

Volumenes en Docker Compose

Los volumenes en docker-compose, funcionan igual que en docker normal. La unica diferencia son los comandos y la manera en la que se manejan.

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3.2"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static
    ports:
      - 80:80
  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data"
volumes:
  mydata:
  dbdata:

volumen de nombre mydata esta asociado a la carpeta del volumen /data.

volumen de tipo bind ./static (el punto es donde esta docker-compose donde tendra una carpeta llamada static) es una carpeta en el equipo principal que estara escaneada que esta asociado/compartido con el directorio /opt/app/static que esta dentro del contenedor. Este es directorio completo. En resumen, el contenido de las dos carpetas es identico.

En la primera opcion se mapea el socket del equipo que aloja docker con el socket del contenedor

En el segundo dbdata(del equipo principal) esta mapeado con /var/lib/postgresql/data del contenedor. Este ultimo es nombre de volumen.

Para acceder al servicio web se puede ocupar.

1
docker-compose exec web sh

Estructura:

  • volumes: es la seccion de docker-compose donde se entregan las instrucciones para la crecion de los volumenes en un servicio.
  • type: Es donde se indica si es de typo volume o de tipo bind, la diferencia es que con volumen se crea un volumen especifico, en una ubicacion por defecto(/var/…) y el bind asocia una determinada carpeta del contenedor con una carpeta del equipo principal(host o maquina que aloja docker).
  • volume: es donde se pueden colocar algunas opciones en este caso nocopy:true, el cual permitira que el contenedor no sea copiado.
  • Volumes: Se declaran los volumenes que se han creado para confirmar cuales son los volumenes.

Redes en Docker Compose

Creacion y configuracion de un stack con docker-compose, mostrando algunas opciones disponibles en la seccion de red.

Ejemplo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: '3.3'

services:
  app:
    image: client
    container_name: client
    build: .
    ports: 
      - 80:3000
    environment:
      - MONGO_URI=mongodb://mongo_db/sample
    depends_on: 
      - db
    networks: 
      - net3
  db:
    image: mongo:3.0.15
    container_name: mongo_db
    volumes:
      - ./db:/data/db
    networks:
      net3:
        aliases:
          - "mongo_db"
          - "mongo_server"
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
networks:
  net3:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.238.0/24
      -
        subnet: 2001:3984:3989::/64

Estructura:

  • Servicio APP:
    • Image: nombre de la imagen que se va a crear.
    • Container_image: Nombre del contenedor
    • Build: es para especificar que construya la imagen, a partir del dockerfile que se encuentra en la misma carpeta(por eso el punto).
    • Ports: los puetos de acceso, en este caso el puerto 80 del host, se conecta al puerto 3000 del contenedor.
    • Environment: es una variable de entorno que solicita la imagen, en este caso MONGO_URI, que apunta a la base de datos, en este caso la direccion proviene del nombre del contenedor de la base de datos.
    • Depends_on: son dependencias o requisitos previos para la ejecucion del contenedor en este caso que la base de datos se ejecute primero.
    • Networks: Se indica que red se va a ocupar, que va a ser propia y no generada de manera automatica. Su configuracion va a ser por defecto
  • Servicio DB:
    • Volumes: se crea un volumen mapeado ./db:/data/db
    • Networks: el net3 no llevara guion, ya que llevara una mayor configuracion. ya que llevara propiedades especificas.
    • Aliases: Es un nombre alternativo para el servicio dentro de la red, es el nombre con el que se va a reconocer el servicio dentro de la red.
    • ipv4_address/ipv6_address: Ip fija para el servicio.
  • Networks: Configuracion de la red que se va a ocupar.
    • net3: es el nombre de la red.
    • driver: bridge(predefinido), none.
    • enable_ipv6: es para habilitar la opcion de ipv6 en una version anterior a 3.3 de docker compose, si se cumple una version posterior a 3.3, esta la opcion de eliminar.
    • ipam: sirve para configurar una subred de ipv4/ipv6. Si se ocupan ip fijas en los servicios es obligatorio el ipam para poder configurar y que funcionen las redes a ocupar.
      • driver: el driver de la subred, en este caso la opcion es default.
      • config: contiene las ip de la subnet de la red, de la ipv4 y ipv6.

Cambiar Nombre de Archivo y Proyecto de docker-compose

Ocupar fichero docker-compose con otro nombre

Para personalizar el nombre de docker compose basta con renombrar el archivo y ejecutar el siguiente comando:

1
docker-compose -f Nuevo_Nombre_Archivo.yml

Cambiar nombre Proyecto

Al ejecutar docker-compose siempre ocupara el nombre del la carpeta que contiene los archivos, en caso de querer cambiarlos se puede ocupar lo siguiente

1
docker-compose -p Nombre_Proyecto

Ejecutar de manera correcta nuevo docker-compose

Para ejecutar docker-compose con las nuevas opciones mostradas anteriormente, se ejecuta de la siguiente manera.

1
docker-compose -f Nuevo_Nombre_Archivo.yml -p Nombre_Proyecto up

agregar -d si se desea ejecutarlo en modo background

Ver lista con nuevo nombre de proyecto

Al momento de ejecutar docker-compose ps, no deberia mostrar nada si se ocupo el -p, ya que buscara los servicios que contengan el nombre de la carpeta, que contiene el archivo. para poder ver estos servicios con nombre personalizado se ejecuta de la siguiente manera.

1
docker-compose -p Nombre_Proyecto ps

este cambio se aplicara a la mayoria de los comandos de docker-compose, por lo tanto se le debe agregar -p Nombre_proyecto para poder ejecutar de manera correcta, dichos comandos. Si no se realiza de esta manera, volvera a bsucar con el nombre de la carpeta contenedora del archivo.

Docker Registry

Es una “alternativa” a hub.docker.com, el cual permite crear nuestro propio repositorio de imagenes privado, esto permite la posibilidad de poder usarse a nivel de empresas, en su propia red privada.

Por lo tanto permite crear multiples registros, el cual cada uno sera un “hub” privado. Ademas cada uno de los registros puede almacenar imagenes diferentes dependiendo de las necesidades.

Crear registro de imagenes

Para crear un registro es necesario descargar la imagen Registry de docker hub, y ejecutar un contenedor con este.

Descargar imagen

1
docker pull registry:latest

Crear contenedor

1
docker run -d -p 5000:5000 --name Nombre_Contenedor registry

El numero del puerto es modificable a gusto del usuario.

Subir/Bajar imagen a un registro

Es similar a subir una imagen a docker hub, con la diferencia que en vez de colocar nuestro usuario, colocamos la direccion/Nombre Equipo y puerto del registro.

Crear Tag

Como requisito previo al igual que en HUB, es necesario ocupar docker tag.

Ejemplo

1
2
3
4
# Estructura
docker tag Imagen_Etiquetar Direccion/Nombre:Puerto/Nombre_Imagen
# Ejemplo
docker tag ubuntu localhost:5555/nuevo-ubuntu

No es recomendable ocupar localhost, solo referencia para ejemplo.

para buscar la imagen es docker images Nombre_Imagen ejemplo docker images localhost:5555/* y mostrara todos las imagenes que esten en el registro.

Subir imagen

Ejemplo subir imagen a registro

1
2
3
4
5
6
# HUB Docker
docker push nombre_usuario/nombre_imagen:tag
# Registro
docker push Direccion/NombreMaquina:Puerto/Nombre_Imagen:tag
# Ejemplo "Real"
docker push localhost:5555/nuevo-ubuntu:latest

Docker sabra a que repostiorio subira la imagen. por lo tanto no es un dato que pida.

Descargar imagen

Es igual como a cualquier imagen.

1
2
3
4
5
docker pull nombre_usuario/nombre_imagen:tag
# Registro
docker pull Direccion/NombreMaquina:Puerto/Nombre_Imagen:tag
# Ejemplo "Real"
docker pull localhost:5555/nuevo-ubuntu:latest

El tag por defecto es latest.

Almacenamiento Docker Registry

Registry al igual que cualquier imagen de docker, se puede especificar la opcion de donde se almacena la informacion de la imagen, con el volumen.

Por defecto es donde docker guarda los volumenes

1
/var/lib/docker/volumes/xxxxxxxxx/_data

para saber la direccion y mas informacion se ocupa docker inspect Nombre_imagen

Para dejar las imagenes en un lugar especifico, se realiza lo mismo que en cualquier imagen.

1
2
3
4
5
6
7
8
9
10
# crear carpeta
mkdir /Nombre_carpeta_equipo_local
# Comando para crear contenedor con volumen relacionado
docker run -d --name Nombre_Contenedor -p 5000:5000 -v /Nombre_carpeta_equipo_local:/Nombre_carpeta_equipo_local Nombre_Imagen

# Ejemplo

mkdir /Registros

docker run -d --name registro_ejemplo -p 5000:5000 -v /Registros:/var/lib/registry registry

“Destination” es el que contiene la direccion /var/lib/registry, en la informacion del contenedor, y es donde por defecto registry guarda las imagenes.

Docker Swarm

Permite crear un cluster de multiples nodos docker, permitiendo disponer de manera replicada, los “servicios”(Componente que se replica) que creamos, en varios nodos del cluster. Ademas de funcionar de manera independiente.

Cada nodos es un entorno como vps, server dedicado o similar.

  • Servicios Swarm: El servicio es en resumen un contenedor que se esta ejecutando, como cuando se inicia un docker-compose y se especifican los servicios.

Crear Cluster (Docker Swarm)

No es posible colocar mas de un nodo dentro de un equipo (fisico, vps, etc.).

No es posible mas de un nodo en un equipo ya que es necesario, una direccion IP.

El siguiente comando:

1
docker swarm

permitira la gestion del cluster.

1
docker services

Permite crear servicios y tareas dentro del cluster.

Finalmente para crear un Cluster se ocupa lo siguiente:

1
2
3
4
5
# Inicio Normal
docker swarm init

# Inicio al poseer multipes IP
docker swarm init --advertise-addr xxx.xxx.xx.xxx

Cambiar las X por la direccion IP seleccionada.

Inicia un nuevo cluster, y asigna el equipo como maetro, ademas de entregar un token, que permite unir los equipos esclavos al maestro.

En caso de que se inicie en una VM(Ya que se dispone de multiples IP), se le debe asignar la direccion IP para iniciar correctamente.

Para evitar problemas iniciar swarm en equipos con IP estaticas, no dinamicas.

Al ejecutar el comando entregara la siguiente informacion:

  • Mostrará que es manager(maestro) o esclavo.
  • entregara el comando con el cual se podra agregar un worker, un equipo esclavo al maestro, este incluye un token.

Se recomienda copiar el comando incluyendo el token, en caso de perderse, se puede obtener con el comando presentado a continuacion:

1
docker info

Donde mostrara, que docker swarm esta activado, ademas de algunas otras opciones como las siguientes:

  • NodeID
  • Is Manager
  • ClusterID
  • Managers
  • Nodes
  • workers

    El swarm que esta como maestro(manager), tambien se puede ocupar como worker(esclavo). NO SE RECOMIENDA

Finalmente, en caso de perder el comando se ocupa:

1
docker swarm join-token worker

Añadir nodos

Para ver la informacion relacionada a los nodos se ocupa docker info en la seecion swarm.

Nodo 1 (Manager/Maestro)

Para añadir los nodos primero se debe iniciar el docker swarm con la direccion IP, especifica en caso de poseer mas de una, en el PRIMER nodo a ocupar.

1
2
3
4
# Inicio general
docker swarm init
# Inicio con IP especifica
docker swarm init --advertise-addr xxx.xxx.xx.xxx

Reemplazar las X con los numeros de la direccion IP.

Se copia el docker swarm join --token XXXX(Las XXXX son el resto de la informacion del token).

Nodo 2 o posterior(Worker/Esclavo)

En los nodos que desea unir al primero se debe tener docker instalado y agregar el docker swarm join --token XXXX que se obtuvo previamente.

Al realizar, el ingreso anterior se mostrara el mensaje This node joined a swarm as a worker, confirmando la union al primer nodo.

Trabajar con Nodos/Cluster

Para poder trabajar de manera comoda y obtener mejor informacion, en vez de ocupar el comando docker info, se ocupa el docker node, con el cual permitira algunas de las siguientes opciones:

  • Listar/Ver nodos de un cluster.
  • Inspeccionar uno o mas nodos.
  • Promover un nodo a Manager desde el modo Worker

Comandos Nodo

Docker node ls

permite listar los nodos worker que estan unidos al manager, entregando la siguiente informacion.

  • ID (Numero de identificacion unico)
  • HOSTNAME (Muestra lso nombres del nodo, ejemplo nodo1, nodo2)
  • STATUS
  • AVAILABILITY
  • MANAGER STATUS
  • ENGINE VERSION

Docker node inspect

para saber la informacion de un nodo especifico se ocupa.

1
2
3
4
docker node inspect HOSTNAME

# Ejemplo
docker node inspect nodo2

HOSTNAME es el numero del nodo, ejemplo nodo 3.

Para obtener la informacion que entrega mas ordenada y no en formato JSON.

1
docker node inspect --pretty HOSTNAME

Docker node promote

Para administar los manager(puede existir mas de uno), y colocar otro nodo existente como lider, ejemplo en caso de que se caiga el servicio.

1
2
3
docker node promote HOSTNAME
# Ejemplo
docker node promote node6

Promueve el nodo6 a manager.

En el caso de que se promueva un nodo(Que seria el segundo nodo o posterior), posteriormente ademas del nodo lider(El inicial el cual en el status manager aparecera como Leader), este aparecera como Reachable(Alcanzable), esto confirma que en caso de que el primer nodo que esta como lider se caiga, o se le quite su status de Leader, el nodo6 tendra el control.

–>docker node ls

HOSTNAMEMANAGER STATUS
nodo1Leader
nodo2 
nodo3 
nodo4 
nodo5 
nodo6Reachable

Docker node Demote

Quita el privilegio de manager de un nodo y lo pasa a worker.

1
2
3
docker node demote HOSTNAME 
# Ejemplo
docker node demote node1

En caso de quitar un nodo de lider, este no aceptara comandos ya que no posee los privilegios (en este caso, Leader), por lo tanto uno debe conectarse al nodo lider, que este disponible(con docker node ls se puede saber quien es el lider).

–>docker node ls

HOSTNAMEMANAGER STATUS
nodo1 
nodo2 
nodo3 
nodo4 
nodo5 
nodo6Leader

Docker Swarm leave

Este comando sirve para que un nodo determinado se de, dé baja de un cluster existente.

1
docker swarm leave

Este comando es necesario que se ejecute en el nodo, el cual se desea dar de baja del cluster.

No sale del cluster solo, se da de baja, pero posteriormente es posible ingresarlo con el comando JOIN.

HOSTNAMESTATUS
nodo1Ready
nodo2Down

Docker node rm

Sirve para sacar un nodo de manera permanente de un cluster existente.

1
2
3
docker node rm HOSTNAME
# Ejemplo
docker node rm nodo3

En caso, de querer añadir nuevamente el nodo al cluster, se ocupa docker swarm join-token worker/manager(Se puede elegir como se desea agregar un nodo a un cluster worker/manager), en el nodo lider y asi obtener el token(el comando completo, el cual se pegara y ejecutara en el nodo a agregar), en el nodo que se desea agregar.

Servicios (Docker Swarm)

Para trabajar con servicios se utiliza docker service. Y se deben ejecutar en el nodo Leader. Ya que otros nodos no permitiran su ejecucion.

Crear servicio (docker service create)

Crear un servicio se utiliza el comando: docker service create.

Pero es posible personalizar el servicio desde la linea de comando al crear dicho servicio.

1
2
3
4
docker service create --replicas  --name NOMBRE_SERVICIO IMAGEN_DOCKER COMANDO_EJECUTAR

# Ejemplo
docker service create --replicas 1 --servicio0 alphine-linux ping google.com

Descripcion:

  • –replicas: es la cantidad de veces que el servicio se ejecutara en los nodos disponibles.
  • : Es el numero de replicas, con el cual se ejecutara.
  • –name: El nombre que llevara el servicio el cual se va a crear.
  • Imagen_Docker: La imagen “base” que se ocupara para el servicio.
  • Comando: Lo que se ejecutara en la imagen del servicio.

Ver servicios (Docker Service ls)

Para ver los servicios que estan en ejecucion se utiliza: docker service ls.

IDNAMEMODEREPLICASIMAGEPORTS
xxxXXxxxServicio0Replicated1/1alphine-linux 

Ver Informacion Servicio especifico (docker service ps)

Para Sirve para ver mas informacion de un servicio en especifico como el nodo en el que se encuentra, hace cuanto tiempo se creo dicho servicio, etc.

1
2
3
docker service ps NOMBRE_SERVICIO
# EJEMPLO
docker service ps Servicio0

Ver Informacion sobre ejecucion de un servicio (docker service logs)

Para poder ver lo que ha realizado un servicio en ejecucion, se debe obtener el log de dicho servicio, con el siguiente comando:

1
2
3
docker service logs NOMBRE_SERVICIO
# Ejemplo
docker serveice logs Servicio0

Ver toda la informacion relacionada a un servicio (docker service inspect)

funciona como cualquier otro inspect.

1
docker service inspect --pretty Nombre_Servicio

–pretty sirve para ver de manera mas ordenada la informacion que se entrega.

Escalar Servicio

para escalar, replicar o repetir un servicio, se ocupa:

1
2
3
4
docker service scale Nombre_Servicio=Nuevo_N°_Replicas

# Ejemplo
docker service scale Servicio0=3

cada vez que se inicia un servicio este es una tarea.

Solo se puede escalar el servicio el numero de nodos, mientras los recursos lo permitan.

Si no posee recursos suficientes, entregara un error.

Si se desea disminuir el numero de replicas se vuelve a ejecutar el comando anterior con un nuevo numero de replicas, pero en este caso un N° inferior.

1
docker service scale Service0=1

Borrar un servicio

Para borrar un servicio se ocupa:

1
2
3
4
docker service rm Nombre_Servicio

# Ejemplo
docker service rm Service0
This post is licensed under CC BY 4.0 by the author.