Guia Virtualización - Docker
Table of Contents
- 1. Docker
- 1.1. Conceptos
- 1.2. Instalación
- 1.3. Comandos básicos
- 1.3.1. Lista de Comandos
- 1.3.2. Referencias
- 1.3.3. Lista de parámetros
- 1.3.4. Observaciones importantes
- 1.3.5. Crear Contenedores en primer y segundo plano
- 1.3.6. Crear Imagenes
- 1.3.7. Eliminar multiples Contenedores
- 1.3.8. Eliminar multiples imagenes
- 1.3.9. Descargar ó Actualizar un Contenedor
- 1.3.10. Listar contenedores en ejecución e inactivos
- 1.3.11. Acceder ó Iniciar/Detener ejecución de contenedores
- 1.3.12. Versionar containers
- 1.3.13. Abrir Puertos
- 1.3.14. Referencias Web Extraoficiales
- 1.4. Estados
- 1.5. Configurando Puertos
- 1.6. Configurando Volumenes
- 1.7. Probando Distribuciones Linux
- 1.8. Configurando Redes Docker
- 1.9. Ejemplos
- 1.10. Referencias
- 2. Dockerfile
- 3. Docker Compose
- 4. Docker Tips
- 5. Servicios Básicos
- 6. Glosario
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.2. Referencias
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
- Conceptos
- Para crear contenedores que corran en segundo plano pasamos el parámetro
-d
al comandodocker run
- Para ejecutar contenedores que corran en segundo plano pasamos el parámetro
-d
al comandodocker 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 comandodocker exec
ejecuta en un contenedor ya existente una tarea/comandoSi 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 condocker 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 comandodocker 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
- Para crear contenedores que corran en segundo plano pasamos el parámetro
- Referencias (de Issues)
1.3.6. Crear Imagenes
- 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.
- Referencias
1.3.7. Eliminar multiples Contenedores
- 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"
- 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
- 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
- Iniciamos el contenedor ejecutando en la terminal
1.3.12. Versionar containers
- 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.
- 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
- 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
1.10. Referencias
1.10.1. Referencias Web Extraoficiales
- Best practices for writing Dockerfiles - docs.docker.com
- https://docs.docker.com/engine/reference/commandline/container_prune/
- How to save data - github.com/rocker-org
- Como instalar y usar Docker en Ubuntu 18.04 - Digitalocean.com
- Tutorial Docker - Instalación y primeros pasos - Ionos.es
- Cleaning up containers - colorfield.de
- Understanding Docker - Blog hipolabs
- Docker commit - Docker.com
1.10.2. Referencias Issues
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
3.5.2. Referencias Youtube
3.5.3. Issues Comunes
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.2.2. Referencias
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
- Daemon
- Curl
- Sandbox
- Kubernetes
- Timestamp
- Runtime cpu