Fundamentos prácticos de Docker: Componentes clave

Fundamentos prácticos de Docker: Componentes clave

¿Cuáles son los comandos de Docker?

Empezamos esta sección utilizando la línea de comandos y para ello vamos a utilizar el comando docker --help para ver las opciones mostradas por la ayuda de docker.

docker --help

La mayoría de los comandos han sido migrados a grupos, por ejemplo para listar los contenedores antes utilizábamos docker ps, ahora usamos docker container ls.

¿Cuáles son los comandos administrativos de Docker?

La siguiente tabla muestra las categorías de comandos administrativos de Docker.

Grupo Descripción
builder Administra los builds
config Administra los configs
container Administra los contenedores
engine Administra el motor de docker
image Administra las imágenes
network Administra las redes
node Administra los nodos de swarm
plugin Administra los plugins
secret Administra los docker secrets
service Administra los servicios
stack Administra los docker stacks
swarm Administra Swarm
system Administra Docker
trust Administra la confianza en las imágenes de Docker
volume Administra los volumes

¿Cómo expandir la documentación de los comandos de Docker?

Si deseamos ver una lista con las opciones de cada uno de estos comandos de administración, podemos pasar el parámetro --help, por ejemplo.

docker image --help
Usage:	docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

¿Cómo listar las imágenes de Docker?

Vamos a listar las imágenes usando image ls.

docker image ls

¿Cómo descargar una imagen de Docker?

Si no encontramos ninguna imagen listada entonces podemos descargar de la imagen nginx mediante docker pull.

docker image pull nginx

Si la imagen no se encuentra almacenada previamente iniciará la descarga de esta.

Volvemos a listar las imágenes.

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.15                53f3fd8007f7        20 months ago       109MB

La tercer columna nos muestra el identificador de la imagen, con este podemos ver los detalles de ella usando el comando image inspect.

¿Cómo ver la información detallada de una imagen de Docker?

docker image inspect 53f3fd8007f7

Lo que vamos a poder ver es un json bastante grande con los detalles de esta imagen.

Al ejecutar un contenedor docker verifica que este se encuentra disponible dentro de la lista de imágenes, si no es así realiza primero la descarga de la imagen y su posterior ejecución.

docker container run busybox

Si intentamos listar los contenedores busybox no aparecerá en la lista ya que después de ejecutarse se realiza la terminación de este.

docker container ls

Sin embargo podemos listar utilizando el parámetro -a que lista todos los contenedores, incluyendo aquellos que ya han sido terminados.

docker container ls -a

¿Cómo autoasignar puertos a un contenedor de Docker?

Cuando se ejecuta un contenedor, este viene con una lista de puertos que se pueden enrutar a los puertos del host, para autoasignarlos a un puerto aleatorio podemos usar el parámetro -P. En el caso de nginx, el contenedor se mantiene en ejecución ya que es un servidor web, para hacer que esta ejecución se realice en segundo plano sin bloquear nuestra línea de comandos podemos usar el parámetro -d (detached).

docker container run -P -d nginx

Listamos los contenedores en ejecución.

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                   NAMES
bf788dc0e726        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:32768->80/tcp   compassionate_shockley

Y podemos ver que nuestro servidor web nginx esta en ejecución, además de que el puerto 80 del contenedor esta accesible en el puerto 32768 del host (este valor es distinto en cada ejecución). Si accedemos a http://localhost:32768 podremos ver la página de bienvenida del servidor web.

También es posible acceder directamente desde el puerto 80 del contenedor pero para ello necesitamos su ip.

docker container inspect bf788dc0e726
"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "1e4a05ae60e6792880e0ea1937f8a1f8e219bee8ee8e6ebb836b5974deafeae1",
        "EndpointID": "cc894db0b34ca84cdebaf00ec847389f29610ed9b1550493e5e31f61393179ce",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:02",
        "DriverOpts": null
    }
}

De la información del contenedor tomamos el valor IpAddress, y podemos abrir la dirección http://172.17.0.2 sin especificar el puerto ya que por default el servidor web despliega el puerto 80.

¿Cómo mostrar la ejecución de un contenedor de Docker?

Si deseamos ver la salida de un contener en ejecución podemos usar el comando container attach.

docker container attach bf788dc0e726

En este caso he realizado el attach al contenedor nginx, sin embargo debido a que nginx envía la salida de la ejecución del servidor web a los logs del sistema, no es posible ver la ejecución del programa. Otra cosa importante que mencionar es que en el momento en que realicemos la desconexión del contenedor este se va a detener.

¿Cómo reiniciar la ejecución de un contenedor de Docker?

Para reiniciar el contenedor podemos utilizar el comando docker container start.

docker container start bf788dc0e726

¿Cómo detener la ejecución de un contenedor de Docker?

Si por el contrario lo que deseo es detener la ejecución del contenedor, utilizamos el comando container stop.

docker container stop bf788dc0e726

¿Cómo ver los logs de un contenedor de Docker?

Si deseamos ver los logs de salida de un contenedor podemos usar el comando container logs.

docker container logs bf788dc0e726

Para generar algo de tráfico podemos usar curl ip_del_contenedor, esto generará una petición que sera visible dentro de los logs.

172.17.0.1 - - [17/Jan/2021:14:36:52 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

¿Cómo ver la información de los recursos utilizados por un contenedor de Docker?

Si deseamos ver los recursos utilizados por nuestro contenedor podemos usar el comando container stats.

docker container stats bf788dc0e726
CONTAINER ID        NAME                     CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
bf788dc0e726        compassionate_shockley   0.00%               3.797MiB / 31.21GiB   0.01%               28.9kB / 2.46kB     0B / 0B             2

El comando container stats muestra una tabla con la información del uso del CPU, memoria, trafico de la red, entre otros.

Para entrar dentro del sistema operativo del contenedor y ejecutar cualquiera de los comandos del que este dispone, hacemos uso del comando container exec –it.

docker container exec -it bf788dc0e726 /bin/bash

Una ves dentro del sistema operativo veremos el prompt, en este caso el de linux, y podremos usar cualquiera de los comandos disponibles.

¿Cómo pausar y restablecer la ejecución de un contenedor de Docker?

Si necesitamos pausar/reanudar el contenedor utilizamos los comandos container pause y container unpause.

docker container pause bf788dc0e726
docker container unpause bf788dc0e726

¿Cómo eliminar un contenedor de Docker?

Para eliminar un contenedor utilizamos el comando container rm -f.

docker container rm -f bf788dc0e726

El parámetro -f detiene el contenedor si este se encuentra en ejecución, si este no se especifica y el contenedor esta ejecutándose no podrá ser eliminado.