Salta el contingut

Docker Cheat Sheet

Taula de Continguts

Per què Docker

Amb Docker, els desenvolupadors (i desenvolupadores) poden construir qualsevol aplicació en qualsevol llenguatge utilitzant qualsevol eina. Les aplicacions "Dockeritzades" són totalment portables i poden funcionar en qualsevol lloc: En portàtils amb OS X i Windows de companys; servidors de QA amb Ubuntu al núvol; i VMs dels centres de dades de producció que funcionen amb Red Hat.

Els desenvolupadors poden començar a treballar ràpidament a partir de qualsevol de les més de 13.000 aplicacions disponibles a Docker Hub. Docker gestiona i desa els canvis i dependències, facilitant el treball als Administradors de Sistemes a l'hora d'entendre com funcionen les aplicacions fetes pels desenvolupadors. I, amb Docker Hub, els desenvolupadors poden automatitzar el desplegament i compartir el treball amb col·laboradors a través de repositoris públics o privats.

Docker ajuda els desenvolupadors a treballar i aconseguir aplicacions de millor qualitat de forma més ràpida." -- Què és docker?

Prerequisits

De forma opcional, es pot utilitzar Oh My Zsh amb el plugin de Docker per autocompletar les comandes de Docker.

Linux

El requisit mínim per Docker és utilitzar una versió de Kernel (nucli) posterior a la 3.10.x.

MacOS

Es requereix de la versió 10.8 "Mountain Lion" o posterior.

Windows 11

S'ha d'activar Hyper-V a la BIOS.

En cas d'estar disponible, també s'ha d'activar VT-D (Processadors Intel).

Windows Server

Es recomana utilitzar Windows Server 2022 o posteriors.

Instal·lació

Install-Linux

Executa aquesta comanda ràpida i senzilla proporcionada per Docker:

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

Si no estàs disposat a executar un shell script que no saps el que porta, si us plau: revisa les instruccions d'instal·lació de la teva distribució.

Si ets totalment nou en Docker, et recomanem seguir aquesta sèrie de tutorials.

macOS

Descarrega i instal·la Docker Community Edition. Si tens Homebrew-Cask, simplement escriu brew install --cask docker. O descarrega i instal·la Docker Toolbox. Docker For Mac està bé, però no està tan polit com la instal·lació de VirtualBox. Revisa la comparació aquí.

NOTA: Docker Toolbox està deprecat. Hauríes d'utilitzar Docker Community Edition, revisa Docker Toolbox.

Un cop hagis instal·lat Docker Community Edition, fes clic a la icona de docker al Launchpad. Llavors inicia un contenidor:

docker run hello-world

I ja estaria! Ja tens un contenidor de docker funcionant.

Si ets totalment nou en Docker, et recomanem seguir aquesta sèrie de tutorials.

Install-Windows 11

Les instruccions per instal·lar Docker Desktop per Windows es troben aquí

Un cop instal·lat, obre Powershell com a administrador i executa:

# Mostra la versió de docker instal·lada:
docker version

# Descarrega, crea, i executa 'hello-world':
docker run hello-world

Per continuar amb aquesta xuleta, fes clic dret sobre la icona de Docker a la secció de notificacions (a baix a la dreta), i ves a configuració. Per muntar volums, el disc C:/ ha de ser habilitat a la configuració per poder passar la informació als contenidors (es detalla més endavant en aquest article).

Per alternar entre contenidors Windows i Linux, fes botó dret a la icona de Docker a la secció de notificacions i fes clic al botó de canviar el sistema operatiu del contenidor. Fer això pararà els contenidors que estiguin funcionant i seran inaccessibles fins que el SO del contenidor torni a canviar.

Addicionalment, si tens WSL (Subsistema de Windows per Linux) o WSL2 instal·lat al teu equip, potser també vols instal·lar el Kernel de Linux per Windows. Les instruccions per això es poden trobar aquí. Això requereix la característica de Subsistema de Windows per Linux. Això permetrà que els contenidors siguin accessibles des dels sistemes operatius WSL, així com millorar l'eficiència executant sistemes operatius WSL a docker. També és preferible utilitzar la terminal de Windows per això.

Windows Server

Segueix les instruccions de Microsoft que pots trobar aquí

Si fas ús de l'última versió de 2019, prepara't per treballar només amb powershell, donat que és només una imatge del nucli del servidor (sense interfície d'escriptori). Quan iniciïs aquesta màquina, es logejarà i mostrarà una finestra de powershell. Es recomana instal·lar editors de text i altres eines utilitzant Chocolatey

Després d'instal·lar-lo, funcionaran les següents comandes:

# Mostra la versió de docker instal·lada:
docker version

# Descarrega, crea, i executa 'hello-world':
docker run hello-world

Windows Server Build 2004 és capaç d'executar contenidors de Linux i Windows simultàniament a través de l'aïllament de Hyper-V. Quan s'executin els contenidors, utilitza la comanda isolation=hyperv, la qual l'aïllarà utilitzant diferents instàncies de kernel per cada contenidor.

Revisar la versió

És molt important que sempre coneguis la versió de Docker que estàs utilitzant en qualsevol moment. És molt útil donat que permet saber les característiques compatibles amb el que estàs executant. Això també és important per conèixer quins contenidors pots executar de la docker store quan estàs intentant utilitzar un contenidor com a plantilla. Dit això, vegem com recuperar la versió de Docker que s'està executant actualment.

Recuperar la versió del servidor:

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

Pots bolcar la informació 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"}

Contenidors

Procés bàsic de l'aïllament en Docker. Els contenidors són a les màquines virtuals el que els threads són als processos. O pots veure-ho com un chroot dopat.

Cicle de vida

Si executes un contenidor sense opcions, aquest s'iniciarà i aturarà automàticament, si vols mantenir-lo funcionant pots utilitzar la comanda docker run -td container_id, això utilitzarà l'opció -t, que habilitarà una pseudo-sessió de TTY, i -d, que separarà el contenidor automàticament (l'executarà en segon pla i mostrarà l'ID del contenidor)

Si vols un contenidor efímer, docker run --rm eliminarà el contenidor tan bon punt s'aturi.

Si vols mapejar un directori de l'host al contenidor de docker, docker run -v $HOSTDIR:$DOCKERDIR. Revisa Volums.

Si en eliminar el contenidor també vols esborrar els volums associats, l'esborrat haurà de contenir -v, per exemple: docker rm -v.

També hi ha un driver de logs disponible per contenidors individuals a Docker 1.10. Per executar docker amb un driver de logs personalitzat, executa docker run --log-driver=syslog.

Una altra opció útil és docker run --name elnomteu docker_image on especificant l'opció --name dins de la comanda run, això et permetrà iniciar i aturar el contenidor utilitzant el nom especificat en crear-lo.

Executant i aturant

Si vols desconnectar-te d'un contenidor, utilitza Ctrl + p, Ctrl + q.

Si vols integrar un contenidor amb un gestor de processos, inicia el daemon amb -r=false, després utilitza docker start -a.

Si vols exposar un port del contenidor a través de l'host, revisa la secció exposant ports.

Les polítiques de reinici en una instància bloquejada s'expliquen aquí.

Restriccions de CPU

Pots limitar la CPU, ja sigui especificant el percentatge global de les CPU o definint el nombre de nuclis.

Per exemple, pots especificar la configuració de cpu-shares. Aquest paràmetre és una mica estrany -- 1024 significa el 100% de la CPU, per la qual cosa si vols que el contenidor utilitzi el 50% de totes les CPU, hauràs d'especificar 512. Revisa https://docs.docker.com/engine/reference/run/#/cpu-share-constraint per més informació.

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

També pots utilitzar únicament alguns nuclis de la CPU utilitzant cpuset-cpus. Revisa https://agileek.github.io/docker/2014/08/06/docker-cpuset/ per més detalls i alguns vídeos xulos:

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

Fixa't que Docker pot seguir veient totes les CPU dins del contenidor -- simplement no les utilitza senceres. Revisa https://github.com/docker/docker/issues/20770 per més informació.

Restriccions de memòria

També pots especificar restriccions de memòria a Docker

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

Capacitats

Les capacitats de linux es poden establir utilitzant cap-add i cap-drop. Revisa https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities per més detalls. Ha d'usar-se per una millor seguretat.

Per muntar un sistema de fitxers basat en FUSE, has de combinar --cap-add amb --device:

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

Per donar accés a un únic dispositiu:

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

Per donar accés a tots els dispositius:

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

Més informació sobre contenidors amb privilegis aquí

Informació

  • docker ps mostra els contenidors funcionant.
  • docker logs recupera els logs del contenidor. (Pots utilitzar un driver personalitzat per als logs, però els logs només estan disponibles per json-file i journald a la versió 1.10).
  • docker inspect revisa tota la informació del contenidor (incloent l'adreça IP).
  • docker events recupera els esdeveniments del contenidor.
  • docker port mostra els ports oberts a l'exterior del contenidor.
  • docker top mostra els processos que s'estan executant al contenidor,
  • docker stats Mostra les estadístiques de l'ús de recursos del contenidor.
  • docker diff Mostra els arxius que han canviat al sistema de fitxers del contenidor.

docker ps -a mostra tots els contenidors: que estiguin funcionant o aturats.

docker stats --all llista tots els contenidors, per defecte només els que estan funcionant.

Import / Export

  • docker cp copia els fitxers i carpetes d'un contenidor al sistema de fitxers local.
  • docker export bolca el sistema de fitxers d'un contenidor com a fitxer .tar al STDOUT.

Executant comandes

Per entrar a un contenidor que estigui funcionant, acobla un nou procés de terminal al contenidor usant: docker exec -it <ID/Nom del contenidor> /bin/bash.

Imatges

Les imatges simplement són plantilles per contenidors de docker.

Imatges-Cicle de vida

  • docker images mostra totes les imatges.
  • docker import crea una imatge a partir d'un fitxer .tar.
  • docker build crea una imatge a partir d'un Dockerfile.
  • docker commit crea una imatge a partir d'un contenidor, aturant-lo temporalment si està funcionant.
  • docker rmi elimina una imatge.
  • docker load carrega una imatge a partir d'un fitxer .tar passat com a STDIN, incloent imatges i etiquetes.
  • docker save desa una imatge en un fitxer .tar passat com a STDOUT amb totes les capes superiors, etiquetes i versions.

Imatges-Informació

Imatges-Netejar

Pots utilitzar la comanda docker rmi per eliminar una imatge específica, però també hi ha una eina alternativa anomenada docker-gc que elimina de forma segura les imatges que ja no estan sent utilitzades per cap contenidor. A la versió 1.13 de docker, també hi ha la comanda docker image prune, la qual elimina les imatges que no estan sent utilitzades. Revisa Prune

Carregar/Desar una imatge

Carrega una imatge a partir d'un fitxer:

docker load < my_image.tar.gz

Desa una imatge existent:

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

Importar/Exportar un contenidor

Importa un contenidor com a imatge a partir d'un fitxer:

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

Exporta un contenidor existent:

docker export my_container | gzip > my_container.tar.gz

Diferència entre carregar i desar una imatge i importar i exportar un contenidor com a imatge

Carregar una imatge utilitzant la comanda load crea una nova imatge incloent el seu historial. Importar un contenidor com a imatge utilitzant la comanda import crea una nova imatge excloent l'historial, la qual cosa es tradueix en una imatge més lleugera comparada amb carregar-la.

Xarxes

Docker té la característica de Xarxes. Docker automàticament crea tres interfícies de xarxa en instal·lar-lo (pont, host, nul·la). Per defecte, quan es llança un nou contenidor és afegit a la xarxa pont. Per habilitar la comunicació entre diversos contenidors pots crear una nova xarxa i llançar els contenidors en ella. Això permet als contenidors comunicar-se entre ells i aïllar-se dels contenidors que no estan connectats a la seva mateixa xarxa. A més, això permet mapejar noms de contenidors a les seves adreces IP. Revisa working with networks per més informació.

Xarxes-Cicle de vida

  • docker network create NAME Crea una nova xarxa (per defecte de tipus pont).
  • docker network rm NAME Elimina una o més xarxes indicant el nom o l'identificador. No poden haver-hi contenidors connectats a la xarxa en eliminar-la.

Xarxes-Informació

Xarxes-Connexió

Pots especificar una ip específica a un contenidor:

# crea una nova xarxa pont amb la subnet i porta d'enllaç específicada
docker network create --subnet 203.0.113.0/24 --gateway 203.0.113.254 iptastic

# executa un contenidor de nginx amb la ip especificada a la xarxa iptastic
$ docker run --rm -it --net iptastic --ip 203.0.113.2 nginx

# curl cap a la ip des de qualsevol altre lloc (donant per fet que és una ip pública hehe)
$ curl 203.0.113.2

Registry i Repositoris

(Nota de traducció: Registry seria traduït com a Registre, però ningú li diu així al món real, així que...)

Un repositori és una col·lecció allotjada d'imatges enllaçades que unides creen el sistema de fitxers per un contenidor.

Un Registry és un allotjament -- un servidor que emmagatzema repositoris i proveeix d'una API HTTP per gestionar l'actualització i descàrrega de repositoris.

Docker.com posseeix el seu propi índex com a Registry centralitzat que conté un gran nombre de repositoris. Dit això, aclarir que el docker Registry no fa una bona feina verificant imatges, per la qual cosa potser hauríes d'evitar-lo si et preocupa la seguretat.

Executar un registry local

Pots executar un registry local utilitzant el projecte distribució de docker i revisant les instruccions de com realitzar el deploy local

Addicionalment revisa la mailing list

Dockerfile

L'arxiu de configuració. Configura un contenidor de docker en executar docker build en ell. Molt més preferible a docker commit.

Aquí tens diversos editors de texts comuns i mòduls de ressaltat de sintaxi que pots usar per crear Dockerfiles:

Instruccions

  • .dockerignore
  • FROM utilitza una imatge base per les següents instruccions.
  • MAINTAINER (deprecated - use LABEL instead) especifica l'autor que ha generat les imatges.
  • RUN executa qualsevol comanda en una nova capa de la imatge i desa l'estat resultant.
  • CMD proporcionar valors predeterminats per un contenidor en execució.
  • EXPOSE informa a Docker que el contenidor estarà escoltant els ports especificats mentre s'executi. NOTA: no fa que els ports siguin accessibles.
  • ENV defineix una variable d'entorn.
  • ADD copia nous fitxers, directoris o arxius remots al contenidor. Invalida caches. Procura evitar usar ADD i intenta utilitzar COPY en el seu lloc.
  • COPY copia nous fitxers o directoris al contenidor. Per defecte els copia com a root independentment de la configuració de USER/WORKDIR. Utilitza --chown=<user>:<group> per canviar el propietari. (El mateix s'aplica a ADD).
  • ENTRYPOINT configura un contenidor que funcionarà com a executable.
  • VOLUME crea un punt de muntatge per volums externs o altres contenidors.
  • USER especifica l'usuari que executarà les pròximes comandes de tipus RUN / CMD / ENTRYPOINTS.
  • WORKDIR especifica el directori de treball.
  • ARG defineix una variable que estarà disponible durant el build.
  • ONBUILD afegeix una instrucció que serà llançada quan la imatge sigui utilitzada com a base d'un altre build.
  • STOPSIGNAL defineix el senyal que serà enviat al contenidor per aturar-se.
  • LABEL aplica metadades de clau/valor per les imatges, contenidors o daemons (serveis).
  • SHELL reemplaça la shell per defecte que és utilitzada per Docker per executar les comandes.
  • HEALTHCHECK indica a docker com provar el contenidor per revisar que segueix funcionant.

Tutorial

Exemples

Capes

Les versions dels sistemes de fitxers en docker es basen en capes. Són similars als git commits o conjunts de canvis per sistemes de fitxers.

Enllaços

Els enllaços defineixen com els contenidors de Docker es comuniquen entre ells mitjançant ports TCP/IP. Atlassian ho explica amb exemples. També pots resoldre enllaços amb noms d'equip.

Això ha estat parcialment deprecat per xarxes definides pels usuaris.

NOTA: Si ÚNICAMENT vols que els contenidors es comuniquin mitjançant enllaços, inicia el servei de Docker amb -icc=false per desactivar la comunicació entre processos.

Si tens un contenidor amb el nom CONTAINER (especificat via docker run --name CONTAINER) i, al Dockerfile, exposes un port:

EXPOSE 1337

I llavors crees un altre contenidor anomenat LINKED de la forma:

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

Llavors els ports exposats i àlies de CONTAINER es mostraran a LINKED amb les següents variables d'entorn:

$ALIAS_PORT_1337_TCP_PORT
$ALIAS_PORT_1337_TCP_ADDR

I t'hi pots connectar d'aquesta forma.

Per eliminar els enllaços, utilitza docker rm --link.

Generalment, enllaçar mitjançant serveis de docker és un subgrup de "descobriment de serveis", un gran problema si tens pensat utilitzar Docker per escalar en producció. Si us plau, llegeix The Docker Ecosystem: Service Discovery and Distributed Configuration Stores per més informació.

Volums

Els volums de Docker són sistemes d'arxius flotants. Aquests no es connecten a un contenidor en particular. Pots utilitzar els volums muntats de contenidors de dades únicament. A partir de Docker 1.9.0, Docker ha anomenat volums que reemplacen els contenidors de només dades. Considera usar volums amb nom per implementar-ho en lloc de contenidors de dades.

Volums-Cicle de vida

Volums-Informació

Els volums són útils en situacions on no pots utilitzar enllaços (els quals són només TCP/IP). Per exemple, si necessitesses tenir dues instàncies de docker comunicant-se deixant dades al sistema de fitxers.

Pots muntar-los en diferents contenidors de docker a la vegada, utilitzant docker run --volumes-from.

Donat que els volums estan aïllats del sistema de fitxers, aquests també són utilitzats per emmagatzemar l'estat a partir de càlculs de contenidors temporals. Exacte, pots tenir un contenidor sense estat i temporal executant-se a partir d'una recepta, destruir-lo, i llavors tenir una altra instància temporal que pugui recuperar el que ha deixat enrere el primer contenidor.

Revisa volums avançats per més informació. Container42 també és d'utilitat.

Pots mapejar directoris de MacOS com a volums de Docker:

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

Pots utilitzar un volum NFS remot si ets valent

També pots plantejar-te utilitzar contenidors de només dades com es descriuen aquí per tenir portabilitat de dades.

Tingues en compte que pots muntar arxius com a volums.

Exposant ports

Exposar ports d'entrada a través d'un contenidor és complex però factible.

Pot fer-se a través del mapejat de ports del contenidor cap a l'host (utilitzant únicament la interfície de localhost) mitjançant l'ús de p:

docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT \
  --name CONTAINER \
  -t algunaimatge

Pots dir-li a docker que el contenidor escolta al port especificat utilitzant EXPOSE:

EXPOSE <CONTAINERPORT>

Nota que EXPOSE no exposa el port per si mateix - només -p ho fa.

Per exposar el port d'un contenidor a localhost, executa:

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

Si estàs executant Docker a Virtualbox, també necessitaràs fer forward del port, utilitzant [forwarded_port] (https://docs.vagrantup.com/v2/networking/forwarded_ports.html). Defineix un rang de ports al teu Vagrantfile de la següent manera per mapejar-los dinàmicament:

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

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

  ...
end

Si t'oblides dels ports que has mapejat, utilitza docker port per mostrar-ho:

docker port CONTAINER $CONTAINERPORT

Bones pràctiques

Aquí tens algunes bones pràctiques de Docker i algunes batalles:

Docker-Compose

Compose és una eina per definir i executar diverses aplicacions en contenidors de Docker. Amb Compose, utilitzes un arxiu YAML per configurar els teus serveis. Llavors, amb una única comanda, crees i inicies tots els serveis des de les teves configuracions. Per aprendre més sobre les característiques de Compose, revisa la llista de característiques.

Utilitzant la següent comanda pots iniciar la teva aplicació:

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

També pots executar docker-compose en segon pla utilitzant el paràmetre -d, llavors podràs aturar-ho quan ho necessitis amb la comanda:

docker-compose stop

Pots tirar-ho tot, eliminant els contenidors completament, amb la comanda down. Utilitza el paràmetre --volumes per també eliminar els volums de dades.

Seguretat

Aquí et deixem alguns consells de seguretat sobre com funciona Docker. La pàgina de Docker de [seguretat]](https://docs.docker.com/engine/security/security/) ho explica en més detall.

El primer: Docker s'executa com a root. Si ets al grup docker, tens accés root. Si exposes el socket d'unix de docker a un contenidor, li estàs donant al contenidor accés root a la màquina host.

Docker no hauria de ser la teva única defensa. Hauries d'assegurar-lo i protegir-lo.

Per entendre com s'exposen els contenidors, hauríes de llegir Entenent i endurint Contenidors Linux d'Aaron Grattafiori. Aquesta és una guia completa i entenedora sobre els riscos relacionats amb els contenidors, amb una gran quantitat d'enllaços i notes al peu de pàgina. Els següents consells de seguretat són útils si ja has protegit els teus contenidors al passat, però no són substituts a entendre-ho.

Consells de seguretat

Per major seguretat, pots executar Docker dins d'una màquina virtual. Això és un consell del Cap de l'Equip de Seguretat de Docker -- diapositives / notes. Llavors, executa'l amb AppArmor / seccomp / SELinux /grsec etc. per limitar els permisos del contenidor. Revisa les característiques de seguretat de Docker 1.10 per més detalls.

Els identificadors de les imatges de Docker són informació sensible i no haurien d'exposar-se al món exterior. Tracta'ls com a contrasenyes.

Revisa la Xuleta de Seguretat de Docker de Thomas Sjögren: allà podràs trobar bons consells sobre com protegir-se.

Revisa l'script de seguretat de Docker Bench.

Les 10 Millors Pràctiques de Seguretat per Imatges de Docker de Snyk

Pots començar utilitzant un Kernel amb pedaços inestables de grsecurity / pax compilats, com Alpine Linux. Si fas ús de grsecurity en producció, hauríes de buscar suport comercial per els pedaços estables, de la mateixa forma que hauríes de fer per RedHat. Són uns 200$ al mes, la qual cosa és insignificant pel pressupost de devops.

A partir de Docker 1.11, pots limitar fàcilment el nombre de processos que s'executen en un contenidor per evitar fork bombs. Això requereix utilitzar un Kernel de Linux >= 4.3 amb CGROUP_PIDS=y a la configuració del kernel.

docker run --pids-limit=64

A partir de Docker 1.11 també està disponible la possibilitat d'evitar que els processos guanyin nous privilegis. Aquesta característica està al Kernel de Linux des de la versió 3.5. Pots llegir més al respecte en aquest blog.

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

De la Xuleta de Seguretat de Docker (és un PDF i és una mica complex d'usar, així que millor copia de sota) de Container Solutions:

Desactiva la comunicació interprocessal amb:

docker -d --icc=false --iptables

Estableix que el contenidor sigui només lectura:

docker run --read-only

Verifica les imatges amb un hashsum:

docker pull debian@sha256:a25306f3850e1bd44541976aa7b5fd0a29be

Estableix el volum com a només lectura:

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

Crea i utilitza un usuari al Dockerfile per evitar executar com a root dins del contenidor:

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

Espai de Noms de l'Usuari (User Namespaces)

També cal treballar amb els espais de noms d'usuari -- disponible a la 1.10, però no activat per defecte.

Per activar aquesta característica ("reassignar els usuaris") a ubuntu 15.10, segueix aquest exemple.

Vídeos de Seguretat

Ruta de Seguretat

La ruta de Docker parla sobre el suport de seccomp.

També hi ha una política d'AppArmor anomenada bane, i estan treballant en perfils de seguretat

Consells

Fonts:

Prune

Les noves Comandes de maneig de dades van arribar a Docker a la versió 1.13

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

df

docker system df mostra un resum de l'espai actualment utilitzat pels diferents elements de Docker.

Heredoc Docker Container

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

Últimes IDs

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

Commit amb comanda (necessita de Dockerfile)

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

Recuperar l'adreça IP

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

O, amb jq instal·lat:

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

O, utilitzant una plantilla:

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

O, en construir la imatge des d'un Dockerfile, quan vols passar arguments de compilació:

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 mapejat de ports

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

Trobar contenidors mitjançant expressions regulars

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

Recuperar la configuració de l'entorn

docker run --rm ubuntu env

Aturar els contenidors en funcionament

docker kill $(docker ps -q)

Eliminar tots els contenidors (FORÇANT! Els esborrarà estiguin funcionant o aturats)

docker rm -f $(docker ps -qa)

Eliminar els vells contenidors

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

Eliminar els contenidors aturats

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

Eliminar els contenidors després d'aturar-los

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

Eliminar les imatges penjades

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

Eliminar totes les imatges

docker rmi $(docker images -q)

Eliminar els volums penjats

Com a Docker 1.9:

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

A 1.9.0, el filtre dangling=false no funciona - és ignorat i mostrarà tots els volums

Mostrar les dependències de les imatges

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

Reduir la mida dels contenidors Docker

  • Netejar l'APT en una capa RUN - Això hauria de fer-se a la mateixa capa que les altres comandes apt. Sinó, les capes prèvies seguiran tenint la informació original i la imatge seguirà sent pesant.

    RUN {apt commands} \
      && apt-get clean \
      && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
  • Aplanar una imatge

    ID=$(docker run -d image-name /bin/bash)
    docker export $ID | docker import  flat-image-name
    
  • Per les còpies de seguretat

    ID=$(docker run -d image-name /bin/bash)
    (docker export $ID | gzip -c > image.tgz)
    gzip -dc image.tgz | docker import - flat-image-name
    

Monitoritzar els recursos del sistema utilitzats pels contenidors en funcionament

Per revisar l'ús de CPU, memòria i E/S de xarxa per un sol contenidor, pots utilitzar:

docker stats <container>

Per tots els contenidors llistats per ID:

docker stats $(docker ps -q)

Per tots els contenidors llistats per nom:

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

Per tots els contenidors llistats per imatge:

docker ps -a -f ancestor=ubuntu

Eliminar totes les imatges sense etiquetes:

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

Eliminar contenidors mitjançant una expressió regular:

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

Elimina tots els contenidors en estat "Exit":

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

Els volums poden ser fitxers

Tingues en compte que pots muntar fitxers com a volums. Per exemple, poden injectar un arxiu de configuració així:

# copia l'arxiu del contenidor
docker run --rm httpd cat /usr/local/apache2/conf/httpd.conf > httpd.conf

# edita l'arxiu
vim httpd.conf

# inicia el contenidor amb la configuració modificada
docker run --rm -it -v "$PWD/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" -p "80:80" httpd