Docker es el sistema de contenedores de moda. Aprende en esta guía los comandos prácticos de Docker más usados para desarrolladores de software. Podrás entender el listado de comandos esenciales que te permitirán empezar a usar contenedores en tus proyectos.
Antes de empezar, te recomiendo que leas la entrada de Introducción a Docker, en la que explico brevemente en qué consiste Docker, cuáles son sus componentes y sus ventajas más destacadas.
Contenidos
Instalación de Docker
Podemos comprobar las especificaciones y los requisitos necesarios para instalar Docker en este enlace de la documentación oficial. Como vemos, soporta la mayoría de los sistemas Linux, Mac e incluso Windows.
Una vez instalado en nuestro sistema, podemos comprobar la versión que acabamos de instalar con el siguiente comando:
> docker -v
Docker version 19.03.12, build 48a66213fe
Si queremos obtener más información sobre la instalación, podemos usar el comando docker version o bien docker info.
Para comprobar que la instalación funciona correctamente, ejecutamos un contenedor de prueba o «hello world» con docker run de la siguiente forma:
> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Como vemos, nos mostrará un mensaje de bienvenida en el caso de que todo haya funcionado correctamente. Ya estaría listo.
La imagen de hello-world es un ejemplo con un único fichero hello.c que imprime el mensaje en la terminal. El comando predeterminado de esta imagen es ejecutar este binario.
Comandos Básicos en Docker
Simplemente con el comando docker sin argumentos, la CLI nos mostrará todos los comandos que tenemos disponibles.
> docker
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/home/oscarfmdc/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/home/oscarfmdc/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/home/oscarfmdc/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/home/oscarfmdc/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
builder Manage builds
config Manage Docker configs
container Manage containers
context Manage contexts
engine Manage the docker engine
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
[...]
Run 'docker COMMAND --help' for more information on a command.
Podemos listar los contenedores en ejecución en nuestro sistema con el comando docker ps. Si queremos listar también los contenedores que no se encuentran en ejecución en ese momento lo podremos hacer añadiendo el argumento -a.
> sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
> sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28e8d9c948bd hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago kind_sinoussi
En esta lista se nos muestra el identificador del contenedor, el nombre de la imagen, el comando ejecutado, el momento de creación, el estado del contenedor, los puertos expuestos y el nombre aleatorio que se le ha asignado.
Para listar las imágenes presentes en el sistema usamos el comando docker image ls.
> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ecc90e329606 5 months ago 870MB
mongo latest 105a8b77784b 5 months ago 364MB
golang 1.12 8639ad3fc384 5 months ago 810MB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
golang 1.12 f50db16df5da 11 months ago 774MB
mongo latest 785c65f61380 12 months ago 412MB
mesosphere/janitor latest 048f72c638e1 2 years ago 462MB
Para parar un contenedor en ejecución debemos usar docker stop seguido del identificador del contenedor o de su nombre. De la misma manera, podemos eliminarlo usando el comando docker rm. A estos comandos también les podemos indicar una lista de identificadores separados por espacios para que realicen la acción en todos ellos.
> sudo docker stop e7e8165c699a
e7e8165c699a
> sudo docker rm e7e8165c699a
e7e8165c699a
Para parar o eliminar todos los contenedores en ejecución del host, usaremos el siguiente comando, al que le indicamos la salida del comando docker ps -aq, que contiene todos los contenedores.
> docker stop $(docker ps -aq)
> docker rm $(docker ps -aq)
Para eliminar una imagen, usamos el comando docker rmi seguido del identificador o del nombre de la imagen. También, podemos eliminar todas las imágenes del sistema como indico a continuación
> sudo docker rmi bf756fb1ae65
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
> sudo docker rmi $(docker images -a -q)
A menudo, necesitaremos acceder a la terminal de de un contenedor en ejecución de forma interactiva. Para hacerlo, y suponiendo que tiene disponible bash, podemos ejecutar el comando docker exec -it <idcontenedor> /bin/bash. En el siguiente ejemplo lo ejecutamos junto a un nuevo contenedor para terminar dentro de su consola.
> docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
a4a2a29f9ba4: Pull complete
127c9761dcba: Pull complete
d13bf203e905: Pull complete
4039240d2e0b: Pull complete
Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce
Status: Downloaded newer image for ubuntu:latest
root@5af1b1e0b30e:/#
Volúmenes en Contenedores Docker
En los contenedores Docker, podemos agregar almacenamiento de datos externo. De esta forma, es posible crear directorios que se montarán en el contenedor cada vez que éste ejecute. Sobre este directorio podrán trabajar las aplicaciones.
> mkdir /tmp/testdir
> docker run -v /tmp/testdir:/root/testdir httpd
El ejemplo ejecuta un contenedor con el software httpd y tiene montado el directorio /tmp/testdir de la máquina host en la ruta /root/testdir del contenedor.
Cursos y Libros de Docker
Aquí tienes mis dos cursos favoritos de Docker en español que encontrarás en español para aprender esta tecnología fundamental desde cero:
Curso de Introducción a Contenedores con Docker y Kubernetes
Este curso ofrecido por IBM en Coursera te enseñará a usar Docker desde cero. Con más de 11 horas de vídeo en español aprenderás a utilizar contenedores, las diferencias con máquinas virtuales y las ventajas que ofrecen en la nube. También los ecosistemas de Kubernetes, Red Hat OpenShift e Istio a través de ejercicios prácticos.
Docker, de principiante a experto
Este curso disponible en Udemy te enseñará a usar Docker en más de 8 horas de vídeo también en español. Entenderás todos los conceptos como imágenes, contenedores, volúmenes, redes y Docker Compose.
Además, te recomiendo los siguientes libros:
A continuación el vídeo-resumen. ¡No te lo pierdas!