Creating Effective
Docker Images
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
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
Qué es Docker y los
Contenedores?
Los días Pasados!
Hypervisor
Los días Pasados!
Qué es una imagen de
Docker?
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.
1.7GB 4MB / 84 MB
Mientras más Ligero y Rápido Mejor!
Docker en los Procesos
DevOps
Dockerfile
# 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"]
# 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
○ malala in ~
→ docker build -t vsrecio/CodeCampSDQ Dockerfile
○ 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
Que NO hacer con tu
Dockerfile!
Nunca hacer lo siguiente:
● Apt-get update o install
● Node install o Algo parecido
● Yum install o update
Nunca nombrarlos de la
siguiente forma:
● Dockerfile.dev
● Dockerfile.staging
● Dockerfile.prod
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
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
Docker Registry
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
Manipulación de
las imágenes!
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
○ 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
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.
○ 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
○ 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
Cómo Funcionan
los Layers?
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.
○ malala in ~
○ → docker pull mongo
Using default tag: latest
latest: Pulling from library/mongo
34667c7e4631: Pull complete
d18d76a881a4: Pull complete
119c7358fbfc: Pull complete
2aaf13f3eff0: Pull complete
f7833eaffdda: Pull complete
8287cb5b9daf: Pull complete
ea00040a145a: Pull complete
eeb70119a2ba: Pull complete
066b6bd644f8: Pull complete
17862d4a3122: Pull complete
1cdcc815e975: Pull complete
73e0e2953af7: Pull complete
f719605a4369: Pull complete
Digest: sha256:07b8ccd32d40f47892ff5d074626cb9a866f49742658ce872dd1095cb51d9264
Status: Downloaded newer image for mongo:latest
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"
]
},
]
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.
RUN apt-get install...
EXPOSE 8080
RUN apk add npm...
FROM alpine
Image
Layer
Metadata
Layer
Layer
+ layers = menos
efectiva
- layers = mas efectiva
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)
Imagenes Seguras
Docker images
Docker images

Docker images

  • 1.
  • 2.
    Víctor S. Recio DevOpsEngineer [email protected] Fundador y Organizador ● Docker Santo Domingo ● Linux Dominicana ● Golang Dominicana ● OpenSaturday.org @vsrecio #DockerSantoDomingo #CodeCampSDQ @docker
  • 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
  • 7.
    Qué es Dockery los Contenedores?
  • 8.
  • 9.
  • 11.
    Qué es unaimagen de Docker?
  • 12.
    Las imágenes deDocker 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.
  • 14.
    1.7GB 4MB /84 MB Mientras más Ligero y Rápido Mejor!
  • 16.
    Docker en losProcesos DevOps
  • 19.
  • 20.
    # Use anofficial 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 aDockerfile 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
  • 22.
    ○ malala in~ → docker build -t vsrecio/CodeCampSDQ Dockerfile
  • 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
  • 24.
    Que NO hacercon tu Dockerfile!
  • 25.
    Nunca hacer losiguiente: ● Apt-get update o install ● Node install o Algo parecido ● Yum install o update
  • 26.
    Nunca nombrarlos dela 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/ RUNgo 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
  • 29.
  • 30.
    Los registros Dockersirven 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
  • 33.
  • 34.
    Manipulación de lasimá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 soportalos 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
  • 39.
  • 40.
    Los contenedores Dockerson 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.
  • 41.
    ○ malala in~ ○ → docker pull mongo Using default tag: latest latest: Pulling from library/mongo 34667c7e4631: Pull complete d18d76a881a4: Pull complete 119c7358fbfc: Pull complete 2aaf13f3eff0: Pull complete f7833eaffdda: Pull complete 8287cb5b9daf: Pull complete ea00040a145a: Pull complete eeb70119a2ba: Pull complete 066b6bd644f8: Pull complete 17862d4a3122: Pull complete 1cdcc815e975: Pull complete 73e0e2953af7: Pull complete f719605a4369: Pull complete Digest: sha256:07b8ccd32d40f47892ff5d074626cb9a866f49742658ce872dd1095cb51d9264 Status: Downloaded newer image for mongo:latest
  • 42.
    Otra forma dever 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 dever 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... EXPOSE8080 RUN apk add npm... FROM alpine Image Layer Metadata Layer Layer + layers = menos efectiva - layers = mas efectiva
  • 45.
    La suma delos 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)
  • 46.