Curso docker
1.- Instalación, ver documento del curso
2.- El comando que utilizamos para obtener la versión de Ubuntu es el siguiente: lsb_release -cs
3.- Saber si docker esta instalado: sudo docker version
4.- Crear un grupo llamado docker y añadirle usuarios:
sudo groupadd docker
sudo usermod -aG docker $USER
5.- Activar/desactivar arranque al inicio.
Para indicar que el servicio de Docker se inicie al arrancar la máquina, podemos indicarlo mediante los siguientes comandos:
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
Si lo que queremos es deshabilitar este arranque automático, podemos usar:
sudo systemctl disable docker.service
sudo systemctl disable containerd.service
Para iniciar/parar/reiniciar los servicios manualmente, podemos usar:
sudo systemctl start/stop/restart docker.service
sudo systemctl start/stop/restart containerd.service
6.- Saber la versión de docker que hay instalada y correr un contenedor de prueba:
docker version
docker run hello-world
7.- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PlayGround para probar Docker online sin instalarlo: https://labs.play-with-docker.com/
“docker run” crea y arranca un contenedor. Cada vez que lo lanzas, vuelve a crear otro contenedor y lo arranca.
Para crear un contenedor sin arrancarlo (recordamos, “docker run” crea y arranca), existe el comando “docker create”.
Para arrancar/parar un contenedor ya creado (recordamos, “docker run” crea y arranca), existen los comandos “docker start”, “docker stop” y “docker restart”.
xxxxxxxxx
Borrado de contenedores
TRABAJANDO CON IMÁGENES
Ver las imágenes tenemos almacenadas localmente usando:
docker images
docker images odoo
Imágenes disponibles en el registro (Docker Hub) con esa palabra:
docker search ubuntu
Almacenar imágenes localmente desde el registro sin necesidad de crear un contenedor:
docker pull alpine:3.10
Eliminar imágenes almacenadas localmente:
docker rmi ubuntu:14.04
Borrar un contenedor por identificador o nombre:
docker rm IDENTIFICADOR/NOMBRE
Borrar todos los contenedores (que estén parados), de forma similar a como vimos en el anterior punto, es la siguiente:
Paso 1 (opcional): paramos todos los contenedores:
docker stop $(docker ps -a -q)
Paso 2: borramos todos los contenedores:
docker rm $(docker ps -a -q)
Eliminando todas las imágenes y contenedores con docker system prune -a
Paso 1 (opcional): paramos todos los contenedores:
docker stop $(docker ps -a -q)
Paso 2: borramos todos los contenedores:
docker system prune -a
CREANDO NUESTRAS PROPIAS IMÁGENES A PARTIR DE UN CONTENEDOR EXISTENTE
Por ejemplo, si tenemos un contenedor con nombre “ubuntumod” que simplemente es un contenedor basado en la imagen “ubuntu” en el que se ha instalado un programa y hacemos:
docker commit -a "autor" -m "comentario" ID/NOMBRE-CONTENEDOR usuario/imagen:[version]
docker commit -a "Sergi" -m "Ubuntu modificado" IDCONTENEDOR sergi/ubuntumod:2021
Hemos obtenido lo siguiente:
una nueva imagen, con nombre “sergi/ubuntumod” con tag “2021”, donde “sergi” actúa como nombre de usuario para usarlo en un repositorio remoto (recordamos nuevamente, que por defecto es “Docker Hub”).
Si quisiéramos añadir una nueva etiqueta a la imagen, como “latest”, podemos usar el comando “docker tag”, teniendo en cuenta que una misma imagen puede tener varias etiquetas:
docker tag sergi/ubuntumod:2021 sergi/ubuntumod:latest
Para eliminar una etiqueta, simplemente deberemos borrar la imagen con “docker rmi”. La imagen se mantendrá mientras al menos tenga una etiqueta.
Por ejemplo con:
docker rmi sergi/ubuntumod:2021
EXPORTANDO/IMPORTANDO IMÁGENES LOCALES A/DESDE FICHEROS
Una vez tengamos una imagen local en nuestro sistema, podemos hacer una copia de la misma, ya sea como copia de seguridad o como forma de transportarla a otros sistemas mediante el comando “docker save”.
Por ejemplo, se puede hacer de estas dos formas:
docker save -o copiaSeguridad.tar sergi/ubuntumod
o de forma alternativa:
docker save sergi/ubuntumod > copiaSeguridad.tar
Si queremos importar el fichero para crear una imagen en nuestra máquina, podemos usar “docker load”. Por ejemplo, se puede hacer de estas dos formas:
docker load -i copiaSeguridad.tar
o de forma alternativa:
docker load < copiaSeguridad.tar
SUBIENDO NUESTRAS PROPIAS IMÁGENES A UN REPOSITORIO
Ver PDF del curso de Docker: UD04.01 – Gestión de imágenes en Docker
Apartados a leer:
6.1 Paso 1: creando repositorio para almacenar la imagen en Docker Hub
6.2 Paso 2: almacenando imagen local en repositorio Docker Hub
Mis repositorios:
esaCuentaEmailParaTrabajar/paco_frafer_pub
esaCuentaEmailParaTrabajar/paco_frafer_priv
7. GENERAR AUTOMÁTICAMENTE NUESTRAS PROPIAS IMÁGENES MEDIANTE DOCKERFILE
7.1 Editor Visual Studio Code y plugins asociados a Docker
7.2 Creando nuestro primer Dockerfile
Ejemplo de código en un Dockerfile:
FROM ubuntu:latest
RUN apt update && apt install -y nano
# Comando que se lanza al inicio
CMD /bin/bash
Ejemplo de código en un Dockerfile:
#Imagen base ubuntu
FROM ubuntu
# Actualizamos lista de paquetes e instalamos nano (-y para no preguntar)
# Las últimas líneas son para hacer la imagen más ligera
RUN apt update && apt install -y nano && apt purge --auto-remove && apt clean && rm -rf /var/lib/apt/lists/*
# Establecemos como comando por defecto de la imagen /bin/bash
CMD /bin/bash
Ejemplo código otro Dockerfile:
En el directorio creando anteriormente, o crearemos (o en el caso del “zip” del curso, ya tendremos listo) el siguiente fichero “Dockerfile”:
#Imagen base
FROM node:12-alpine
#Directorio de trabajo. Recordamos, que si no existe, se crea
WORKDIR /app
#Copiamos la carpeta actual en la carpeta del directorio de trabajo de la imagen
COPY . .
#Instalamos los paquetes necesarios en producción para la APP
RUN yarn install --production
#Comando para al arrancar el contenedor, lanzar la aplicación
CMD ["node", "src/index.js"]
Ejemplo Dockerfile:
FROM alpine
LABEL maintainer="email@gmail.com"
#Actualizamos e instalamos paquetes con APK para Alpine
RUN apk update && apk add apache2 php php-apache2 openrc tar
#Copiamos script para lanzar Apache 2
ADD ./start.sh /start.sh
#Descargamos un ejemplo de <?php phpinfo(); ?> por enseñar como bajar algo de Internet
#Podría haber sido simplemente
#RUN echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php
ADD https://gist.githubusercontent.com/SyntaxC4/5648247/raw/94277156638f9c309f2e36e19bff378ba7364907/info.php
/var/www/localhost/htdocs/index.php
# Si quisiéramos algo como Wordpress haríamos
#ADD http://wordpress.org/latest.tar.gz /var/www/localhost/htdocs/wordpress.tar.gz
#RUN tar xvzf /var/www/localhost/htdocs/wordpress.tar.gz && rm -rf /var/www/localhost/htdocs/wordpress.tar.gz
# Usamos usuario y grupo www-data. El grupo lo crea Apache, pero si quisiéramos crear grupo
# Grupo www-data RUN set -x && addgroup -g 82 -S www-data
# Creamos usuario www-data y lo añadimos a ese grupo
RUN adduser -u 82 -D -S -G www-data www-data
# Hacemos todos los ficheros de /var/www propiedad de www-data
# Y damos permisos a esos ficheros y a start.sh
RUN chown -R www-data:www-data /var/www/ && chmod -R 775 /var/www/ && chmod 755 /start.sh
#Indicamos puerto a exponer (para otros contenedores) 80
EXPOSE 80
#Comando lanzado por defecto al instalar el contendor
CMD /start.sh
Comandos importantes de Dockerfile
7.3.1 Comando EXPOSE: No es lo mismo exponer que publicar puertos.
7.3.2 Comando ADD/COPY
ADD y COPY son comandos para copiar ficheros de la máquina anfitriona al nuevo contenedor. Se
recomienda usar COPY, excepto que queramos descomprimir un “zip”, que ADD permite su
descompresión.
7.3.3 Comando ENTRYPOINT
7.3.4 Comando USER
7.3.5 Comando WORKDIR
7.3.6 Comando ENV
El comando ENV nos permite definir variables de entorno por defecto en la imagen.
ENV v1=”valor1” v2=”valor2”
7.3.7 Otros comandos útiles: ARG, VOLUME, LABEL, HEALTHCHECK.
8. TRUCOS PARA HACER NUESTRAS IMÁGENES MÁS LIGERAS.
Falta añadir resumen de las unidades
5
6
7
8