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.
Ej. de archivo Dockerfile:
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
Por default tomará el dockerfile de la ruta actual. Si queremos especificar qué dockerfile usar, usar el tag -f
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):
Ej. de archivo Dockerfile:
FROM -> Todo Dockerfile comienzan con un FROMRUN 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


