Skip to content

fbarraga/docker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Docker Cheat Sheet

Tabla de Contenidos

Por qué Docker

"Con Docker, los desarrolladores (y desarrolladoras) pueden construir cualquier aplicación en cualquier lenguaje usando cualquier herramienta. Las aplicaciones "Dockerizadas" son totalmente portables y pueden funcionar en cualquier lugar: En portátiles con OS X y Windows de compañeros; servidores de QA con Ubuntu en el cloud; y VMs de los datacenters de producción que funcionan con Red Hat.

Los desarrolladores pueden empezar a trabajar rápidamente a partir de cualquiera de las más de 13.000 aplicaciones disponibles en Docker Hub. Docker gestiona y guarda los cambios y dependencias, facilitando el trabajo a los Administradores de Sistemas a la hora de entender cómo funcionan las aplicaciones hechas por los desarrolladores. Y, con Docker Hub, los desarrolladores puedes automatizar el despliegue y compartir el trabajo con colaboradores a través de repositorios públicos o privados.

Docker ayuda a los desarrolladores a trabajar y conseguir aplicaciones de mejor calidad de forma más rápida." -- Qué es docker

Prerrequisitos

De forma opcional, se puede hacer utilizar Oh My Zsh con el plugin de Docker para autocompletar los comandos de Docker.

Linux

El requisito mínimo para Docker es utilizar una versión de Kernel (núcleo) posterior a la 3.10.x.

MacOS

Se requiere de la versión 10.8 “Mountain Lion” o posterior.

Windows 10

Se debe activar Hyper-V en la BIOS.

En caso de estar disponible, también se debe activar VT-D (Procesadores Intel).

Windows Server

Como mínimo se requiere la versión de Windows Server 2016 para instalar Docker y Docker Compose. No obstante, existen limitaciones en esta versión, como a la hora de utilizar redes virtualizadas y contenedores Linux.

Se recomienda utilizar Windows Server 2019 o posteriores.

Instalación

Linux

Ejecuta este comando rápido y sencillo proporcionado por Docker:

curl -sSL https://get.docker.com/ | sh

Si no estás dispuesto a ejecutar un shell script que no sabes lo que trae, por favor: revisa las instrucciones de instalación de tu distribución.

Si eres totalmente nuevo en Docker, te recomendamos seguir esta serie de tutoriales.

macOS

Descarga e instala Docker Community Edition. Si tienes Homebrew-Cask, simplemente escribe brew install --cask docker. O descarga e instala Docker Toolbox. Docker For Mac está bien, pero no está tan pulido como como la instalación de VirtualBox. Revisa la comparación aquí.

NOTA: Docker Toolbox está deprecado. Deberías utilizar Docker Community Edition, revisa Docker Toolbox.

Una vez hayas instalado Docker Community Edition, haz click en el icono de docker en el Launchpad. Entonces inicia un contenedor:

docker run hello-world

¡Y ya estaría! Ya tienes un contenedor de docker funcionando.

Si eres totalmente nuevo en Docker, te recomendamos seguir esta serie de tutoriales.

Windows 10

Las instrucciones para instalar Docker Desktop para Windows se encuentran aquí

Una vez instalado, abre Powershell como administrador y ejecuta:

# Muestra la versión de docker instalada:
docker version

# Descarga, crea, y ejecuta 'hello-world':
docker run hello-world

Para continuar con esta chuleta, haz click derecho sobre el icono de Docker en la sección de notificaciones (abajo a la derecha), y ves a ajustes. Para montar volúmenes, el disco C:/ debe ser habilitado en ajustes para poder pasar la información a los contenedores (se detalla más adelante en este artículo).

Para alternar entre contenedores Windows y Linux, haz botón derecho en el icono de Docker en la sección de notificaciones y haz click en el botón de cambiar el sistema operativo del contenedor. Hacer esto parará los contenedores que estén funcionando y serán inaccesibles hasta que el SO del contenedor vuelva a cambiar.

Adicionalmente, si tienes WSL (Subsitema de Windows para Linux) o WSL2 instalado en tu equipo, quizás también quieras instalar el Kernel de Linux para Windows. Las instrucciones para ello pueden encontrarse aquí. Esto requiere la característica de Subsistema de Windows para Linux. Esto permitirá que los contenedores sean accesibles desde los sistemas operativos WSL, así como mejorar la eficiencia ejecutando sistemas operaviso WSL en docker. También es preferible utilizar la terminal de Windows para esto.

Windows Server 2016 / 2019

Sigue las instrucciones de Microsoft que puedes encontrar aquí

Si haces uso de la última versión de 2019, prepárate para trabajar solo con powershell, dado que es solo una imágen del núcleo del servidor (sin interfaz de escritorio). Cuando inicies esta máquina, se logueará y mostrará una ventana de powerhell. Se recomienda instalar editores de texto y otras herramientas utilizando Chocolatey

Tras instalarlo, funcionarán los siguientes comandos:

# Muestra la versión de docker instalada:
docker version

# Descarga, crea, y ejecuta 'hello-world':
docker run hello-world

Windows Server 2016 no puede ejecutar imágenes de Linux.

Windows Server Build 2004 es capaz de ejecutar contenedores de Linux y Windows simultáneamente a través del aislamiento de Hyper-V. Cuando se ejecuten los contenedores, utiliza el comando isolation=hyperv, el cual lo aislará utilizando distintas instancias de kernel para cada contenedor.

Revisar la versión

Es muy importante que siempre conozcas la versión de Docker que estás utilizando en cualquier momento. Es muy útil dado que permite saber las características compatibles con lo que estés ejecutando. Esto también es importante para conocer que contenedores puedes ejecutar de la docker store cuando estés intentando utilizar un contenedor como plantilla. Dicho esto, veamos como recuperar la versión de Docker que está ejecutándose actualmente.

Recuperar la versión del servidor:

$ docker version --format '{{.Server.Version}}'
1.8.0

Puedes volcar la información en un JSON:

$ docker version --format '{{json .}}'
{"Client":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"am"}

Contenedores

Proceso básico del aislamiento en Docker. Los contenedores son a las máquinas virtuales lo que los threads son a los procesos. O puedes verlo como un chroot dopado.

Ciclo de vida

Si ejecutas un contenedor sin opciones este se iniciará y detendrá automáticamente, si quieres mantenerlo funcionando puedes utilizar el comando docker run -td container_id, esto utilizará la opción -t, que habilitará una pseudo-sesión de TTY, y -d, que separará el contenedor automáticamente (lo ejecutará en segundo plano y mostrará la ID del contenedor)

Si quieres un contenedor efímero, docker run --rm eliminará el contenedor en cuanto se detenga.

Si quieres mapear un directorio del host al contenedor de docker, docker run -v $HOSTDIR:$DOCKERDIR. Revisa Volúmenes.

Si al eliminar el contenedor también quieres borrar los volúmenes asociados, el borrado deberá contener -v, por ejemplo: docker rm -v.

También existe un driver de logs disponible para contenedores individuales en Docker 1.10. Para ejecutar docker con un driver de logs personalizado, ejecuta docker run --log-driver=syslog.

Otra opciónútil es docker run --name yourname docker_image donde especificando la opción --name dentro del comando run, esto te permitirá iniciar y detener el contenedor utilizando el nombre especificado al crearlo.

Ejecutando y deteniendo

Si quieres despegarte de un contenedor, utiliza Ctrl + p, Ctrl + q.

Si quieres integrar un contenedor con un gestor de procesos, inicia el daemon con -r=false, después utiliza docker start -a.

Si quieres exponer un puerto del contenedor a través del host, revisa la sección exponiendo puertos.

Las políticas de reinicio en una instancia bloqueada se explica aquí.

Restricciones de CPU

Puedes limitar la CPU, ya sea especificando el porcentáge global de las CPU o definiendo el número de núcleos.

Por ejemplo, puedes especificar la configuración de cpu-shares. Este parámetro es un poco raro -- 1024 significa el 100% de la CPU, por lo que si quieres que el contenedor utilice el 50% de todas las CPU, deberás especificar 512. Revisa https://docs.docker.com/engine/reference/run/#/cpu-share-constraint para más información.

docker run -it -c 512 agileek/cpuset-test

Tambiés puedes utilizar únicamente algunos núcleos de la CPU utilizando cpuset-cpus. Revisa https://agileek.github.io/docker/2014/08/06/docker-cpuset/ para más detalles y algunos vídeos guays:

docker run -it --cpuset-cpus=0,4,6 agileek/cpuset-test

Fíjate que Docker puede seguir viendo todas las CPU dentro del contenedor -- simplemente no la utiliza entera. Revisa moby/moby#20770 para más información.

Restricciones de memoria

También puedes especificar restricciones de memoria en Docker

docker run -it -m 300M ubuntu:14.04 /bin/bash

Capacidades

Las capacidades de linux se pueden establecer utilizando cap-add y cap-drop. Revisa https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities para más detalles. Debe usarse para una mejor seguridad.

Para montar un sistema de ficheros basado en FUSE, debes combinar --cap-add con --device:

docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs

Para dar acceso a un único dispositivo:

docker run -it --device=/dev/ttyUSB0 debian bash

Para dar acceso a todos los dispositivos:

docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb debian bash

Más información sobre contenedores con privilegios aquí

Información

  • docker ps muestra los contenedores funcionando.
  • docker logs recupera los logs del contenedor. (Puedes utilizar un driver personalizado para los logs, pero los logs solo están disponibles para json-file y journald en la versión 1.10).
  • docker inspect revisa toda la información del contenedor (incluyendo la dirección IP).
  • docker events recupera los eventos del contenedor.
  • docker port muestra los puertos abiertos al exterior del contenedor.
  • docker top muestra los procesos que se están ejecutando en el contenedor,
  • docker stats Muestra las estadísticas del uso de recursos del contenedor.
  • docker diff Muestra los archivos que han cambiado en el sistema de ficheros del contenedor.

docker ps -a muestra todos los contenedores: que están funcionados o parados.

docker stats --all lista todos los contenedores, por defecto solo los que están funcionando.

Import / Export

  • docker cp copia los ficheros y carpetas de un contenedor al sistema de ficheros local.
  • docker export vuelca el sistema de ficheros de un contenedor como fichero .tar en el STDOUT.

Ejecuntando comandos

Para entrar a un contenedor que está funcionando, acopla un nuevo proceso de terminal al contenedor usando: docker exec -it <ID/Nombre del contenedor> /bin/bash.

Imágenes

Las imágenes simplemente son plantillas para contenedores de docker.

Ciclo de vida

  • docker images muestra todas las imágenes.
  • docker import crea una imágen a partir de un fichero .tar.
  • docker build crea una imágen a partir de un Dockerfile.
  • docker commit crea una imágen a partir de un contenedor, deteniéndolo temporalmente si está funcionando.
  • docker rmi elimina una imágen.
  • docker load carga una imágen a partir de un fichero .tar pasado como STDIN, incluyendo imágenes y etiquetas.
  • docker save guarda una imágen en un fichero .tar pasado como STDOUT con todas las capas superiores, etiquetas y versiones.

Información

Limpiar

Puedes utilizar el comando docker rmi para eliminar una imágen específica, pero también existe una herramienta alternativa llamada docker-gc que elimina de forma segura las imágenes que ya no están siendo utilizadas por ningún contenedor. En la versión 1.13 de docker, también existe el comando docker image prine, el cual elimina las imágenes que no están siendo utilizadas. Revisa Prune

Cargar/Guardar una imágen

Carga una imágen a partir de un fichero:

docker load < my_image.tar.gz

Guarda una imágen existente:

docker save my_image:my_tag | gzip > my_image.tar.gz

Importar/Exportar un contenedor

Importa un contenedor como imágen a partir de un fichero:

cat my_container.tar.gz | docker import - my_image:my_tag

Exporta un contenedor existente:

docker export my_container | gzip > my_container.tar.gz

Diferencia entre cargar y guardar una imágen e importar y exportar un contenedor como imágen

Cargar una imágen utilizando el comando load crea una nueva imágen incluyeno su historial. Importar un contenedor como imágen utilizando el comando import crea una nueva imágen excluyendo el historial, lo que se traduce en una imágen más ligera comparada con cargarla.

Redes

Docker tiene la característica de Redes. Docker automáticamente crea tres interficies de red al instalarlo (puente, host, nula). Por defecto, cuando se lanza un nuevo contenedor es añadido la red puente. Para habilitar la comunicación entre varios contenedores puedes crear una nueva red y lanzar los contenedores en ella. Esto permite a los contenedores comunicarse entre ellos y aislarese de los contenedores que no están conectados a su misma red. Además, esto permite mapear nombres de contenedores a sus direcciones IP. Revisa working with networks para más información.

Ciclo de vida

  • docker network create NAME Crea una nueva red (por defecto de tipo puente).
  • docker network rm NAME Elimina una o más redes indicando el nombre o el identificador. No pueden haber contenedores conectados a la red al eliminarla.

Info

Connection

Puedes especificar una ip específica a un contenedor:

# crea una nueva red puente con la subnet y puerta de enlace específicada
docker network create --subnet 203.0.113.0/24 --gateway 203.0.113.254 iptastic

# ejecuta un contenedor de nginx con al ip especificada en la red iptastic
$ docker run --rm -it --net iptastic --ip 203.0.113.2 nginx

# curl hacia la ip desde cualquier otro lugar (dando por hecho que es una ip pública hehe)
$ curl 203.0.113.2

Registry y Repositorios

(Nota de traducción: Registry sería traducido como Regitro, pero nadie le llama así en el mundo real, así que...)

Un repositorio es una colección alojada de imágenes enlazadas que unidas crean el sistema de ficheros para un contenedor.

Un Registry es un alojamiento -- un servidor que almacena repositorios y provee de una API HTTP para gestionar la actualización y descarga de repositorios.

Docker.com posee su propio índice como un Registry centralizado que contiene un gran número de repositorios. Dicho esto, aclarar que el docker Registry no hace un buen trabajo verificando imágenes, por lo que quizás deberías evitarlo si te preocupa la seguridad.

Ejecutar un registry local

Puedes ejecutar un registry local utilizando el proyecto distribución de docker y revisando las instrucciones de como realizar el deploy local

Adicionalmente revisa la mailing list

Dockerfile

El archivo de configuración. Configura un contenedor de docker al ejecutar docker build en el. Mucho más preferible a docker commit.

Aquí tienes varios editores de textos comunes y módulos de resaltado de sintaxis que puedes usar para crear Dockerfiles:

Instructions

  • .dockerignore
  • FROM utiliza una imágen de base para las siguientes instrucciones.
  • MAINTAINER (deprecated - use LABEL instead) especifica el autor que ha generado las imágenes.
  • RUN ejecuta cualquier comando en una nueva capa de la imágen y guarda el estado resultante.
  • CMD proporcionar valores predeterminados para un contenedor en ejecución.
  • EXPOSE informa a Docker que el contenedor estará escuchando los puertos especificados mientras se ejecute. NOTA: no hace que los puertos sean accesibles.
  • ENV define una variable de entorno.
  • ADD copia nuevos ficheros, directorios o archivos remotos al contenedor. Invalida cachés. Procura evitar usar ADD e intenta utilizar COPY en su lugar.
  • COPY copia nuevos ficheros o directorios al contenedor. Por defecto los copia como root independientemente de la configuración de USER/WORKDIR. Utiliza --chown=<user>:<group> para cambiar el dueño. (Lo mismo aplica a ADD).
  • ENTRYPOINT configura un contenedor que funcionará como ejecutable.
  • VOLUME crea un punto de montaje para volúmenes externos u otros contenedores.
  • USER especifica el usuario que ejecutará los próximos comandos de tipo RUN / CMD / ENTRYPOINTS.
  • WORKDIR especifica el directorio de trabajo.
  • ARG define una variable que estará disponible durante el build.
  • ONBUILD añade una instrucción que será lanzada cuando la imágen sea utilizada como base de otro build.
  • STOPSIGNAL define la señal que será enviada al contenedor para detenerse.
  • LABEL aplica metadatos de clave/valor para las imágenes, contenedores o daemons (servicios).
  • SHELL reemplaza la shell por defecto que es utilizada por Docker para ejecutar los comandos.
  • HEALTHCHECK indica a docker como probar el contenedor para revisar que sigue funcionando.

Tutorial

Examples

Capas

Las veriones de los sitemas de ficheros en docker se basan en capas. Son similares a los git commits o conjuntos de cambios para sistemas de ficheros.

Enlaces

Los enlaces definen como los contenedores de Docker se comunican entre ellos mediante puertos TCP/IP. Atlassian lo explica con ejemplos. También puedes resolver enlaces con nombres de equipo.

Esto ha sido parcialmente deprecado por redes definidas por los usuarios.

NOTA: Si ÚNICAMENTE quieres que los contenedores se comuniquen mediante enlaces, inicia el servicio de Docker con -icc=false para desactivar la comunicación entre procesos.

Si tienes un contenedor con el nombre CONTAINER (especificado vía docker run --name CONTAINER) y, en el Dockerfile, explones un puerto:

EXPOSE 1337

Y entonces creas otro contenedor llamado LINKED de la forma:

docker run -d --link CONTAINER:ALIAS --name LINKED user/wordpress

Entonces los puertos expuertos y alias de CONTAINER se mostrarán en LINKED con las siguientes variables de entorno: Then the exposed ports and aliases of CONTAINER will show up in LINKED with the following environment variables:

$ALIAS_PORT_1337_TCP_PORT
$ALIAS_PORT_1337_TCP_ADDR

Y te puedes conectar a él de esta forma.

Para eliminar los enlaces, utiliza `docker rm --link'.

Generalmente, enlazar mediante servicios de docker es un subgrupo de "descrubrimiento de servicios", un gran problema si tienes pensado utilizar Docker para escalar en producción. Por favor, lee The Docker Ecosystem: Service Discovery and Distributed Configuration Stores para más información.

Volúmenes

Los volúmenes de Docker son sitemas de archivos flotantes. Estos no se conectan a un contenedor en particular. Puedes utilizar los volúmenes montados de contenedores de únicamente datos. A partir de Docker 1.9.0, Docker ha nombrado volúmenes que reemplazan los contenedores de solo datos. Considere usar volúmenes con nombre para implementarlo en lugar de contenedores de datos.

Ciclo de vida

Información

Los volúmenes son útiles en situaciones donde no puedes utilizar enlaces (los cuales son sólo TCP/IP). Por ejemplo, si necesitases tener dos instancias de docker comunicándose dejando datos en el sistema de ficheros.

Puedes montarlos en distintos contenedores de docker a la vez, utilizando docker run --volumes-from.

Dadp que los volúmenes están aislados del sistema de ficheros, estos también son utilizados para almacenar el estado a partir de cálculos de contenedores temporales. Exacto, puedes tener un contenedor sin estado y temporal ejecutándose a partir de una receta, destruírlo, y entonecs tener otra instancia temporal que pueda recuperar lo que ha dejado atrás el primer contenedor.

Revisa volúmenes avanzados para más información. Container42 también es de utilidad.

Puedes mapear directorios de MacOS como volúmenes de Docker:

docker run -v /Users/wsargent/myapp/src:/src

Puedes utilizar un volúmen NFS remoto si eres valiente

También puedes plantearme utilizar contenedores de solo datos como se describen aquí para tener portabilidad de datos.

Ten en cuenta que puedes montar archivos como volúmenes.

Exponiendo puertos

Exponer puertos de entrada a través de un contenedor es complejo pero factible.

Puede hacerse a través del mapeo de puertos del contenedor hacia el host (utilizando únicamente la interficie de localhost) mediante el uso de p:

docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT \
  --name CONTAINER \
  -t algunaimágen

Puedes decirle a docker que el contenedor escucha en el puerto especificado utilizando EXPOSE:

EXPOSE <CONTAINERPORT>

Nótese que EXPOSE no expone el puerto por si mismo - solo -p lo hace.

Para exponer el puerto de un contenedor en localhost, ejecuta:

iptables -t nat -A DOCKER -p tcp --dport <LOCALHOSTPORT> -j DNAT --to-destination <CONTAINERIP>:<PORT>

Si estás ejecutando Docker en Virtualbox, también necesitarás hacer forward del puerto, utilizando [forwarded_port] (https://docs.vagrantup.com/v2/networking/forwarded_ports.html). Define un rango de puertos en tu Vagrantfile de la siguiente manera para mapearlos dinámicamente:

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...

  (49000..49900).each do |port|
    config.vm.network :forwarded_port, :host => port, :guest => port
  end

  ...
end

Si te olvidas de los puertos que has mapeado, utiliza docker port para mostrarlo:

docker port CONTAINER $CONTAINERPORT

Buenas prácticas

Aquí tienes algunas buenas prácticas de Docker y algunas batallitas:

Docker-Compose

Compose es una herramienta para definir y ejecutar varias aplicaciones en contenedores de Docker. Con Compose, utilizas un archivo YAML para configurar tus servicios. Entonces, con un único comando, creas e inicias todos los servicios desde tus configuraciones. Para aprender más sobre las características de Compose, revisa la lista de características.

Utilizando el siguiente comando puedes iniciar tu aplicación:

docker-compose -f <docker-compose-file> up

También puedes ejecutar docker-compose en segundo plano utilizando el parámentro -d, entonces podrás detenerlo cuando lo necesitas con el comando:

docker-compose stop

Puedes tirarlo todo, eliminando los contenedores completamente, con el comando down. Utiliza el parámetro --volumes para también eliminar los volúmenes de datos.

Seguridad

Aquí te dejamos algunso consejos de seguridad sobre como funciona Docker. La página de Docker de [seguridad]](https://docs.docker.com/engine/security/security/) lo explica en más detalle.

Lo primero: Docker se ejecuta como root. Si estás en el grupo docker, tienes acceso root. Si expones el socket de unix de docker a un contenedor, le estás dando al contenedor acceso root a la máquina host.

Docker no debería ser tu única defensa. Deberías asegurarlo y protejerlo.

Para entender como se exponen los contenedores, deberías leer Entendiendo y endureciendo Contenedores Linux de Aaron Grattafiori. Esta es una guía completa y entendible sobre los riesgos relacionados con los contenedores, con una gran cantidad de enlaces y notas a pié de página. Los siguientes consejos de seguridad son útiles si ya has protejido tus contenedores en el pasado, pero no son substitutos a entenderlo.

Consejos de seguridad

Para mayor seguridad, puedes ejecutar Docker dentro de una máquina virtual. Esto es un consejo del Jefe del Equipo de Seguridad de Docker -- diapositivas / notas. Entonces, ejecutalo con AppArmor / seccomp / SELinux /grsec etc. para limitar los permisos del contenedor. Revisa las características de seguridad de Docker 1.10 para más detalles.

Los identificadores de las imágenes de Docker son información sensible y no deberían exponerse al mundo exterior. Trátalos como contraseñas.

Revisa la Chuleta de Seguridad de Docker de Thomas Sjögren: ahí podrás encontrar buenos consejos sobre como protejerse.

Revisa el script de seguridad de Docker Bench.

Las 10 Mejores Prácticas de Seguridad para Imágenes de Docker de Snyk

Puedes empezar utilizando un Kernel con parches inestables de grsecurity / pax compilados, como Alpine Linux. Si haces uso de grsecurity en producción, deberías buscar soporte comercial para los parches estables, de la misma forma que deberías hacer para RedHat. Son unos 200$ al mes, lo cual es insignificante para el presupuesto de devops.

A partir de Docker 1.11, puedes limitar fácilmente el número de procesos que se ejecutan en un contenedor para evitar fork bombs. Esto requiere utilizar un Kernel de Linux >= 4.3 con CGROUP_PIDS=y en la configuración del kernel.

docker run --pids-limit=64

A partir de Docker 1.11 también está disponible la posibilidad de evitar que los procesos ganen nuevos privilegios. Esta característica está en el Kernel de Linux desde la versión 3.5. Puedes leer más al respecto en este blog.

docker run --security-opt=no-new-privileges

De la Chuleta de Seguridad de Docker (es un PDF y es un poco complejo de usar, así que mejor copia de abajo) de Container Solutions:

Desactiva la comunicación interproceso con:

docker -d --icc=false --iptables

Establece que el contenedor sea solo lectura:

docker run --read-only

Verifica las imágenes con un hashsum:

docker pull debian@sha256:a25306f3850e1bd44541976aa7b5fd0a29be

Establece el volúmen como solo lectura:

docker run -v $(pwd)/secrets:/secrets:ro debian

Crea y utiliza un usiario en el Dockerfile para evitar ejecutar como root dentro del contenedor:

RUN groupadd -r user && useradd -r -g user user
USER user

Espacio de Nombres del Usuario (User Namespaces)

También hay que trabajar con los espacios de nombres de usuario -- disponibles en la 1.10, pero no activados por defecto.

Para activar esta característica ("reasignar los usuarios") en ubuntu 15.10, sigue este ejemplo.

Videos de Seguridad

Ruta de Seguridad

La ruta de Docker habla sobre el soporte de seccomp.

También hay una política de AppArmor llamada base, y están trabajando en perfiles de seguridad

Consejos

Fuentes:

Prune

Los nuevos Comandos de manejo de datos llegaron a Docker en la versión 1.13

  • docker system prune
  • docker volume prune
  • docker network prune
  • docker container prune
  • docker image prune

df

docker system df muestra un resumen del espacio actualmente utilizado por los distintos elementos de Docker.

Heredoc Docker Container

docker build -t htop - << EOF
FROM alpine
RUN apk --no-cache add htop
EOF

Últimas IDs

alias dl='docker ps -l -q'
docker run ubuntu echo hello world
docker commit $(dl) helloworld

Commit con comando (necesita de Dockerfile)

docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres

Recuperar la dirección IP

docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4

O, con jq instalado:

docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress'

O, utilizando una plantilla:

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container_name>

O, al construir la imágen desde un Dockerfile, cuando quieres pasar argumentos de compilación:

DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1`
echo DOCKER_HOST_IP = $DOCKER_HOST_IP
docker build \
  --build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP
  -t sometag \
  some-directory/

Recuperar el mapping de puertos

docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' <nombredecontenedor>

Encontrar contenedores mediante expresiones regulares

for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $i; done

Recuperar la configuraciín del entorno

docker run --rm ubuntu env

Detener los contenedores en funcionamiento

docker kill $(docker ps -q)

Eliminar todos los contenedores (¡FORZANDO! Los borrará estén funcionando o parados)

docker rm -f $(docker ps -qa)

Eliminar los viejos contenedores

docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

Eliminar los contenedores detenidos

docker rm -v $(docker ps -a -q -f status=exited)

Eliminar los contenedores después de pararlos

docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq)

Eliminar las imágenes colgadas

docker rmi $(docker images -q -f dangling=true)

Eliminar todas las imágenes

docker rmi $(docker images -q)

Eliminar los volúmenes colgados

Como en Docker 1.9:

docker volume rm $(docker volume ls -q -f dangling=true)

En 1.90, el filtro dangling=false no funciona - es ignorado y mostrará todos los volúmenes

Mostrar las dependencias de las imágenes

docker images -viz | dot -Tpng -o docker.png

Reducir el tamaño de los contenedores Docker

  • Limpiar el APT en una capa RUN - Esto debería hacerse en la misma capa que los otros comandos apt. Sino, las capas previas seguirán teniendo la información original y la imágen seguirá siendo pesada.
    RUN {apt commands} \
      && apt-get clean \
      && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
  • Aplanar una imágen
    ID=$(docker run -d image-name /bin/bash)
    docker export $ID | docker import – flat-image-name
  • Para las copias de seguridad
    ID=$(docker run -d image-name /bin/bash)
    (docker export $ID | gzip -c > image.tgz)
    gzip -dc image.tgz | docker import - flat-image-name

Monitorizar los recursos del sistema utilizados por los contenedores en funcionamiento

Para revisar el uso de CPU, memoria y E/S de red para un solo contenedor, puedes utilizar:

docker stats <container>

Para todos los contenedores listados por ID:

docker stats $(docker ps -q)

Para todos los contenedores listados por nombre:

docker stats $(docker ps --format '{{.Names}}')

Para todos los contenedores listados por imágen:

docker ps -a -f ancestor=ubuntu

Eliminar todas las imágenes sin etiquetas:

docker rmi $(docker images | grep “^” | awk '{split($0,a," "); print a[3]}')

Eliminar contenedores mediante una expresión regular:

docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f

Elimina todos los contenedores en estado "Exit":

docker rm -f $(docker ps -a | grep Exit | awk '{ print $1 }')

Los volúmenes pueden ser ficheros

Ten encuenta que puedes montar ficheros como volúmenes. Por ejemplo, pueden inyectar un archivo de configuración así:

# copia el archivo del contenedor
docker run --rm httpd cat /usr/local/apache2/conf/httpd.conf > httpd.conf

# edita el archivo
vim httpd.conf

# inicia el contenedor con la configuracion modificada
docker run --rm -it -v "$PWD/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" -p "80:80" httpd

About

Curs d'introducció a Docker per CFGS DAW

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published