Introdución a Docker

As catro cousiñas de Docker
CURSO DE ESPECIACILIZACIÓN EN IA E BIG DATA

Instalación

  • Con WSL ou en GNU/Linux Debian só o engine.
  • 
    sudo apt update
    sudo apt -y dist-upgrade
    sudo apt -y install curl
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh ./get-docker.sh
    sudo usermod -a -G docker $USER
    sudo su - $USER
    docker run hello-world
  • Instalando Docker Desktop directamente.
  • Unha alternativa a Docker é Podman e Podman Desktop.

Docker — Son catro cousiñas!

Catro cousiñas

Formato dos comandos

docker COUSIÑA COMANDO

Cousiñas: contedores, images, volumes, network.

Exemplos:

docker {image, volume, network} ls
docker {image, volume, network} rm ID
docker ps -a
docker rm ID

Imaxes

Imaxes

  • É unha OVA? É unha ISO?
  • Non, unha imaxe de docker.
  • Baixánse automáticamente de hub.docker.com.
  • Soportan tags! (versións para os amigos).
  • Podes baixalas dun repositorio propio.
  • Ou podes construilas a man: docker build.
  • Ou empregar save/load.
  • Non deben ter datos de usuario.

Descarga dunha imaxe

Formato

docker pull usuario/imaxe:tag

Exemplos

docker pull bitnami/moodle:latest
docker pull mongodb

Alias de: docker image pull

Exercicio. Xa!

Solución

docker pull alpine

Operacións con imaxes

Ver as imaxes descargadas en local

docker image ls

Borrar unha imaxe

docker image rm a_imaxe

Exercicio: Borra a imaxe de alpine e comproba que xa non está

docker image rm alpine
docker image ls
                    

save / load

⚠️ Lembra ter descargada/xerada/construida a imaxe

docker pull alpine

Garda no directorio actual no arquivo alpinito.tar

docker save -o alpinito.tar alpine

Xa podes borrar a imaxe do repo local

docker image rm alpine
docker image ls
                    

Recuperamos alpine do arquivo tar

docker load -i alpinito.tar

Creando unha imaxe cun Dockerfile


  FROM debian:latest
  LABEL maintainer="jfsanchez.es"
  
  ARG _DIR="/home/user"
  ARG _USER="user"
  
  # Base, actualizar e instalar prerequisitos
  RUN apt-get update; apt-get install -y locales ; apt-get dist-upgrade -y ; mkdir /var/run/sshd ; \
    localedef -i es_ES -c -f UTF-8 -A /usr/share/locale/locale.alias en_ES.UTF-8 ; \
      apt-get install -y curl wget gpg ca-certificates openssh-server openssh-client; rm -rf /var/lib/apt/lists/* ; dpkg-reconfigure --force openssh-server
  ENV LANG=es_ES.utf8
  
  #RUN update-rc.d ssh defaults ; systemctl enable ssh.service ; service ssh start
  
  #Configurar usuario y home
  RUN mkdir -p ${_DIR}/.ssh ; useradd ${_USER} -m -s /bin/bash ; chmod 0700 ${_DIR}/.ssh ; \
      chown -R ${_USER}:${_USER} ${_DIR}
  
  #WORKDIR /app
  WORKDIR ${_DIR}
  
  USER ${_USER}
  #Generar llave SSH tipo DSA (mala práctica así)
  RUN ssh-keygen -t ed25519 -N "" -C "user@docker" -f .ssh/id_ed25519 ; cp .ssh/id_ed25519.pub .ssh/authorized_keys ; chmod 644 .ssh/authorized_keys
  
  USER root
  RUN cp -r ${_DIR}/.ssh /root/ ; chown -R root:root /root/.ssh
  EXPOSE 22
  
  RUN service ssh start
  CMD ["/usr/sbin/sshd", "-D"]
  #ENTRYPOINT ["/etc/init.d/ssh", "start"]

Dockerfile
docker build -t jfsanchez/base:3 .

Contedores

Contedores

Lanzar o contedor coa imaxe hello-world (run)

docker run hello-world

Nomes vs identificadores

docker ps -a

Poñendo o nome a un contedor

docker run --name flanders hello-world

Tarefa rápida

  1. Mira con: docker ps -a os contedores finalizados e en execución.
  2. Borra todos os contedores co comando: docker rm IDENTIFICADOR_OU_NOME

Redirixir un porto

Sintaxe: -p PORTO_ANFITRIÓN:PORTO_CONTEDOR
docker run --name PORTOFINO \
  -p 8080:80 \
  --rm \
  nginx:latest
  1. Nun navegador pon: http://localhost:8080
  2. Vai á consola de docker e preme Ctrl+C
  3. Agora executa:
    docker ps -a
  4. Onde foi o contedor?

run en modo dettached (separado)

Parámetro: -d

docker run --name websrv \
  -p 8080:80 --rm \
  -d \
  nginx

Executa:

docker ps -a
docker stop NOME
docker ps -a

Tarefa rápida

  • Executa un novo contedor coa última imaxe/tag de ngnix (latest).
  • Ponlle de nome: enginex
  • Execútao en modo dettached(-d)
  • Redirixe o porto 8080 do anfitrión ao 80 do contedor.
docker run --name enginex -d -p 8080:80 nginx:latest

start/stop

  • Para o contedor anterior:
    docker stop enginex
  • Naufraga a: ⛔ http://localhost:8080
  • Mira os dockers en execución:
    docker ps
  • Onde foi?
  • Mellor mira se está nos parados:
    docker ps -a
  • Iníciao de novo:
    docker start enginex

Contedor con autoinicio

Opcións do parámetro

--restart

  • no ⇛ Por defecto, non autoinicia.
  • on-failure[:intentos] ⇛ So se falla.
  • always ⇛ Sempre, salvo parada manual (que agarda ata o próximo reinicio).
  • unless-stopped ⇛ Se o paramos, non o volve iniciar aínda que reinicemos docker.

Tarefa rápida

Crea un contedor (docker run) que...

  1. Se chame enginex (--name). Lembra parar (stop) e borrar (rm) o anterior.
  2. Se execute en modo dettached (-d).
  3. Redirixe o porto 8080 do anfitrión ao 80 do contedor.
  4. Que se autoinicie salvo que o paremos (--restart unless-stopped).
  5. Que teña a última imaxe/tag de ngnix (latest).

Solución

docker run --name enginex \
  -d \
  -p 8080:80 \
  --restart unless-stopped \
  nginx:latest

run en interactivo

Parámetro: --it

docker run --rm -it alpine sh

Pregunta rápida: Que facía --rm?

Solución: Borrar o contedor despois de que remate.

exec — Aproveitando o de dentro!

Creamos o contedor (servidor MariaDB)

docker run --name blondie \
  --env MARIADB_RANDOM_ROOT_PASSWORD=1 \
  --restart unless-stopped -d mariadb:latest
                    

Recuperamos o contrasinal de root

docker logs blondie

Conectamos empregando o cliente do contedor

docker exec -it blondie \
  mariadb -hlocalhost -uroot -p'CONTRASINAL_ESCAPADA'

Volumes

Volumes (-v)

  • Onde se almacenan os datos.
  • Un volume pode montarse simultáneamente en varios contedores.
  • Non se borran aínda que se borre o contedor.
  • Pódense borrar tódolos non usados con:
    docker volume prune

Creando e asignando un volume

Crear volume

docker volume create mariav

Listar volumes

docker volume ls

Crear o contedor cun volume

docker run -p 9906:3306 --name ginger \
  --env MARIADB_RANDOM_ROOT_PASSWORD=1 \
  -v mariav:/var/lib/mysql \
  --restart unless-stopped \
  -d mariadb:latest

Datos de proba

Buscar contrasinal root: GENERATED ROOT PASSWORD

docker logs ginger

Executar o cliente mariadb do docker

docker exec -it ginger \
  mariadb -hlocalhost -uroot -p'CONTRASINAL_LOGS'

Meter datos de proba


CREATE DATABASE contedor;
USE contedor;
CREATE TABLE volumen(
  id INT auto_increment PRIMARY KEY, 
  nome VARCHAR(52));
INSERT INTO volumen VALUES(1,'mariav');
QUIT;

A borrar! (ou non)

Parar e borrar o contedor

docker volume ls
docker stop ginger
docker rm ginger
docker ps -a
docker volume ls

Crear de novo o contedor

docker run -p 9906:3306 --name ginger \
  -v mariav:/var/lib/mysql --restart unless-stopped \
  -d mariadb:latest

Hai datos?

docker exec -it ginger \
  mariadb -hlocalhost -uroot -p'CONTRASINAL_LOGS' contedor
SELECT * FROM volumen;

Facendo limpieza

docker stop ginger
docker rm ginger
docker volume prune
docker volume ls

O volume non está a ser usado por ningún contedor.
Por que non se borrou automáticamente con prune?

Porque non é anónimo
(foi creado explícitamente cun nome)

docker volume rm mariav
docker volume ls

Outros tipos de montaxe

Bind dun directorio a outro

-v /home/usuario/anfitrion:/ruta/docker

Exemplo

docker run --name exemplo \
  -v /home/usuario/BBDD:/BBDD \
  --env MARIADB_RANDOM_ROOT_PASSWORD=1 \
  --restart unless-stopped \
  -d mariadb:latest

Mete algún arquivo en /home/usuario/BBDD

docker exec -it exemplo bash
ls /BBDD

Probando prune

O exemplo anterior debeu deixar alomenos un volume anónimo creado. Proba a borralo:
docker volume ls
docker volume prune
docker volume ls

Outras cousas interesantes de volumes

Ruta por defecto dos volumes: /var/lib/docker/volumes/

Son moi útiles para actualizar o software:

  1. Para o contedor.
  2. Borras o contedor.
  3. Creas outro contedor coa imaxe actualizada que empregue o mesmo volume de datos.

Redes

network

Ver as redes

docker network ls

Tipos de redes (drivers)

  • bridge
  • host
  • none
  • overlay
  • ipvlan
  • macvlan

Lanzar un contedor cunha rede

Parámetro: --network X

Redirección de portos

-p PORTO_ANFITRION:PORTO_CONTEDOR

Ver a IP dun contedor

docker inspect ID_OU_NOME
QR materiales

Jose Sánchez

Errare humanum est, sed perseverare diabolicum
Erros? / Errores? / Mistakes? →