Introducción
Docker es una plataforma que le permite desarrollar, probar e implementar aplicaciones como contenedores portátiles e independientes que funcionan prácticamente en cualquier lugar.
El docker run
crea un contenedor a partir de una imagen determinada e inicia el contenedor con un comando determinado. Es uno de los primeros comandos con los que debe familiarizarse cuando comience a trabajar con Docker.
En este artículo, usaremos la imagen oficial de Nginx para mostrar varias formas de ejecutar un contenedor Docker.
Comando Docker Run
El docker run
tiene la siguiente sintaxis:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
El nombre de la imagen a partir de la cual se creará el contenedor es el único argumento requerido para el comando docker run
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 CMD
Dockerfiles o ENTRYPOINT
se ejecuta mientras se ejecuta el contenedor.
A partir de la versión 1.13, la interfaz de línea de comandos de Docker se ha reestructurado y todos los comandos se han agrupado bajo el objeto con el que interactúan.
Dado que el run
interactúa con los contenedores, ahora es un subcomando del docker container
. La sintaxis del nuevo comando es la siguiente:
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
Aún se admite la sintaxis anterior a 1.13. El docker run
es un alias de docker container run
. Se anima a los usuarios a utilizar la nueva sintaxis de comandos.
Una lista de todas las docker container run
Docker está disponible en la página de documentación de Docker.
Ejecute el contenedor en primer plano
De forma predeterminada, cuando no se da ninguna opción al docker run
, 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 están vinculados a la sesión del terminal.
docker container run nginx
La salida del proceso nginx se mostrará en su terminal. Dado que no hay conexión con el servidor web, el terminal está vacío.
Para detener el contenedor, finalice el proceso de Nginx en ejecución presionando CTRL+C
Ejecute el contenedor en modo independiente
Para mantener el contenedor en ejecución cuando salga de la sesión de terminal, inícielo en modo separado. Esto es similar a ejecutar un proceso de Linux en segundo plano.
Utilice la -d
para iniciar un contenedor eliminado:
docker container run -d nginx
El mensaje de salida debería verse así:
121f93h9139d4b091nds4908nd47190284n71093d7n419dn7903124n7d19023a
El contenedor desconectado se cerrará una vez que se complete el proceso raíz.
Puede enumerar los contenedores en ejecución mediante el comando docker container ls
Para adjuntar la terminal al proceso principal del contenedor separado, use el comando docker container attach
Retire el contenedor After Exit
De forma predeterminada, cuando el contenedor está cerrado, su sistema de archivos persiste en el sistema host.
Las --rm
dicen al docker run
que elimine el contenedor cuando sale automáticamente:
docker container run --rm nginx
Es posible que la imagen de Nginx no sea el mejor ejemplo para limpiar el sistema de archivos del contenedor después de salir del contenedor. Esta opción se usa generalmente en contenedores en primer plano que realizan tareas a corto plazo, como pruebas de bases de datos o copias de seguridad.
Establecer el nombre del contenedor
En Docker, cada contenedor se identifica por su UUID
y su nombre. De forma predeterminada, si no se establece explícitamente, el daemon de Docker genera automáticamente el nombre del contenedor.
Utilice la --name
para asignar un nombre personalizado al contenedor:
docker container run -d --name my_nginx nginx
El nombre del contenedor debe ser exclusivo. Si intenta iniciar otro contenedor con el mismo nombre, se mostrará un error similar al siguiente:
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 -a
para enumerar todos los contenedores y ver sus nombres:
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
546d4fe312fe nginx "nginx -g 'daemon of…" 23 seconds ago Up 23 seconds 80/tcp my_nginx
Los nombres significativos son útiles para hacer referencia al contenedor dentro de una red Docker o cuando se ejecutan comandos de la CLI de Docker.
Publicar las puertas del contenedor
De forma predeterminada, si no se publican puertos, solo se puede acceder al proceso que se ejecuta en el contenedor desde dentro del contenedor.
Publicar puertos significa vincular puertos de contenedor a puertos de computadora host para que los puertos estén disponibles para servicios fuera de Docker.
Para publicar un puerto, use la -p
siguiente manera:
-p host_ip:host_port:container_port/protocol
- Si
host_ip
, el valor predeterminado es0.0.0.0
. - Si
protocol
, el valor predeterminado es TCP. - Para publicar varios puertos, use varias opciones
-p
Para asignar el puerto TCP 80 (nginx) en el contenedor al puerto 8080 en la interfaz de host local del host, ejecute:
docker container run --name web_server -d -p 8080:80 nginx
Puede verificar que el puerto está publicado abriendo http://localhost:8080
en el navegador o ejecutando el curl
en el host de Docker:
curl -I http://localhost:8080
La salida se verá así:
HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Tue, 23 Nov 2019 20:13:11 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 11 Nov 2019 11:56:01 GMT
Connection: keep-alive
ETag: "4dd1r677-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 conservar los datos y compartirlos en varios contenedores.
Para crear y administrar volúmenes, use la -p
siguiente manera:
-v host_src:container_dest:options
- El
host_src
puede ser una ruta absoluta a un archivo o directorio en el host o un volumen con nombre. - El
container_dest
es una ruta absoluta a un archivo o directorio en el contenedor. - Las opciones pueden ser
rw
(lectura-escritura) yro
(solo lectura). Si no se especifica ninguna opción, el valor predeterminado esrw
.
Para explicar cómo funciona esto, creemos un directorio en el host e insertemos un index.html
en él:
mkdir public_html
echo "Testing Docker Volumes" > public_html/index.html
Luego, monte el public_html
en el contenedor /usr/share/nginx/html
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_html
, usamos el $(pwd)
, que imprime el directorio de trabajo actual.
Ahora, si escribe http://localhost:8080
en su navegador, debería ver el contenido del archivo index.html
También puedes usar curl
:
curl http://localhost:8080
Testing Docker Volumes
Ejecute el contenedor de forma interactiva
Cuando trabaje con procesos interactivos como bash
, use las -i
y -t
para iniciar el contenedor.
Las -it
dicen a Docker que mantenga la entrada estándar conectada al terminal y asigne un pseudo-tty:
docker container run -it nginx /bin/bash
El shell Bash del contenedor se conectará a la terminal y el símbolo del sistema cambiará:
root@1d192392e:/#
Ahora puede interactuar con el shell del contenedor y ejecutar cualquier comando dentro de él.
En este ejemplo, usamos /bin/bash
como argumento para el docker run
que se ejecutó en lugar del especificado en Dockerfile.
Conclusión
Docker es el estándar para el empaquetado e implementación de aplicaciones y un componente esencial de CI /CD, automatización y DevOps.
El docker container run
se usa para crear y ejecutar contenedores Docker.