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:
| Comando | Función | Ejemplo |
|---|---|---|
docker run | Iniciar un nuevo contenedor y ejecutar un comando | docker run -d ubuntu |
docker ps | Listar los contenedores actualmente en ejecución | docker ps |
docker ps -a | Listar todos los contenedores (incluidos los detenidos) | docker ps -a |
docker build | Construir una imagen usando un Dockerfile | docker build -t my-image . |
docker images | Listar todas las imágenes almacenadas localmente | docker images |
docker pull | Descargar una imagen de un repositorio Docker | docker pull ubuntu |
docker push | Enviar una imagen a un repositorio Docker | docker push my-image |
docker exec | Ejecutar un comando en un contenedor en ejecución | docker exec -it container_name bash |
docker stop | Detener uno o más contenedores | docker stop container_name |
docker start | Iniciar contenedores detenidos | docker start container_name |
docker restart | Reiniciar un contenedor | docker restart container_name |
docker rm | Eliminar uno o más contenedores | docker rm container_name |
docker rmi | Eliminar una o más imágenes | docker rmi my-image |
docker logs | Ver los logs del contenedor | docker logs container_name |
docker inspect | Obtener información detallada de un contenedor o imagen | docker inspect container_name |
docker exec -it | Entrar en la terminal interactiva del contenedor | docker exec -it container_name /bin/bash |
docker network ls | Listar todas las redes Docker | docker network ls |
docker volume ls | Listar todos los volúmenes Docker | docker volume ls |
docker-compose up | Iniciar una aplicación multi-contenedor (desde eldocker-compose.ymlarchivo) | docker-compose up |
docker-compose down | Detener y eliminar losdocker-composecontenedores, redes, etc. iniciados por | docker-compose down |
docker info | Mostrar información detallada del sistema Docker | docker info |
docker version | Mostrar la información de versión del cliente Docker y del demonio | docker version |
docker stats | Mostrar el uso de recursos en tiempo real de los contenedores | docker stats |
docker login | Iniciar sesión en el repositorio Docker | docker login |
docker logout | Cerrar sesión del repositorio Docker | docker 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 removeOtras extensiones




