Guia Virtualización - Docker

Table of Contents

1. Docker

1.1. Conceptos

1.1.1. Imagen

  • Es como una plantilla que se usa de modelo para crear contenedores
  • Pueden crearse varios contenedores a partir de una imagen
  • No se pueden modificar

1.1.2. Contenedor

  • Se crean a partir de una imagen
  • Puede ser una aplicación, un sistema operativo, …

1.2. Instalación

# en manjaro
sudo pacman -S docker
# en ubuntu
# apt install docker

# Create the docker group.
sudo groupadd docker
# Add your user to the docker group.
sudo usermod -aG docker ${USER}
# relogear ò reiniciar

# verificamos si anda
# descargando la imagen de hello-world
docker run hello-world
# para listar los contenedores en ejecución
docker ps

# para correr o descargar && instalar una version ligera de linux con el tag 3.12
# - Si ya teniamos la imagen de la distribución Alpine, se creará un nuevo contenedor
# por cada vez que ejecutemos esta linea
docker run alpine:3.12
# podemos asignar un nombre a cada nuevo contenedor
# - facilita tener varios contenedores de la misma distribución
# - nos evitamos utilizar los ID de los contenedores, y usar solo el nombre
docker run --name miLinux alpine:3.12

# iniciar en modo "interactivo" en la terminal al contenedor alpine
docker exec -it alpine:3.12 sh
# si el contenedor tenia algun nombre
docker exec -it miLinux sh
# para listar archivos de la imagen
# seguido al nombre del container y del tag, puedo mandarle comandos al container
docker exec alpine:3.12 ls -l

# muestra los containers instalados
docker image ls | head
# muestra los ultimos comandos de todos los containers (y su hash en la 1ra columna para versionar)
docker ps -a | head

# comitear un container (suponiendo que copiaste el hash al ejecutar "docker ps -a")
docker commit elHashDelContainer
# podemos verlo (copiamos el id)
docker image ls | head
# le asignamos un tag para diferenciar (suponiendo que asdasd123123 es el id)
docker image tag asdasd123123 miPrimerDocker

1.3. Comandos básicos

  • El parámetro ps es como en linux normal, muestra los procesos en ejecución por tanto mostrará los containers activos (en ejecución)

1.3.1. Lista de Comandos

Comando Descripción
docker start  
docker stop  
docker restart  
docker images  
docker run  
docker exec  
docker search algunContainer Buscar un container
docker images Listar containers ya instalados (entorno local)
docker ps Listar containers en ejecución
docker ps -a # -all Listar (all) todos los containers (activos/inactivos)
docker ps -l # -list Listar (list) últimos containers creados
docker restart IDdeAlgun Reiniciar un container (como si reiniciaras la maquina y sus servicios)
docker start IDdeAlgunContainer Iniciar el Container como proceso(y sus servicios)
docker stop IDdeAlgunContainer Detiene el Container como proceso(y sus servicios)
docker exec IdDeAlgunContainer Ejecuta un comando en un container (NO CREA UNO NUEVO)
docker run algunContainer algunComando Para ejecutar una linea comandos (y crea otro container)
docker rm -f IDdeAlgunContainer Para eliminar un container
docker rmi IDdeAlgunaImagen Para eliminar una imagen
docker run -it algunContainer /bin/bash Modo interactivo (via terminal) (Y CREA OTRO CONTAINER)
docker exec -it algunContainer /bin/bash Modo Interactivo (via terminal (NO CREA UNO NUEVO)
docker pull algunContainer Descargar o actualizarlo
docker pull algunContainer:unTag El tag puede ser una version especifica
docker inspect IDdeAlgunContainer Da información COMPLETA en formato JSON
docker rm $(docker ps -a -q) Remover todos los contenedores detenido
docker rm $(docker images -q) Remover todas las imagenes
docker kill $(docker ps -q) Mata el proceso de todos los contenedores en ejecución

1.3.3. Lista de parámetros

Parametro Forma Abreviada Descripción
detach d Correr contenedor en segundo plano
tty t (tty) Asigna una pseudo terminal al proceso
interactive i (STDIN) Mantiene el buffer de entrada abierto
  it Combinamos los parámetros para interactuar con con una pseudoterminal
port p Abrir puertos del contenedor
publish (?)  
volume v (Volumenes) Compartir directorios en el contenedor
mount    
     
link   Enlaza un contenedor con otro (ideal para servidores web)

1.3.4. Observaciones importantes

  • Si queremos acceder al container (NO CREAR UNO NUEVO) usamos docker exec -it IDdeAlgunaImagen bash (si usamos run se creará un nuevo container)
  • Siempre se crea un contenedor distinto cuando ejecutas una imagen con docker run -it IdAlgunaImagen bash
  • Podemos usar el comando docker run -it IDdeAlgunaImagen bash para crear un nuevo contenedor
  • Si queremos guardar cambios de un container, podemos versionarlo comiteando y pusheando los cambios en algun repositorio
Supongamos que tenemos un container de un ubuntu trusty (14.04) que ya tiene varios packages porque es el que usamos
(Ej. haskell, prolog, git, etc...) pero queremos probar un nuevo package o configuración
como sería instalar mysql, mongodb, etc.. sin que se vea afectado el que solemos usar.
Osea queremos uno de prueba, que sea idéntico al que usamos, donde instalemos cosas o probemos configuraciones del sistema operativo.

Entonces podemos correr el comando "docker run -it nombreImagen" para crear un nuevo container que tiene
lo mismo que al que apuntamos con el ID, si no funciona lo que queriamos instalar o no era
lo que necesitabamos borramos ese nuevo container y nos quedamos con el anterior

Observaciones:
Si estamos diciendo que esa imagen ya dispone de varios programas que nosotros instalamos,
es porque nosotros previamente hicimos un build de una imagen que disponga esos programas.
Para más información nos toca investigar sobre Dockerfile.

1.3.5. Crear Contenedores en primer y segundo plano

  1. Conceptos
    • Para crear contenedores que corran en segundo plano pasamos el parámetro -d al comando docker run
    • Para ejecutar contenedores que corran en segundo plano pasamos el parámetro -d al comando docker exec

    Al crear un contenedor en segundo plano, se ejecutará de fondo (osea por detrás de la terminal) de donde ejecutemos el comando docker run, pudiendo seguir utilizando esa terminal donde lo ejecutamos. (particularmente útil para correr servidores linux, base de datos, ….)

    Si no lo creamos en segundo plano, nos aparecerá en la terminal el resultado de ejecutar el contenedor. Si el contenedor era un servidor linux ó una base de datos, el ciclo de ciclo de vida del contenedor finalizará luego de ejecutar el sevidor o la base de datos. Sería como encenderlo, y luego apagarlo, sin poder darle uso. Teniendo que iniciar el contenedor nuevamente.

    Es decir si creamos un contenedor en primer plano (no le pasamos el parámetro -d) que ejecuta un comando ó tarea. Luego que esta tarea/comando se ejecutó, se detendrá la ejecución del contenedor. Por tanto no podremos ejecutar otro comando, a menos que iniciemos el contenedor con el comando docker start

    El comando docker run crea un contenedor que corra una tarea/comando El comando docker exec ejecuta en un contenedor ya existente una tarea/comando

    Si queremos crear un contenedor que tenga una distribución de linux, y podamos mandarle via terminal a ese linux comandos (ls, ps, …) ó acceder al linux con una pseudoterminal (modo interactivo)

    debemos habilitar en el comando docker run el modo de "pseudoterminal" con el parámetro -t (hace referencia a tty) para que luego podamos acceder con docker exec a la pseudoterminal de forma interactiva con el parámetro -i -t ó solo enviarle comandos (sin usar -i -t)

    Si usamos los parámetros -i -t en el comando docker run, habilitará la terminal, ejecutará el comando que le pasemos y entrará en el contenedor de manera interactiva

    # Creamos un contenedor con las siguientes características
    # -El puerto 8000 habilitado, y podamos acceder a ese puerto desde nuestro ordenador desde puerto 80 (se redirecciona)
    # -Con el nombre "miservidor"
    # -Que sea un linux con la distribución Debian booster
    # -Que podamos via terminal mandarles comandos (ls,ps,...), ó también acceder de manera interactiva
    # -Que se ejecute en segundo plano
    
    # Parámetros utilizados:
    # - t: Habilita la pseudoterminal, para enviar comandos o acceder de manera interactiva
    # - d: Corre el contenedor en segundo parámetro,
    # -- name: le asignamos un nombre para usar de referencia
    # - p puertoHost:puertoContenedor, abre un puerto para el contenedor
    #  (el segundo puerto es el que usa el contenedor, y el primero el que usaremos fuera de docker en nuestro ordenador)
    docker run --name miservidor -t -d -p 8000:80 debian:booster
    
    # ejecutamos un comando para listar los directorios de miservidor
    # sin necesidad de acceder al contenedor de manera interactiva (osea sin los parámetros -t -i)
    docker exec miservidor ls
    
    # accedemos al servidor de manera interactiva (parámetro -i) mediante una pseudoterminal (parámetro -t)
    # Observaciones:
    # - Según la distribución de linux, puede que en vez de escribir "bash" debas escribir "sh"
    # - Para salir del contenedor utilizar el comando "exit"
    docker exec -ti miservidor bash
    
  2. Referencias (de Issues)

1.3.6. Crear Imagenes

  1. Conceptos

    Podemos crear una imagen de un servidor web que tenga por defecto algunos lenguajes de programación como haskell, php, etc.. Ó que también tenga servicios de base de datos como sql, mysql, mongodb, etc.. y a partir de esas imagenes podemos crear contenedores.

    Tiene como ventaja no tener que configurar manualmente ni tampoco instalar todos los paquetes uno por uno, porque la imagen lo automatiza, y cada nuevo contenedor será idéntico.

    Además podemos crear contenedores para probar nuevos paquetes, que desconocemos si pueden generar alguna falla con el sistema operativo que tiene el contenedor.

    Por tanto si algo fallara, sólo tendriamos que borrar el contenedor y crear uno nuevo a partir de la imagen base de la que partimos para crear los contenedores.

  2. Referencias

1.3.7. Eliminar multiples Contenedores

  1. Ejemplos
    # listamos los contenedores en ejecución
    docker ps
    # otra manera de listar los contenedores en ejecución
    docker container ls
    
    # listamos TODOS los contenedores (también los inactivos)
    docker ps -a
    # otra manera de listar TODOS los contenedores
    docker container ls -a
    
    # para detener todos los contenedores
    # - el parámetro -aq genera y devuelve un listado de contenedores
    docker container stop $(docker container ls -aq)
    
    # eliminamos uno o varios contenedores por id
    # (El id lo podemos conocer cuando listamos los contenedores, es la primera columna)
    docker container rm idDeUnContenedor idOtroContenedor
    
    # eliminamos todos los contenedores inactivos
    docker container prune
    
    # eliminamos contenedores por uno o varios criterios
    # - borrar los que fueron creados hace mas de 12 horas
    docker container prune --filter "until=12h"
    
  2. Referencias Web - Extraoficiales

1.3.8. Eliminar multiples imagenes

Recordemos que para eliminar contenedores usamos el comando rm mientras que para remover imagenes es rmi

# listamos las imagenes para revisar el ID
docker images ls
# suponiendo que son varias imagenes se pueden agrupar en una linea
docker rmi a23bb4013216 a341b4013200 a24bb422226

1.3.9. Descargar ó Actualizar un Contenedor

# para descargar una imagen ó actualizar un container local ya existente
# el uso de tag es opcional
docker pull nombreAlgunContainer:tag

# usamos los tags para descargar ó actualizar a una versión específica
# sino especificamos, nos suele traer por defecto la última vesión (latest)

# usamos de tag el número de la versión
docker pull ubuntu:14.04 # es la distribución trusty de ubuntu
docker pull debian:10 # es la distribución buster de debian

# usamos de tag el nombre de la versión
docker pull ubuntu:trusty # 14.x
docker pull debian:buster # 10.x

1.3.10. Listar contenedores en ejecución e inactivos

# listar containers en ejecución
docker ps
# -l se refiere a "list"
docker ps -l # tiene el mismo resultado que no pasarle el parámetro -l

# lista todos los containers (los inactivos también)
# -a se refiere a "all"
docker ps -a

1.3.11. Acceder ó Iniciar/Detener ejecución de contenedores

  1. Conceptos
    • Iniciamos el contenedor ejecutando en la terminal docker start
    • Detenemos la ejecución con docker stop
    Si al crear el contenedor mediante *docker run*
    no le pasamos el parámetro -it, entonces no podremos acceder por terminal
    mediante este otro comando *docker exec -it IDdeAlgunContenedor bash*
    
    Porque el comando *run* como dice su nombre, ejecuta un comando cuando se inicie el contenedor
    si no le decimos que lo haga con el modo interactivo mediante una pseudoterminal (parámetros -i y -t)
    tampoco lo hará cuando se lo pasemos al comando *exec*
    
    Usando de referencia el ejemplo1, una vez que salgamos del modo interactivo con la pseudoterminal
    el contenedor se detendrá, y deberemos de iniciarlo nuevamente. 
    
    Si no queremos estar iniciando a cada rato el contenedor
    podemos adicionar el parámetro -d para ejecutarlo en un segundo plano
    
    Observación:
    Tenenemos un apartado que detalle un poco más sobre el parámetro d,
    esto es solo a modo de aclaración, de que se detendrá el contenedor una vez que salgamos del modo interactivo.
    
    # iniciar un container
    # se le puede pasar el nombre, o el ID
    # docker start nombreContainer
    # docker start idContainer
    docker start miUbuntu
    
    # detener un container en ejecución
    # docker stop nombreContainer
    # docker stop idContainer
    docker stop miDebian
    
    # entrar al modo interactivo via terminal
    # docker exec -it nombreContainer
    # docker exec -it idContainer
    docker exec -it alpine sh
    
    # Según la distribución de Linux puede que la ruta /bin/bash no aparezca
    # docker exec -it algunContainer sh
    # docker exec -it algunContainer /bin/bash
    docker exec -it ubuntu bin/bash
    

1.3.12. Versionar containers

  1. Conceptos

    Suponiendo que ya habiamos creado en la página de dockerhub un repositorio llamado distroalpine podemos realizar los ejemplos de crear tag, o subir los cambios.

  2. Crear un tag a nuestro container local
    docker tag a24bb4013296 neverkas/distroalpine:3.12
    
    # los datos que aparecen son
    # - usuario (dueño) del repositorio: neverkas
    # - nombre del repositorio: distroalpine
    # - tag (version en este caso): 3.12
    
  3. Subir los cambios
      docker push neverkas/distroalpine:3.12
    
      # los datos que aparecen son
      # - usuario (dueño) del repositorio: neverkas
      # - nombre del repositorio: distroalpine
      # - tag (version en este caso): 3.12
    
    docker tag local-image:tagname new-repo:tagname
    docker push new-repo:tagname
    

1.3.13. Abrir Puertos

Usamos el parámetro -p

1.3.14. Referencias Web Extraoficiales

1.4. Estados

Los estados que puede tener un contenedor son dos exited (inactivo) ó up (en ejecución)

Estado Descripcion
exited Inactivo
up En ejecución

1.5. Configurando Puertos

1.6. Configurando Volumenes

1.6.1. Conceptos

Los volumenes por defecto se crean en la ruta /var/lib/docker/volumes

1.6.2. Ejemplos

# creamos un nuevo volumen
# /datos es una ruta nuestro ordenador
# /www es una ruta que está dentro del contenedor
docker run -it -v /datos:/www/ --name mi-server alpine:latest sh

1.6.3. Referencias Youtube

1.7. Probando Distribuciones Linux

1.7.1. Probando Alpine Edge

# https://www.emacswiki.org/emacs/Evil
# https://orgmode.org/manual/Installation.html

# corremos el container la version Edge (el tag)
# si no existe lo descarga
docker run alpine:edge
# instalar git
apk add git
# instalar emacs
apk add emacs
# 1. listar packages (entrar al emacs)
# M-x packages-list
# 2. instalar org mode (entrar a emacs )
# M-x package-install RET org RET
# 3. instalar evil mode (tratè con el list-packages pero no aparecìa)
git clone https://github.com/emacs-evil/evil.git
mv evil ~/emacs.d/

# descargar el theme dark dracula
https://github.com/dracula/emacs.git
mv /emacs/dracula-theme.el ~/emacs.d/themes/dracula-theme.el

Agregar lo sig al ~/.emacs para activar el vim mod y el theme dark dracula

; con esto agregamos el modo vim
(add-to-list 'load-path "~/.emacs.d/evil")
(require 'evil)
(evil-mode 1)

; cargamos el theme dracula dark
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
(load-theme 'dracula t)

1.7.2. Probando Debian Buster

# 1. Descargamos el OS Debian
# - Si ya lo teniamos lo actualizará
# - Seguido de los dos puntos se puede escribir o no una etiqueta/tag
# para especificar una distribución ó versión ó característica
docker run debian:buster

# 2. Accedemos al container
# - el parámetro "i" hace referencia a "Modo Interactivo"
# - el parámetro "t" hace referencia a "tty" una pseudo-terminal
# osea interactuar de forma directa con el SO, via terminal y ejecutar instrucciones
docker run -it debian:buster /bin/bash

1.7.3. Probando Ubuntu Trusty

# entramos a la terminal (se creará un nuevo contenedor "distinto" cada vez que ejecutamos este comando)
# docker run -it ubuntu:trusty bin/bash

# descargamos la distribución ubuntu versión trusty (14.04)
docker pull ubuntu:trusty

# creamos una carpeta en nuestro HOST y la compartimos
mkdir ~/Docker
# Hacemos un punto de montaje
# 1.Para asignar el nombre al contenedor usamos --name
# 2.Para referirnos al volumen usamos -v
# 3.La ruta (debe ser absoluta agregando ~) del HOST a compartir será ~/Docker
#   (si no es absoluta, se creará un volumen que se comparte entre los demás containers, a docker volume)
# 4.La nueva ruta que se creará en el Container /opt/share
# 5.La imagen a utilizar es ubuntu:trusty
# 6.En la bash shell
# docker run -v ~/Docker:/opt/share -it ubuntu:trusty /bin/bash
docker run -it --name test1 -v ~/Docker:/opt/share ubuntu:trusty bash

# IMPORTANTE:
# Recorda que cada vez que ejecutes "run" se creará un nuevo contenedor
# en este caso se montará un punto de montaje entre Host/Un nuevo Contenedor llamado "test1"
# cada vez que quieras hacer cambios en ese "contenedor"
# acceder con docker exec -it test /bin/bash

# comprobamos
docker ps -a | grep test1
# iniciamos el proceso del container
docker start test1
# corremos el comando "modo interactivo" en el container "test1" y accedemos a la bash shell
# (si usamos run, se creará un nuevo contenedor, la idea es utilizar este y no se creará otro)
docker exec -it test1 /bin/bash

apt-get update
apt-get install swi-prolog -y

# versionamos para guardar el estado del container
docker ps -a # para revisar el id del container
docker commit 5b13ee15d1f1 neverkas/ubuntu-trusty # suponiendo que ese es el ID
docker push neverkas/ubuntu-trusty

# revisamos el nuevo contenedor
docker ps -a

# salimos del contenedor
exit
# si queremos revisar la version de prolog instalada sin entrar al container
docker exec test1 swipl -v
# si queremos acceder al container y ejecutar prolog
docker exec -it test1 swipl
exit # salimos
# si queremos acceder solo como en la bash shell
docker exec -it test1 /bin/bash

# IMPORTANTE:
# - Al hacer commit se creará una nueva imagen, que apunta al repositorio publico "neverkas/ubuntu-trusty"
# el usuario seria neverkas (LA PRIMERA VEZ, LAS PROXIMAS APUNTARAN SIEMPRE AL MISMO CONTAINER)
# seguido del nombre de container que se guardará como local (sería una imagen)

1.7.4. Ubuntu

Cada versión de la distribución lleva un nombre distinto

Version Nombre
14.04 Trusty
16.04 Xenial
18.04 Bionic

Referencias

1.8. Configurando Redes Docker

1.8.1. Conceptos

1.8.2. Crear Red

docker network create mi-red
# crea una red con un rango 
docker network create --subnet=192.168.0.0/16 mi-red2

nmcli con
ip a | more
docker inspect mi-red > mi-red.txt

1.8.3. Referencias

1.9. Ejemplos

# Creamos una red para conectar el contenedor
docker network create --driver=bridge red-jelou

# creamos el contenedor llamado prueba1 que tenga linux alpine edge
# montamos un volumen llamado datos-jelou que usará
# le asignamos la red que creamos previamente
# y que ejecute el comando "sh" al iniciar (caso contrario no podemos acceder)
docker run --name=prueba1 -it -v datos-jelou:/opt --network=red-jelou alpine:edge sh

# analizamos el punto de montaje, osea donde se creó el volumen en el Host
# - el volumen se puede compartir entre otros contenedores
docker volume inspect datos-jelou

# analizamos la red,
# que otros contenedores la utilizan
docker network red-jelou

Una breve explicación de los comandos ejecutados

run

-it

-v jelou:/opt

–network=red-jelou

alpine:edge

2. Dockerfile

2.1. Conceptos

2.2. Comandos básicos

2.2.1. (BUILD) Crear Imagen

La idea del dockerfile es crear imagenes, para luego crear contenedores

# usamos el comando build
# seguido del parámetro -t
# seguido de la imagen y un tag que especifique la versión (opcional)
# por último la ruta donde está el Dockerfile, si se deja el punto se refiere a la ruta actual
docker build -t nombreImagen:algunTag .

2.2.2. (COPY) Copiar archivos

  • A diferencia del comando ADD no descomprime los archivos (Ej. .jar, .gz,..) que quizás no es la intención,

y los mueve a la ruta destino.

FROM debian

# resources/app.jar es una ruta que pertenece al host, son los archivos y directorios que queremos copiar
# /app es una ruta que está dentro del contenedor de docker, es donde se copiarán los archivos
COPY resources/app.jar /app

# este comando se ejecuta al iniciar el contenedor
# y ejecuta el archivo .jar que copiamos al contenedor
CMD ["java", "-jar", "app/app.jar"]

2.2.3. (ADD) Descargar y Descomprimir archivos

  • Puede descargar archivos de url de internet y agregarlos a una ruta del contenedor
  • Permite descomprimir archivos (comportamiento quizás no deseado si se confunde con el comando COPY)
FROM alpine:edge

# ADD rutaDelHost rutaEnElDocker
# 1. La primera ruta puede ser de un archivo, o directorio del Host,
# es el que vamos a copiar al Contenedor
# 2. La segunda ruta, está dentro del contenedor, y es donde copiaremos los archivos
ADD default /etc/ngnix/sites-available/default
ADD php-conf.conf /etc/php/7.2/php-conf.conf
Una breve explicación del código anterior

1. El primer parámetro de ADD es la ruta origen del HOST, es decir el ordendor donde ejecutamos nuestro docker
2. El segundo parámetro es la ruta destino al Contenedor, donde se agregarán los directorios/archivos

2.2.4. (ENTRYPOINT) Pasar scripts por parámetro

  • Podemos ejecutar scripts que ejecuten comandos de configuración (Ej. apache, php, …)
FROM alpine:edge

# no es necesario especificar la extensión .sh
ENTRYPOINT ["start-container"]
#!/usr/bin/env bash

# este script será ejecutado por la linea ENTRYPOINT en el Dockerfile

# 1. Verificamos si existe el directorio composer en la ruta actual
if [ ! -d ./composer ]; then
# 2. Si no existe, lo creamos
    mkdir ./composer
fi
# 3. Le asignamos permisos de lectura y escritura
chmod -R ugo+rw ./composer

2.2.5. (CMD) Comandos por defecto

  • Se ejecuta mientras corre el contenedor
  • Para ejecutar varios comandos por defecto utilizar un arreglo entre corchetes
  • Si pasamos un parámetro al docker run o por la terminal, pisará el de CMD

El siguiente sería un archivo Dockerfile con las configuraciones

FROM alpine:edge

CMD echo "Hola"
#CMD ["/bin/echo", "hola"]
#CMD ["echo", "hola"]

Y luego desde la terminal podemos ejecutar los siguientes comandos

# para crear la imagen
docker build -t miservidor .

# para correr el contenedor en base a la imagen creada
docker run -it miservidor

2.2.6. (RUN) Ejecutar comandos

  • Para escribir varios comandos en una capa, utiliza el slash invertido

Supongamos que queremos un linux con la distribución ubuntu

FROM ubuntu:trusty

RUN apt-get install -y emacs

Supongamos que queremos un linux con la distribución alpine

FROM alpine:edge

RUN apk add --force emacs

2.3. Ejemplos

Cada linea del Dockerfile es cacheada en memoria, por lo que si en una linea decimos que

Utilidad del slash invertido es evitar tener varias capas que se guardan en caché, y luego generan problemas.

Si por ejemplo en una linea hacemos que instale algunos paquetes (Ej. apt-get install git emacs vim) y encima de esta linea agregamos que instale otros paquetes (Ej. apt-get install java haskell) es posible que no se ejecute esta segunda

FROM ubuntu:trusty

MANTAINER jelou

RUN apt-get install -y \
    git emacs \
    && apt-get clean \
    && rm -rf /tmp/* /var/tmp/* \
          && echo "8.8.8.8 # google dns" >> /etc/hosts
ADD ./images www/html/images

EXPOSE 80
CMD ["Hola"]

3. Docker Compose

3.1. Conceptos

  • Manejar varios contenedores en un archivo
  • Se puede combinar con Dockerfile

3.2. Instalación y Configuración

En la distribución Manjaro, intenté de instalar con pacman -S docker-compose pero tiraba error por falta de packages.

Por tanto decidí realizar la instalación mediante pip install docker-compose que tuvo éxito.

# ES IMPORTANTE LA TABULACION, si no crashea
version: "2.1"
services:
  irc:
    # imagen que usará de base
    image: inspircd/inspircd-docker
    # le asignamos un nombre de referencia
    container_name: irc
    # puertos que usaremos
    # puertoHost:puertoContenedor
    # - puertoHost es el que usaremos en el host, donde corremos docker
    # - puertoContenedor el que usa la aplicación dentro del contenedor
    ports:
      - "6667:6667"
    # montamos un volumen, con directorios/archivos que apareceran en el contenedor
    # carpetaDelHost:rutaDelContenedor
    # - carpetaDelHost, contiene lo que aparecerá en el contenedor
    # - carpetaDelContenedor, es la carpeta que se creará y aparecerá en el contenedor
    volumes:
      - configs:/CONFIGURACIONES/
    # para configuraciones personalizadas
    environment:
      INSPIRCD_SERVER_NAME: "irc.localhost"
      INSPIRCD_SERVER_DESCRIPTION: "Probando..."
# 
volumes:
  configs:

3.3. Comandos Básicos

# corremos el docker-compose.yml de la ruta actual
# up: crea el contenedor y lo ejecuta
# -d: lo ejecuta en segundo plano
# si no usamos -d, no podremos seguir utilizando la sesión de la terminal
docker-compose up -d

# acceder via terminal
# en compose-docker los contenedores son servicios
docker-compose exec nombreDelServicio sh
# alternativa
docker-compose exec nombreDelServicio bash

# muestra los contenedores (en la ruta actual)
docker-composer ps

3.4. Ejemplos

version: "2.1"
services:
  # entramos con docker exec -it miServidorAlpine sh
  ngnix:
    image: nginx:alpine
    container_name: miServidorAlpine
    # restart: always
    ports:
      - "81:80"
    volumes:
      # - este volumen, se crea dentro de /var/lib/docker/volumes
      # y apunta a la ruta del contenedor que aparece seguido de los dos puntos 
      # - data hace referencia al volumen que configuramos al final de este archivo
       - data:/usr/share/nginx/html:ro
      # el directorio "application" tiene que estar en la misma ruta
      # que este archivo Docker-compose.yml
      #- ./application:/usr/share/nginx/html:ro
  # redis:
  #   image: redis:alpine
  #   networks:
  #     - appnet

# networks:
#   appnet:
#     driver: "bridge"

# se va a montar un volumen en la ruta de docker del host
# el nombre tendrá como prefijo el nombre del directorio donde está este docker-compose
# seguido del nombre que le asignemos, en este caso data
volumes:
  data:
    driver: "local"

3.5. Referencias

3.5.1. Referencias Web Oficiales

4. Docker Tips

4.1. Ejecutar contenedores al iniciar el sistema

Si tenemos algún problema en nuestro ordenador (se reinicia, se apaga, cuelga, error, etc..) podemos usar el parámetro always

version: "3.9"
services:
  redis:
    image: redis:alpine
    # se reinicia con un máximo de 10 intentos
    restart: on-failure:10
  ngnix:
    image: ngnix:alpine
    # se reinicia siempre
    restart: always

4.2. Conocer el timestamp de los logs

Con el comando docker logs nombreContenedor nos muestra un historial de logs del contenedor, pero podemos conocer en detalle cuando sucedió utilizando el parámetro t

docker logs --tail=10 -t nombreAlgunContenedor

# con --tail=10, indicamos que nos muestre los últimos 10 eventos del historial de logs
# con -t, indicamos que queremos conocer el timestamp de cada evento sucedido

5. Servicios Básicos

5.1. Nginx

Como servidor http, similar a apache2 pero con menos configuración

5.2. Duckdns

5.2.1. Conceptos

  • duckdns para enmascarar por asi decir la ip, como no-ip

5.3. Inspircd

5.3.1. Conceptos

Para crear un servidor irc

5.3.2. Referencias Web Oficiales

5.3.3. Referencias Youtube

6. Glosario

  1. Daemon
  2. Curl
  3. Sandbox
  4. Kubernetes
  5. Timestamp
  6. Runtime cpu

Author: jelou

Created: 2021-10-19 mar 03:18

Validate