Время запуска Docker

Как я могу ускорить: docker run и docker exec команды?

Выполнение команды занимает 0,02 секунды пользовательского времени, 0,02 секунды системного времени (в моем случае это было бы нормально), но около 0,5 секунды реального времени каждая (неприемлемо).

Например:

$ 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

Могу ли я как-то ускорить процесс запуска контейнера или, по крайней мере, понять, почему это время тратится впустую?

my_image создается из ubuntu а созданный образ занимает около 800 Мбайт. Но из того, что я проверил, это не имеет большого значения - уменьшение размера изображения до 200 МБ не изменяет время выполнения приведенной выше команды.

Накладное время, скорее всего, тратится на создание и удаление пространств имен. Чтобы определить, на что тратится время, вы можете запускать свой контейнер по-разному.

Во-первых, устраните команду sudo. Войдите в систему как root, sudo -s, и запускать команды оттуда.

Затем попробуйте разделить запуск на отдельные этапы создания и запуска. Это позволит вам узнать, потрачено ли время на создание контейнера или его запуск:

$ time docker create --cap-add SYS_ADMIN -itd \  --memory=100000k --memory-swap=100000k \  -w /tmp -v /home/asd:/tmp my_image$ time docker start -ai $(docker ps -ql)

Поскольку вы запускаете свой контейнер отдельно, подумайте, можете ли вы удалить выделение tty, и если вам нужно настроить stdin, удалив -it:

$ time sudo docker run --cap-add SYS_ADMIN -d \  --memory=100000k --memory-swap=100000k \  -w /tmp -v /home/asd:/tmp my_image

После этого вы можете начать смотреть, сколько времени добавляется для создания каждого из пространств имен для таких вещей, как сеть и pid, отключив их, установив их в существующее пространство имен хоста:

$ time sudo docker run --cap-add SYS_ADMIN -itd \  --net=host --pid=host --uts=host \  --memory=100000k --memory-swap=100000k \  -w /tmp -v /home/asd:/tmp my_image

Из docker вы можете просмотреть действия, выполняемые с помощью docker events и проверка временной метки для каждого из действий.

Наконец, имейте в виду, что docker - это клиент-серверное приложение, и часть фактического времени может быть соединением сокета / сети между клиентом и сервером.

Следуя ответу @ BMitch, я бы сказал, что "docker exec` совсем не медленный. В основном это настройка и очистка контейнера.