Uso de contenedores Docker

Un contenedor Docker es un entorno de software ligero, portátil y autosuficiente que se utiliza para ejecutar aplicaciones.

Un contenedor Docker empaqueta la aplicación y todas sus dependencias (incluyendo bibliotecas, archivos de configuración, herramientas del sistema, etc.) en un paquete estandarizado, lo que permite que la aplicación se ejecute de manera consistente en cualquier lugar.

Los contenedores son una virtualización a nivel de sistema operativo; no necesitan ejecutar un sistema operativo completo, por lo que su inicio y ejecución son más eficientes.

Relación entre imágenes y contenedores

  • Imagen (Image): Plantilla estática del contenedor que contiene todas las dependencias y archivos necesarios para ejecutar la aplicación. La imagen es inmutable.
  • Contenedor (Container): Una instancia en ejecución de la imagen, con su propio sistema de archivos, procesos, red, etc., y es dinámico. El contenedor se inicia desde la imagen y permanece mutable durante su ejecución.


Cliente Docker

El cliente Docker es una herramienta de línea de comandos que interactúa con el demonio de Docker (Docker Daemon).

El cliente docker es muy sencillo; podemos escribir directamente el comando docker para ver todas las opciones de comandos del cliente Docker.

ejemplo@ejemplo:~# docker

Se puede usar el comandodocker command --helppara comprender más a fondo el uso de un comando específico de Docker.

Por ejemplo, si queremos consultardocker statsel uso específico del comando:

ejemplo@ejemplo:~# docker stats --help

Los siguientes son comandos comunes del cliente Docker:

ComandoFunciónEjemplo
docker runIniciar un nuevo contenedor y ejecutar un comandodocker run -d ubuntu
docker psListar los contenedores actualmente en ejecucióndocker ps
docker ps -aListar todos los contenedores (incluidos los detenidos)docker ps -a
docker buildConstruir una imagen usando un Dockerfiledocker build -t my-image .
docker imagesListar todas las imágenes almacenadas localmentedocker images
docker pullDescargar una imagen de un repositorio Dockerdocker pull ubuntu
docker pushEnviar una imagen a un repositorio Dockerdocker push my-image
docker execEjecutar un comando en un contenedor en ejecucióndocker exec -it container_name bash
docker stopDetener uno o más contenedoresdocker stop container_name
docker startIniciar contenedores detenidosdocker start container_name
docker restartReiniciar un contenedordocker restart container_name
docker rmEliminar uno o más contenedoresdocker rm container_name
docker rmiEliminar una o más imágenesdocker rmi my-image
docker logsVer los logs del contenedordocker logs container_name
docker inspectObtener información detallada de un contenedor o imagendocker inspect container_name
docker exec -itEntrar en la terminal interactiva del contenedordocker exec -it container_name /bin/bash
docker network lsListar todas las redes Dockerdocker network ls
docker volume lsListar todos los volúmenes Dockerdocker volume ls
docker-compose upIniciar una aplicación multi-contenedor (desde eldocker-compose.ymlarchivo)docker-compose up
docker-compose downDetener y eliminar losdocker-composecontenedores, redes, etc. iniciados pordocker-compose down
docker infoMostrar información detallada del sistema Dockerdocker info
docker versionMostrar la información de versión del cliente Docker y del demoniodocker version
docker statsMostrar el uso de recursos en tiempo real de los contenedoresdocker stats
docker loginIniciar sesión en el repositorio Dockerdocker login
docker logoutCerrar sesión del repositorio Dockerdocker logout

Explicación de las opciones comunes:

  • -d: Ejecutar el contenedor en segundo plano, por ejemplodocker run -d ubuntu。
  • -it: Ejecutar el contenedor con una terminal interactiva, por ejemplodocker exec -it container_name bash。
  • -t: Especificar una etiqueta para la imagen, por ejemplodocker build -t my-image .。

Uso de contenedores

Obtener una imagen

Si no tenemos la imagen ubuntu localmente, podemos usar el comando docker pull para cargar la imagen ubuntu:

$ docker pull ubuntu

Iniciar un contenedor

El siguiente comando inicia un contenedor usando la imagen ubuntu, con el parámetro para entrar en el contenedor en modo línea de comandos:

$ docker run -it ubuntu /bin/bash

Explicación de parámetros:

  • -i: Operación interactiva.
  • -t: Terminal.
  • ubuntu: Imagen ubuntu.
  • /bin/bash: Lo que va después del nombre de la imagen es el comando; aquí queremos un Shell interactivo, por lo que usamos /bin/bash.

Para salir de la terminal, simplemente escribeexit:

root@ed09e4490c57:/# exit

Iniciar un contenedor detenido

El comando para ver todos los contenedores es el siguiente:

$ docker ps -a

Haz clic en la imagen para verla en grande:

Usa docker start para iniciar un contenedor detenido:

$ docker start b750bbbcfd88 

Ejecución en segundo plano

En la mayoría de los casos, queremos que el servicio docker se ejecute en segundo plano; podemos usar-dpara especificar el modo de ejecución del contenedor.

$ docker run -itd --name ubuntu-test ubuntu /bin/bash

Haz clic en la imagen para verla en grande:

Nota:Si se agrega el parámetro-dde forma predeterminada no se entra en el contenedor; para entrar se necesita usar el comando docker exec(que se explicará más adelante).

Detener un contenedor

El comando para detener un contenedor es el siguiente:

$ docker stop <容器 ID>

Un contenedor detenido se puede reiniciar con docker restart:

$ docker restart <容器 ID>

Entrar en un contenedor

Al usar el parámetro-dpara iniciar el contenedor, este se ejecuta en segundo plano. En este caso, si se quiere entrar en el contenedor, se puede hacer con los siguientes comandos:

  • docker attach: Permite interactuar con la entrada estándar (stdin), la salida estándar (stdout) y el error estándar (stderr) del contenedor.

  • docker exec: Se recomienda usar el comando docker exec, porque al salir de la terminal del contenedor con este comando no se detiene el contenedor.

Comando attach

Ejemplo de uso del comando docker attach:

$ docker attach 1e560fca3906 

Nota:Si se sale de este contenedor, esto provocará que el contenedor se detenga.

Comando exec

Ejemplo de uso del comando docker exec:

docker exec -it 243c32535da7 /bin/bash

Nota:Si se sale de este contenedor, el contenedor no se detiene; por eso se recomienda usardocker exec。

Para más explicaciones sobre los parámetros, use el comandodocker exec --helppara consultarlas.

Exportar e importar contenedores

Exportar un contenedor

Si desea exportar un contenedor local, puede usar el comandodocker export.

$ docker export 1e560fca3906 > ubuntu.tar

Exporta la instantánea del contenedor 1e560fca3906 al archivo local ubuntu.tar.

Así se exporta la instantánea del contenedor a un archivo local.

Importar una instantánea de contenedor

Se puede usar docker import para importar un archivo de instantánea de contenedor como imagen. El siguiente ejemplo importa el archivo de instantánea ubuntu.tar a la imagen test/ubuntu:v1:

$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1

Además, también se puede importar especificando una URL o un directorio, por ejemplo:

$ docker import http://example.com/exampleimage.tgz example/imagerepo

Eliminar un contenedor

Para eliminar un contenedor se usa el comandodocker rm:

$ docker rm -f 1e560fca3906

El siguiente comando puede limpiar todos los contenedores en estado terminado.

$ docker container prune

Ejecutar una aplicación web

Los contenedores que ejecutamos anteriormente no tenían ningún uso especial.

A continuación, intentemos usar docker para construir una aplicación web.

Ejecutaremos una aplicación Python Flask dentro de un contenedor docker para ejecutar una aplicación web.

ejemplo@ejemplo:~# docker pull training/webapp  # 载入镜像
ejemplo@ejemplo:~# docker run -d -P training/webapp python app.py

Explicación de parámetros:

  • -d:Hace que el contenedor se ejecute en segundo plano.

  • -P:Mapea aleatoriamente el puerto de red utilizado dentro del contenedor al host que usamos.


Ver el contenedor de la aplicación WEB

Usa docker ps para ver los contenedores que estamos ejecutando:

ejemplo@ejemplo:~#  docker ps
CONTAINER ID        IMAGE               COMMAND             ...        PORTS                 
d3d5e39ed9d3        training/webapp     "python app.py"     ...        0.0.0.0:32769->5000/tcp

Aquí aparece información adicional sobre los puertos.

PORTS
0.0.0.0:32769->5000/tcp

Docker abrió el puerto 5000 (puerto predeterminado de Python Flask) mapeado al puerto 32769 del host.

En este momento podemos acceder a la aplicación WEB a través del navegador

También podemos usar el parámetro -p para configurar un puerto diferente:

ejemplo@ejemplo:~$ docker run -d -p 5000:5000 training/webapp python app.py

docker psVer los contenedores en ejecución

ejemplo@ejemplo:~#  docker ps
CONTAINER ID        IMAGE                             PORTS                     NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar
d3d5e39ed9d3        training/webapp     ...        0.0.0.0:32769->5000/tcp   xenodochial_hoov

El puerto 5000 dentro del contenedor está mapeado al puerto 5000 de nuestro host local.


Atajo para puertos de red

A través del comandodocker psse pueden ver los mapeos de puertos del contenedor;dockertambién se proporciona otro atajo,docker portusandodocker portse puede ver a qué puerto del host está mapeado un puerto específico de un contenedor determinado (por ID o nombre).

Arriba, el ID del contenedor de la aplicación web que creamos esbf08b7f2cd89El nombre eswizardly_chandrasekhar。

Puedo usardocker port bf08b7f2cd89odocker port wizardly_chandrasekharpara ver la asignación de puertos del contenedor.

ejemplo@ejemplo:~$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000
ejemplo@ejemplo:~$ docker port wizardly_chandrasekhar
5000/tcp -> 0.0.0.0:5000

Ver los logs de la aplicación WEB

docker logs [ID o nombre] puede ver la salida estándar dentro del contenedor.

ejemplo@ejemplo:~$ docker logs -f bf08b7f2cd89
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -
192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -

-f:Dejardocker logsIgual que usartail -fpara generar la salida estándar dentro del contenedor.

De lo anterior, podemos ver que la aplicación usa el puerto 5000 y podemos consultar los registros de acceso de la aplicación.


Ver los procesos del contenedor de la aplicación WEB

También podemos usar docker top para ver los procesos que se ejecutan dentro del contenedor.

ejemplo@ejemplo:~$ docker top wizardly_chandrasekhar
UID     PID         PPID          ...       TIME                CMD
root    23245       23228         ...       00:00:00            python app.py

Inspeccionar la aplicación WEB

Usardocker inspectpara ver la información subyacente de Docker. Devolverá un archivo JSON que registra la configuración y el estado del contenedor Docker.

ejemplo@ejemplo:~$ docker inspect wizardly_chandrasekhar
[
    {
        "Id": "bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85",
        "Created": "2018-09-17T01:41:26.174228707Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23245,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-09-17T01:41:26.494185806Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
......

Detener el contenedor de la aplicación WEB

ejemplo@ejemplo:~$ docker stop wizardly_chandrasekhar   
wizardly_chandrasekhar

Reiniciar el contenedor de la aplicación WEB

Para contenedores ya detenidos, podemos usar el comando docker start para iniciarlos.

ejemplo@ejemplo:~$ docker start wizardly_chandrasekhar
wizardly_chandrasekhar

docker ps -l consulta el último contenedor creado:

#  docker ps -l 
CONTAINER ID        IMAGE                             PORTS                     NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar

Para contenedores en ejecución, podemos usardocker restartel comando para reiniciarlos.


Eliminar el contenedor de la aplicación WEB

Podemos usar el comando docker rm para eliminar contenedores que no necesitamos.

ejemplo@ejemplo:~$ docker rm wizardly_chandrasekhar  
wizardly_chandrasekhar

Al eliminar un contenedor, este debe estar detenido; de lo contrario, se mostrará el siguiente error.

ejemplo@ejemplo:~$ docker rm wizardly_chandrasekhar
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
Otras extensiones