Подтвердить что ты не робот

Дублирование контейнера докеров для отладки

У меня есть контейнер для докеров. Я сделал несколько полезных работ в контейнере докеров. Я сделал эти работы, а не часть файла docker, я сделал это внутри контейнера. [Например: я установил ping внутри контейнера, а не из файла докеров)

Теперь я застрял в месте. Я не уверен, что если я отлаживаюсь в одном контейнере, я могу потерять то, что я сделал до сих пор внутри этого контейнера.

Итак, я хотел бы создать дубликат его со всеми вещами, доступными в этом запущенном контейнере [например, я не хочу создавать контейнер из изображения и повторять все удачные шаги, достигнутые в запущенном контейнере, а затем запускать моя отладка. Я не хочу переустанавливать ping в моем втором контейнере].

В целом, как я могу дублировать контейнер? Если не все возможности?

4b9b3361

Ответ 1

  • Создайте базовое изображение и запустите его

    docker run -it <base_image> /bin/bash
    
  • Внесите необходимые изменения

    yum install ping
    
  • Запишите его с новым именем

    docker commit <hash tag of running container> new_image
    

Теперь, если вы откроете new_image, запустив

docker run -it new_image /bin/bash

Вы можете видеть, что в нем установлен ping.

Откройте base_image и в нем нет ping.

Надеюсь, он ответил на ваш вопрос.

Ответ 3

В случае реализации докеры 1.0.1 (API-интерфейс сервера/клиента 1.12) существует только поддержка операций паузы/возобновления.

Но что касается моментальных снимков процессов (в commits + push), они не работают (не поддерживается, хотя я не проверял документацию)

В заключение, 1) Сохранение состояния запущенных процессов невозможно! 2) Все изменения, внесенные в файловую систему (постоянное хранилище), могут быть сохранены (и могут быть зафиксированы + помещены в репозиторий).

Ответ 4

docker commit отлично подходит для сохранения изменений файла в новом изображении, но он не сохранит изменений в памяти, открытых процессов и т.д. Вопреки распространенному мнению, последнее возможно с помощью docker checkpoint. Документация и пример.

Примечание: прямо сейчас отключена опция --checkpoint-dir: issue, pull. Поэтому здесь необходим обходной путь, например checkpoint_dir (см. Код). Этот ответ, вероятно, должен быть обновлен через несколько недель.

невозможно на контрольную точку TTY. Этот может скоро измениться. Тем не менее, вы можете прикрепить новый TTY после процесса восстановления, используя exec.

Вам необходимо установить criu. После, во-первых,

echo "{\"experimental\": true}" >> /etc/docker/daemon.json
systemctl restart docker

то

#!/bin/bash

# tty (-t) not supported
docker run -i -d --name sleeper\
     busybox sh -c 'sleep 10000'

# Makes a snapshot and stops the container (except if --leave-running is active). --checkpoint-dir is broken.
docker checkpoint create sleeper cp
# sleeper container exited

# Create the clone
docker create -i --rm --name clone\
    busybox

# Start the clone
checkpoint_dir="/var/lib/docker/containers/$(docker ps -aq --no-trunc -f name=sleeper)/checkpoints"
docker start --checkpoint-dir=$checkpoint_dir --checkpoint=cp clone

# Attach new TTY
docker exec -it clone sh

Теперь в tty введите ps -e, и вы увидите процесс, который начался в контейнере sleeper и теперь продолжается в clone.

checkpoint делает полный чертеж контейнера на жесткий диск, который можно обменять между машинами. Эта функция использует criu и является экспериментальной. Criu не может создать схему приложений X11 изначально.

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