![Время запуска Docker](https://rvso.com/image/717777/%D0%92%D1%80%D0%B5%D0%BC%D1%8F%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%20Docker.png)
Как ускорить команды: 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 — это клиент-серверное приложение, и часть фактического времени может уходить на сокетное/сетевое взаимодействие между клиентом и сервером.