Docker parte 4: Imágenes y Dockerfile

by - 5/05/2019 07:17:00 p.m.

Qué es una imagen


Una imagen es una especie de plantilla, una captura del estado de un contenedor. Está compuesta por un conjunto de capas.

Explorando imágenes

  • docker images = Lista todas las imágenes 
  • docker image ls = Lista todas las imágenes 
  • docker image prune = Elimina todas las imágenes no usadas (que no estén enlazadas a container).
  • docker image prune -a = Elimina todas las imágenes
  • docker pull nombreimagen = Descarga la imagen especificada en el host. Ej: docker pull redis Ej: docker pull ubuntu:18.04 descargando una version en particular
  • docker rmi nombreimagen:version/idimagen = Eliminar una sola imagen 
  • docker rmi $(docker images -qf "dangling=true") = Eliminar todas las imágenes 

Docker hub

Es un repositorio de imágenes. La url es https://hub.docker.com
Cuando vemos por ejemplo las versiones de una imagen, a la izquierda vemos la versión y a la derecha los alias que responden a esta versión:


Más que el nombre, lo que importa es el IMAGE ID al momento de hacer docker image ls.
Al mismo tiempo, si hay 2 imágenes con mismo IMAGE ID, y ambas pesan 100 megas, el espacio que ocuparán no son 200 megas, sino que 100 megas, ya que reutiliza las capas. Lo mismo ocurre con imágenes con distinto IMAGE ID donde las capas se repiten.

Dockerfile


Es la receta de docker para crear nuestras propias imágenes.
Pasos:
  • Crear el archivo Dockerfile (receta)
  • El dockerfile siempre debe empezar con el FROM le indicamos cual va a ser nuestra imagen base para empezar 
  • RUN para correr un comando. Creamos un archivo touch /usr/src/hola-mundo 
  • Construimos el dockerfile (con -t asignamos el tag): 
docker build -t <imagen>:<tag de la imagen> <path de donde obtener el contexto build>

Ej. de archivo Dockerfile:

FROM -> Todo Dockerfile comienzan con un FROM
RUN touch /usr/src/hola -> RUN para ejecutar un comando.
COPY . /src -> Copia el . del contexto del build a /src del contenedor
WORKDIR /src -> Indico donde trabajaré y me pararé ahí para los comandos que vienen
EXPOSE 3000 -> puerto que expone el contenedor para luego usarlo con -p
CMD ["node", "index.js"] -> Comando por default cuando finalizan las capas de dockerfile


  • docker build -t ubuntu:versionx .
  • docker push tagcontenedor = Hacer push a un contenedor. Debo tener permisos. Si no especifico usuario, intentará subir a /library de dockerhub, donde no tendremos permisos. Deberíamos cambiarlo a nuestro usuario o a otro con permisos. Los repositorios pueden ser públicos o privados.
  • Ej: docker push <user>/ubuntu:versionx 
  • docker tag tagactualcontenedor nuevotagcontenedor = Cambiar el tag de un contenedor. Ej: docker tag ubuntu:versionx camila/ubuntu:versiony

Por default tomará el dockerfile de la ruta actual. Si queremos especificar qué dockerfile usar, usar el tag -f
  • docker build -f docker/DockerFile -t ubuntu:versionz .

Capas de una imagen

  • docker history ubuntu:versionx = Para ver las capas de una imagen con el peso respectivo de cada una.
  • Al bajar cada capa de una imagen, puede descargarse paralelamente cada capa, no así extraerse, esa debe ser secuencial, ya que una depende de la otra.
  • Para optimizar la ejecución usando el caché de las capas, podemos solo copiar package.json y package-lock.json a la carpeta que ejecutaremos npm install, y luego de instalar, copiar los fuentes. Así no vuelve a ocupar tiempo en instalar todo de nuevo.

Redes en Docker

Por default docker tiene 3 redes:

  • bridge
  • host
  • none

docker network rm nombredelared  = Borrar una red en docker
Ej: docker network rm redcamila

docker network create --attachable nombredelared = Crear una red en docker
--attachable es para que otros contenedores se puedan unir a esta red
Ej: docker network create --attachable redcamila

docker network ls = Ver redes disponibles docker
bridge red por defecto y se conectan con un keyword link esta deprecada, compatibilidad.
host simula la red del computador que corre docker (no usar)
none hacer que tenga el network desabilitado

docker network inspect nombredelared = Ver contenedores en un red. Podemos ver la IP.
Ej: docker network inspect redcamila

docker network connect nombredelared nombredelcontenedor = Unir un contenedor a la red creada
Ej: docker network connect redcamila db docker run -d --name app -p 3000:3000 --env MONGO_URL=mongodb://db:27017/test appcamila
-env variable de entorno
db es el nombre del contenedor sin necesidad de pasar la ip del contenedor para la conexión

Podemos ahorrarnos un paso e iniciar el contenedor ya con la red que necesitamos: docker run -d --name app -p 3000:3000 --env MONGO_URL=mongodb://db:27017/test --net= redcamila appcamila Con esto ya levantamos el contenedor conectado a la red redcamila.

docker-compose.yml

Con Docker Compose puedes crear diferentes contenedores y al mismo tiempo, en cada contenedor, diferentes servicios.

  • Dockerfile = describe de manera imperativa (paso a paso) la arquitectura de nuestra aplicación
  • docker-compose.yml = describir de forma declarativa la arquitectura de nuestra aplicación
Podemos bajar todos los servicios levantados con docker-compose con docker-compose down

Podemos escalar (replicar) un servicio con docker compose

  • docker-compose scale nombreservicio=5

Podemos ver los servicios que sean solo de docker-compose con

  • docker-compose ps


Dockerignore

Podemos decirle a docker que ignore ciertos archivos con .dockerignore. Tiene un uso muy similar a .gitignore. Ej, archivos que queremos hacer COPY pero no genemos que incluya docker al usar


  • COPY . /user/server





You May Also Like

0 comentarios