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

Время запуска 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_image
187d****5037
sudo 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 МБ не изменяет время выполнения вышеуказанной команды.

решение1

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

Во-первых, уберите команду 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 — это клиент-серверное приложение, и часть фактического времени может уходить на сокетное/сетевое взаимодействие между клиентом и сервером.

Связанный контент