La docker run
El comando es uno de los primeros comandos que debe aprender después de instalar Docker. Pero, ¿te has preguntado de qué otra forma puedes usar docker run
? comandos para implementar y administrar sus aplicaciones de manera efectiva? Pasando por un ejemplo de ejecución de Docker (docker run)
sería genial. Pero adivina qué, ¡obtendrás más en este tutorial!
En este artículo, aprenderá cómo mejorar su juego DevOps con algunos ejemplos de ejecución de Docker que puede usar para mejorar su flujo de trabajo.
¡Siga leyendo y nunca se pierda cuando vuelva a ejecutar los comandos de Docker!
Requisitos previos
Este tutorial será una demostración práctica. Si desea seguirnos, asegúrese de tener lo siguiente.
- Una máquina con Linux:esta demostración usa Ubuntu 20.04, pero cualquier distribución de Linux funcionará. Aquí se explica cómo instalar Ubuntu.
- Docker instalado en la máquina.
- Una cuenta de usuario con privilegios de root/sudo.
Ejemplo n.º 1 de ejecución de Docker:ejecución de un contenedor de forma interactiva
Es posible que haya estado ejecutando contenedores durante algún tiempo, pero ¿sabía que hay algunas situaciones preferibles para ejecutar un contenedor Docker en modo interactivo?
Docker le permite ejecutar contenedores en modo interactivo cuando:
- Está solucionando un problema y necesita ver el resultado de los comandos ejecutados dentro del contenedor.
- Está experimentando con un nuevo comando de Docker y desea ver los resultados del comando en tiempo real.
- Está ejecutando un proceso en el contenedor que requiere una entrada manual por su parte.
Al ejecutar un ejemplo de ejecución de Docker ( docker run
) sin opciones, el comportamiento predeterminado es ejecutar el contenedor en modo interactivo. Cuando ejecuta un contenedor en modo interactivo, puede ver el resultado de los comandos que ejecuta en el contenedor en su terminal a medida que se ejecutan.
1. Ejecute el siguiente comando para ejecutar un contenedor (my_nginx
) en modo interactivo y publicar (-p
) puerto 80
del contenedor al puerto 8080
de su máquina host. Puedes cambiar el nombre del contenedor como prefieras.
El comando usa el nginx
imagen del centro de Docker para crear el contenedor y elimina automáticamente (--rm
) el contenedor cuando el contenedor está detenido.
docker container run --rm --name my_nginx -p 8080:80 nginx
Dado que está usando un usuario no root con privilegios sudo , no es necesario anteponer sudo al ejecutar los comandos de Docker
Verá la salida de registro del servidor web nginx directamente en su terminal, como se muestra a continuación.
La ejecución de un contenedor interactivo proporciona mucha información, pero quizás prefiera filtrar la información que solo necesita. Si es así, agregue el indicador -a y especifique un flujo estándar (-a) para el contenedor, como se muestra a continuación.
Especificar un flujo estándar le dice a Docker que muestre solo la salida estándar del contenedor my_nginx.
docker container run -a stdout --rm --name my_nginx -p 8080:80 nginx
De forma predeterminada, si no proporciona el indicador -a, stdin, stdout y stderr se adjuntan al terminal. El indicador -a toma los siguientes argumentos y ayuda a ordenar su salida para ver solo la información relevante:
-a stdin
– adjuntastdin
al contenedor, enviando todas las entradas en su terminal al contenedor.
-a stdout
– adjuntastdout
al contenedor, mostrando toda la salida generada por el contenedor a su terminal.
-a stderr
– adjuntastderr
al contenedor, mostrando todos los mensajes de error generados por el contenedor a su terminal.
Puede ver a continuación que la salida está menos desordenada ahora.
2. A continuación, abra otra terminal y ejecute docker ps
Comando para ver la lista de contenedores que se ejecutan en su máquina host.
docker ps
A continuación, puede ver su contenedor my_nginx en la lista de resultados.
3. Finalmente, ejecute curl
Comando a continuación para probar el servidor web nginx.
curl http://localhost:8080
Puede ver a continuación que la salida del registro del servidor web nginx se muestra en su terminal (lado izquierdo) tan pronto como se genera la salida.
Ejemplo de ejecución de Docker n.° 2:Ejecución del contenedor en modo separado
Acaba de aprender a ejecutar sus contenedores en modo interactivo y ver el resultado en su terminal a medida que se ejecutan. Pero si no está buscando salidas del contenedor en su terminal, puede ejecutar el contenedor en modo separado.
En el modo separado, el contenedor se ejecuta en segundo plano y no ve el resultado de los comandos que ejecuta en el contenedor en su terminal.
Ejecute el siguiente comando para ejecutar un contenedor (my_nginx
) en modo separado (-d
).
docker container run --rm --name my_nginx -d -p 8080:80 nginx
Una vez que el contenedor se ejecuta en modo separado, Docker redirige la salida a los registros del contenedor. En este punto, el contenedor my_nginx se está ejecutando en las salidas de comandos en segundo plano, como se muestra a continuación.
También puede ver el ID de contenedor único en la salida. Puede utilizar este ID para adjuntar el contenedor o iniciar/detener/eliminar el contenedor.
Ahora, ejecuta docker ps
Comando para ver la lista de contenedores que se ejecutan en su máquina host.
Dado que el contenedor (my_nginx) se ejecuta en segundo plano, puede ejecutar cualquier comando sin abrir una nueva terminal.
docker ps
Verá el siguiente resultado, que muestra que my_nginx el contenedor ahora se ejecuta en modo separado.
Si por alguna razón, sus servidores web NGINX no funcionan correctamente mientras su contenedor se ejecuta en modo separado, deberá conectar su terminal al contenedor en ejecución. Puede adjuntar a un contenedor en ejecución ejecutando docker attach
comando seguido del ID o nombre del contenedor (my_nginx
), como se muestra a continuación.
docker container attach my_nginx
Como puede ver a continuación, se ha conectado con éxito a my_nginx envase. Ahora, puede averiguar la causa raíz del problema y solucionarlo.
Creación de una red puente
Una de las ventajas de usar Docker es que administra la red de contenedores por usted. Con Docker, no tiene que preocuparse por configurar su red. Docker configura la red automáticamente. Incluyendo la creación de redes, la conexión de contenedores a redes y la gestión de direcciones IP.
Vea cómo Docker configura la red para sus contenedores y crea una red puente.
1. Ejecute el docker run
comando a continuación para ejecutar un contenedor de Ubuntu con acceso completo a los recursos de red en la máquina host (--net=host
), que es útil para la depuración.
Las opciones -ti le indican a Docker que mantenga el contenedor en modo interactivo. Debe especificar esta opción cuando trabaje con el shell Bash. Ejecutar este comando como en la sección "Ejecutar un contenedor de forma interactiva" no funciona.
docker run -ti --rm --net=host ubuntu bash
2. A continuación, ejecute la apt update
comando en el contenedor para actualizar la lista de paquetes.
apt update -y
3. Ejecute el siguiente comando para install
las bridge-utils
paquete. Este paquete es necesario para crear y administrar dispositivos puente.
apt install bridge-utils
4. Ahora, ejecute el siguiente brctl show
Comando para enumerar las redes puente en su sistema.
brctl show
Verá una lista de redes puente similar a la siguiente salida. Observe que hay un dispositivo puente llamado docker0. Esta red es la red virtual que utiliza Docker para crear redes virtuales para sus contenedores si no especifica una red virtual puente personalizada.
5. Abra otra terminal y ejecute docker network
Comando a continuación para crear una nueva red. Puede nombrar la red de manera diferente, pero en este tutorial, la red se llama my-ata-network
.
docker network create my-ata-network
Verá que se devuelve una ID de red única, como se muestra a continuación. Anote la identificación de la red, ya que la comparará con la nueva identificación de la red del puente más adelante (paso seis).
6. Regrese a su terminal de contenedor de Ubuntu y ejecute el siguiente comando para enumerar la red puente (show
) en su sistema nuevamente.
brctl show
Como se muestra a continuación, verá una nueva red puente en la salida denominada br-d9ba7f94ac73. Puede ver que la parte d9ba7f94ac73 coincide con el ID de red devuelto en el paso cinco.
Este resultado confirma que Docker creó una nueva red de puente llamada my-ata-network y agregó el contenedor de Ubuntu a esa red de puente.
Ejemplo de ejecución de Docker n.° 3:ejecución de un contenedor con reenvío de puertos
Docker utiliza las funciones de firewall integradas del kernel de Linux, a saber, iptables
comando, para crear reglas de firewall. Estas reglas de firewall controlan cuándo se envían los paquetes entre los puentes y, por lo tanto, están disponibles para los contenedores conectados a esos puentes.
Eche un vistazo a cómo Docker logra el reenvío de puertos bajo el capó con iptables
.
1. Ejecute el siguiente comando para iniciar un contenedor de Ubuntu privilegiado (--privileged=true
) con acceso completo a todos los recursos de red en el host, incluido el reenvío de puertos.
docker run -ti --rm --net=host --privileged=true ubuntu bash
2. A continuación, ejecute el siguiente comando para update
la lista de paquetes e install
iptables
.
apt update && apt install iptables
3. Ejecute iptables
comando a continuación en el contenedor privilegiado de Ubuntu para listar (-L
) el nat
regla de mesa
iptables -n -L -t nat
Lo que puede ver a continuación son solo las reglas predeterminadas enviadas con Ubuntu.
4. Ahora, ejecute el siguiente comando ejecute un Ubuntu
contenedor con reenvío de puertos a su host en el puerto 8080
.
docker run -ti --rm -p 8080:8080 ubuntu bash
5. Finalmente, vuelva a ejecutar iptables
Comando a continuación para enumerar el nat
regla de mesa
iptables -n -L -t nat
Observe a continuación que se agregó una nueva regla, reenviando todos los paquetes desde el puerto del host (8080) al puerto del contenedor (8080). Puede ver que exponer puertos en Docker es simplemente un reenvío de puertos en la capa de red.
Creación de una red definida por el usuario
Su examen Docker DCA puede pedirle que cree redes puente para desarrolladores. ¿Cómo? Usando la docker network
comando, puede crear una red puente (una red virtual definida por el usuario). La docker network
proporciona una forma para que los contenedores en diferentes redes se comuniquen.
1. Ejecute la docker network
Comando a continuación para crear una nueva red puente llamada ata-app-net
usando el bridge
conductor.
docker network create --driver bridge ata-app-net
2. A continuación, ejecute el siguiente comando para listar (ls
) las redes puente en su host.
docker network ls
Observe a continuación que se ha creado una nueva red puente definida por el usuario llamada ata-app-net.
3. Ejecute el siguiente comando para ver (inspect
) los detalles de la ata-app-net
red de puentes
docker network inspect ata-app-net
A continuación, observe que la red puente ata-app-net tiene una única subred (172.21.0.0/16). Esta subred se asigna automáticamente cuando crea una red puente. También puede ver el controlador (puente) asociado con la red del puente.
4. Ahora, ejecute este ejemplo de ejecución de Docker ( docker run
) a continuación para ejecutar un par de contenedores alpinos en sus redes puente definidas por el usuario para intentar hacer ping entre sí.
docker run -dit --name ata-app1 --network ata-app-net alpine ash
5. Ejecute docker ps
Comando para enumerar los contenedores en ejecución.
docker ps
Como puede ver a continuación, ambos contenedores ahora se están ejecutando.
6. Vuelva a ejecutar el siguiente comando de red docker para inspect
tu ata-app-net
red puente.
docker network inspect ata-app-net
Puede ver a continuación que sus dos contenedores ahora están conectados a la red puente ata-app-net junto con sus direcciones IP y nombres.
7. Ahora, ejecute docker container attach
a continuación para conectarse a su ata-app1
envase.
docker container attach ata-app1
8. Haga ping a ata-app2
para verificar que los contenedores pueden comunicarse entre sí.
ping ata-app2
9. A continuación, haga ping a google.com
para verificar que ata-app1 puede comunicarse con internet.
ping google.com
10. Finalmente, repita los pasos siete a nueve para conectarse a ata-app2
y haga ping a ata-app1
.
Asegúrese de presionar CTRL + PQ para desconectarse del contenedor ata-app1 y mantenerlo en funcionamiento. De lo contrario, el contenedor se detendrá y cuando haga ping ata-app1 desde ata-app2, el comando ping fallará.
docker container attach ata-app2
ping ata-app1
ping google.com
A continuación, puede ver que todos los paquetes se transmiten y reciben, lo que confirma que ambos contenedores pueden comunicarse entre sí y con Internet.
Conclusión
En este tutorial, ha aprendido muchos ejemplos de ejecución de Docker ( docker run
) que puede usar para facilitar la implementación y administración de sus aplicaciones. Ahora puede usar Docker de manera más efectiva al comprender cómo se ejecuta docker run
y cómo Docker configura la red para sus contenedores.
En este punto, ya sabe cómo aprovechar el ejemplo de ejecución de Docker ( docker run
) para mejorar su juego de DevOps.
Con este conocimiento, ¿por qué no implementar sus aplicaciones de manera más eficiente y escalable?