Docker es una plataforma que le permite desarrollar, probar e implementar aplicaciones como contenedores portátiles y autosuficientes que se ejecutan prácticamente en cualquier lugar.

El docker runcomando crea un contenedor a partir de una imagen dada e inicia el contenedor usando un comando dado. Es uno de los primeros comandos con los que debe familiarizarse al comenzar a trabajar con Docker.

En este artículo, usaremos la imagen oficial de Nginx para mostrar varias formas de ejecutar un contenedor Docker.

Comando de ejecución de Docker

El docker runcomando toma la siguiente forma:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

El nombre de la imagen a partir de la cual se debe crear el contenedor es el único argumento necesario para el docker runcomando. Si la imagen no está presente en el sistema local, se extrae del registro.

Si no se especifica ningún comando, el comando especificado en las instrucciones CMDo de Dockerfile ENTRYPOINTse ejecuta al ejecutar el contenedor.

A partir de la versión 1.13, la CLI de Docker se ha reestructurado. Todos los comandos se han agrupado bajo el objeto con el que interactúan.

Dado que el runcomando interactúa con los contenedores, es un subcomando de docker containerLa sintaxis del nuevo comando es la siguiente:

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

La sintaxis anterior a 1.13 todavía es compatible. Debajo del capó, docker runcommand es un alias para docker container runSe anima a los usuarios a utilizar la nueva sintaxis de comandos.

Puede encontrar una lista de todas las docker container runopciones en la página de documentación de Docker .

Ejecute el contenedor en primer plano

De forma predeterminada, cuando no se proporciona ninguna opción al docker runcomando, el proceso raíz se inicia en primer plano. Esto significa que la entrada, la salida y el error estándar del proceso raíz se adjuntan a la sesión de terminal.

docker container run nginx

El resultado del proceso nginx se mostrará en su terminal. Como no hay conexiones con el servidor web, la terminal está vacía.

Para detener el contenedor, termine el proceso Nginx en ejecución presionando CTRL+C.

Ejecute el contenedor en modo separado

Para mantener el contenedor en ejecución cuando salga de la sesión de terminal, inícielo en un modo separado. Esto es similar a ejecutar un proceso de Linux en segundo plano .

Utilice la -dopción para iniciar un contenedor separado:

docker container run -d nginx
050e72d8567a3ec1e66370350b0069ab5219614f9701f63fcf02e8c8689f04fa

El contenedor separado se detendrá cuando finalice el proceso raíz.

Puede enumerar los contenedores en ejecución con el docker container ls comando.

Para adjuntar su terminal al proceso raíz del contenedor separado, use el docker container attach comando.

Retire el contenedor después de la salida

De forma predeterminada, cuando el contenedor sale, su sistema de archivos persiste en el sistema host.

Las --rmopciones le dicen docker runal comando que elimine el contenedor cuando sale automáticamente:

docker container run --rm nginx

La imagen de Nginx puede no ser el mejor ejemplo para limpiar el sistema de archivos del contenedor después de que el contenedor sale. Esta opción generalmente se usa en contenedores de primer plano que realizan tareas a corto plazo, como pruebas o copias de seguridad de la base de datos.

Establecer el nombre del contenedor

En Docker, cada contenedor se identifica por su UUIDnombre. De forma predeterminada, si no se establece explícitamente, el daemon de Docker genera automáticamente el nombre del contenedor.

Utilice la --nameopción para asignar un nombre personalizado al contenedor:

docker container run -d --name my_nginx nginx

El nombre del contenedor debe ser único. Si intenta iniciar otro contenedor con el mismo nombre, obtendrá un error similar a este:

docker: Error response from daemon: Conflict. The container name "/my_nginx" is already in use by container "9...c". You have to remove (or rename) that container to be able to reuse that name.

Ejecute docker container ls -apara enumerar todos los contenedores y ver sus nombres:

docker container ls
CONTAINER ID  IMAGE  COMMAND                 CREATED         STATUS         PORTS   NAMES
9d695c1f5ef4  nginx  "nginx -g 'daemon of…"  36 seconds ago  Up 35 seconds  80/tcp  my_nginx

Los nombres significativos son útiles para hacer referencia al contenedor dentro de una red de Docker o cuando se ejecutan comandos de la CLI de Docker.

Publicación de puertos de contenedores

De forma predeterminada, si no se publican puertos, solo se puede acceder al proceso que se ejecuta en el contenedor desde el interior del contenedor.

Publicar puertos significa asignar puertos de contenedores a los puertos de la máquina host para que los puertos estén disponibles para los servicios fuera de Docker.

Para publicar un puerto, use las -popciones de la siguiente manera:

-p host_ip:host_port:container_port/protocol
  • Si no host_ipse especifica, el valor predeterminado es 0.0.0.0.
  • Si no protocolse especifica, el valor predeterminado es TCP.
  • Para publicar múltiples puertos, use múltiples -popciones.

Para asignar el puerto TCP 80 (nginx) en el contenedor al puerto 8080 en la interfaz host localhost, ejecutaría:

docker container run --name web_server -d -p 8080:80 nginx

Puede verificar que el puerto esté publicado abriendo http://localhost:8080en su navegador o ejecutando el siguiente curl comando en el host de Docker:

curl -I http://localhost:8080

La salida se verá algo como esto:

HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Tue, 26 Nov 2019 22:55:59 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT
Connection: keep-alive
ETag: "5dd3e500-264"
Accept-Ranges: bytes

Compartir datos (volúmenes de montaje)

Cuando se detiene un contenedor, se eliminan todos los datos generados por el contenedor. Los volúmenes de Docker son la forma preferida de hacer que los datos persistan y compartirlos en varios contenedores.

Para crear y administrar volúmenes, use las -popciones de la siguiente manera:

-v host_src:container_dest:options
  • Puede ser una ruta host_srcabsoluta a un archivo o directorio en el host o un volumen con nombre.
  • es una ruta container_destabsoluta a un archivo o directorio en el contenedor.
  • Las opciones pueden ser rw(lectura-escritura) y ro(solo lectura). Si no se especifica ninguna opción, el valor predeterminado es rw.

Para explicar cómo funciona esto, creemos un directorio en el host y coloquemos un index.htmlarchivo en él:

mkdir public_htmlecho "Testing Docker Volumes" > public_html/index.html

A continuación, monte el public_htmldirectorio /usr/share/nginx/htmlen el contenedor:

docker run --name web_server -d -p 8080:80 -v $(pwd)/public_html:/usr/share/nginx/html nginx

En lugar de especificar la ruta absoluta al public_htmldirectorio, usamos el $(pwd)comando, que imprime el directorio de trabajo actual .

Ahora, si escribe http://localhost:8080en su navegador, debería ver el contenido del index.htmlarchivo. También puedes usar curl:

curl http://localhost:8080
Testing Docker Volumes

Ejecute el contenedor de forma interactiva

Cuando se trate de procesos interactivos como bash, utilice las opciones -i-tpara iniciar el contenedor.

Las -itopciones le dicen a Docker que mantenga la entrada estándar adjunta al terminal y asigne un pseudo-tty:

docker container run -it nginx /bin/bash

El shell Bash del contenedor se adjuntará a la terminal y el símbolo del sistema cambiará:

root@1da70f1937f5:/#

Ahora, puede interactuar con el shell del contenedor y ejecutar cualquier comando dentro de él.

En este ejemplo, proporcionamos un comando ( /bin/bash) como argumento para el docker runcomando que se ejecutó en lugar del especificado en el Dockerfile.

Conclusión

Docker es el estándar para empaquetar e implementar aplicaciones y un componente esencial de CI/CD, automatización y DevOps.

El docker container runcomando se usa para crear y ejecutar contenedores Docker.

Si tiene alguna pregunta, por favor deje un comentario a continuación.