2. Víctor S. Recio
DevOps Engineer
vrecio@opsecsecurity.com
Fundador y Organizador
● Docker Santo Domingo
● Linux Dominicana
● Golang Dominicana
● OpenSaturday.org
@vsrecio
#DockerSantoDomingo #CodeCampSDQ @docker
3.
4.
5.
6. Agenda de trabajo
1. Qué es Docker y los contenedores?
2. Qué es una imagen de Docker?
3. Docker en los procesos DevOps
4. Dockerfile
5. Docker Registry
6. Manejo efectivo de las imágenes
7. Cómo funcionan los layers?
8. Imagenes Seguras
12. Las imágenes de Docker están creadas en capas y están
representadas como un único objeto. En la base de las imágenes
de Docker existe un Sistema Operativo Mínimo corriendo todas las
dependencias necesarias para correr solamente la aplicación
para la que fue creada la imagen.
13.
14. 1.7GB 4MB / 84 MB
Mientras más Ligero y Rápido Mejor!
20. # Use an official Python runtime as a parent image
FROM python:2.7
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
21. # Create a Dockerfile for an ASP.NET Core application
FROM microsoft/aspnetcore-build:2.0
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
23. ○ malala in ~
→ docker build -t <repo/images>:<tag> .
● Tener un estándar para los tags y un control de registro
● Tener un nombre base para las imágenes
25. Nunca hacer lo siguiente:
● Apt-get update o install
● Node install o Algo parecido
● Yum install o update
26. Nunca nombrarlos de la
siguiente forma:
● Dockerfile.dev
● Dockerfile.staging
● Dockerfile.prod
27. Buenas practicas!
● Usar .dockerignore
● Usar el multi-stage build
● Usar un usuario diferente a root
● Documentar tus Dockerfiles
● Nombra tus Build Steps (As klok)
● Usar imagenes multiplataformas cuando sea necesario
28. FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
Multi-stage builds
1
2
Dockerfile
30. Los registros Docker sirven para almacenar las diversas imágenes de Docker que
utilicemos en nuestro sistema. De esta forma podremos subir imágenes nuevas a
los registros, o descargarlas cuando las necesitemos en alguna máquina Docker.
Docker hub es el registro por defecto de Docker, pero podemos utilizar otro de
nuestra preferencia.
https://hub.docker.com/_/nginx
https://hub.docker.com/_/debian
https://hub.docker.com/_/redis
https://hub.docker.com/_/mongo
34. Manipulación de las imágenes!
○ malala in ~
○ → docker docker images pull <images>:<tag>
Localmente las imagenes estan aqui:
● Linux: /var/lib/docker/
● Windows: C:ProgramDatadockerwindowsfilter
○ malala in ~
○ → docker docker images pull -a <images>:<tag>
Descarga todas los tag de la imagen
35. ○ malala in ~
○ → docker images ls
REPOSITORY TAG IMAGE ID CREATED SIZE
○ malala in ~
○ → docker rm <image-name>
○ malala in ~
○ → docker images ls --filter dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
Las imágenes de Docker consisten en múltiples capas. Las Dangling images son capas que no tienen
relación con ninguna imagen etiquetada. Ya no sirven un propósito y consumen espacio en disco.
Podemos borrar todas las imágenes en docker con el comando docker system prune
36. Docker actualmente soporta los siguientes tipos de filtrado:
Dangling: Acepta (true or false) y retorna solamente dangling images.
Before: Requiere de una ID de imagen o nombre de imagen como argumento y retorna
todas las imágenes creadas antes de.
Since: Igual que la anterior pero después de.
Label: Filtra basado en labels, recuerda que docker image ls no despliega labels en la
salida.
37. ○ malala in ~
○ → docker images ls --format “{{.Size}}”
REPOSITORY TAG IMAGE ID CREATED SIZE
Docker usa plantillas Go que puede utilizar para manipular el formato de salida de
ciertos comandos y controladores de registro. Docker proporciona un conjunto de
funciones básicas para manipular elementos de plantilla.
○ malala in ~
○ → docker images ls --format “{{.Repository}}: {{.Tag}}: {{.Size}}”
REPOSITORY TAG IMAGE ID CREATED SIZE
38. ○ malala in ~
○ → docker search debian --filter “is-official=true”
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
En la línea de comandos de Docker Hub también podemos usar el poder del
filtrado de las imágenes que buscamos.
○ malala in ~
○ → docker search debian --filter “is-automated=true”
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
40. Los contenedores Docker son bloques de construcción para aplicaciones. Cada
contenedor es una imagen con una capa readable/writeable sobre un grupo de capas de
solo lectura.
Estas capas (también llamadas imágenes intermedias) se generan cuando los comandos
en el Dockerfile se ejecutan durante la construcción de la imagen del Docker.
42. Otra forma de ver los layers de las imagene es con el comando:
○ malala in ~
○ → docker image inspect redis
[
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda",
"sha256:b52995330c04002c33243b1670ba11921564dcc58a69af275ded1ac9df1aac4e",
"sha256:1540700d9a4fa5405b9f81abda35fd97de8c9961b861829a879ceca15a4a82ff",
"sha256:f3918e45d85b758de3186c25c57c0bbdb99523bb651fc9856448d284e75940b1",
"sha256:290c0f1ac500d5329070a58dad2ced9714f06a4a5cbabaab7bc439f9dae8ae1d",
"sha256:f02e80b7746e03cffca22161cfc746c09521d138b138e34096a629abec7d3347"
]
},
]
43. Otra forma de ver los layers o el historias de una imagen es con el comando history:
○ malala in ~
○ → docker history redis
IMAGE CREATED CREATED BY SIZE COMMENT
No todos los valores del docker histoy son layers, algunos de estos son metadata y
vienen de la creación de la imagen en el dockerfile, valores como ENV, EXPOSE, CMD,
ENTRY solo crean metadata en la imagen.
44. RUN apt-get install...
EXPOSE 8080
RUN apk add npm...
FROM alpine
Image
Layer
Metadata
Layer
Layer
+ layers = menos
efectiva
- layers = mas efectiva
45. La suma de los layers construye una imagen. El responsable de unir estos layers es
el storage driver, existen actualmente estos:
● AUFS
● Overlay2
● Devicemapper
● Btrfs
● Zfs
En un sistema windows solo existe:
● Windowsfilter (CoW sobre NTFS)