Cómo puedo acelerar: docker run y docker exec los comandos?
Ejecutar el comando toma 0.02 s de tiempo de usuario, 0.02 s de tiempo de sistema (eso estaría bien en mi caso), pero alrededor de 0.5 s de tiempo real cada uno (no aceptable).
Por ejemplo:
$ time sudo docker run --cap-add SYS_ADMIN -i -t --memory=100000k --memory-swap=100000k -d -w /tmp -v /home/asd:/tmp my_image187d****5037sudo docker run --cap-add SYS_ADMIN -i -t --memory=100000k -d -w /tmp -v 0,02s user 0,02s system 6% cpu 0,496 total
¿Puedo acelerar de alguna manera el proceso de ejecución del contenedor o al menos entender por qué se desperdicia este tiempo?
my_image se crea a partir de ubuntu y la imagen construida ocupa alrededor de 800 MB. Pero por lo que verifiqué, no importa demasiado: reducir el tamaño de la imagen a 200 MB no cambia el tiempo de ejecución del comando anterior.
Lo más probable es que el tiempo de sobrecarga se dedique a crear y eliminar espacios de nombres. Para averiguar dónde se gasta el tiempo, puede ejecutar su contenedor de diferentes maneras.
Primero, elimine el comando sudo. Iniciar sesión como root, sudo -s, y ejecute comandos desde allí.
A continuación, intente dividir la ejecución en pasos separados de creación e inicio. Esto le permitirá saber si el tiempo se dedica a crear el contenedor o a ejecutarlo:
Dado que ejecuta el contenedor de forma independiente, considere si puede eliminar la asignación de tty y, si necesita configurar la entrada estándar, elimine la -it:
$ time sudo docker run --cap-add SYS_ADMIN -d \ --memory=100000k --memory-swap=100000k \ -w /tmp -v /home/asd:/tmp my_image
Después de eso, puede comenzar a ver cuánto tiempo se agrega para crear cada uno de los espacios de nombres para cosas como la red y el pid deshabilitándolos configurándolos en el espacio de nombres de host existente:
Desde Docker, puede ver las acciones que se realizan con docker events y comprobando la marca de tiempo en cada una de las acciones.
Por último, tenga en cuenta que docker es una aplicación cliente / servidor, y parte del tiempo real puede ser la comunicación de socket/red entre el cliente y el servidor.
Siguiendo la respuesta de @BMitch, diría que ‘docker exec’ no es lento en absoluto. Se trata principalmente de la configuración y limpieza de un contenedor.