Как остановить / перезапустить докер-контейнер без потери изменений?

Я сделал следующее и потерял все измененные данные в моем контейнере Docker.

  1. docker build -t <name:tag> .
  2. docker run *-p 8080:80* --name <container_name> <name:tag>
  3. docker exec (импортировать и обрабатывать некоторые файлы, запустить сервер для их размещения)

Затем я хотел запустить его на другом порту. docker stop & docker run не работает. Вместо этого я сделал

  1. docker stop
  2. docker rm <container_name>
  3. docker run (те же параметры, что и раньше)

После перезапуска я увидел, что изменения, произошедшие в контейнере на 1-3, исчезли, и пришлось повторить импорт.

Как мне сделать это правильно в следующий раз?

2 ответа

Решение

Вам нужно создать образ из контейнера, который вы остановили после внесения изменений. Потому что ваша старая команда все еще использует старое изображение, которое не имеет новых изменений (вы внесли изменения в контейнер, который вы просто остановили, а не в изображении)

docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

docker commit -a me new_nginx myrepo/nginx:latestтогда вы можете начать контейнер с новым изображением, которое вы только что создали

но если вы не хотите создавать образ с изменениями, которые вы внесли (например, вы не хотите помещать в образе конфигурацию, содержащую пароль), вы можете использовать громкость монтирования

docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py

Эта команда монтирует каталог хоста / src / webapp в контейнер в / webapp. Если путь / webapp уже существует внутри образа контейнера, монтирование / src / webapp накладывается, но не удаляет ранее существовавший контент. Как только монтирование удалено, контент снова становится доступным. Это согласуется с ожидаемым поведением команды mount.

Управление данными в контейнерах

Каждый раз, когда вы делаете docker run это будет раскручивать свежий контейнер на основе вашего изображения. И после запуска контейнера существует очень мало вещей, которые докер позволяет вам изменить с помощью docker update, Поэтому вместо этого вы должны сохранить свои данные во внешнем томе, который должен сохраняться между экземплярами контейнера. Например

docker run -p 8080:80 -v app-data:/data --name <container_name> <name:tag>

Имя тома (app-data) и точку монтирования в контейнере (/data) можно изменить в соответствии с вашими требованиями. Затем, когда вы уничтожите и перезапустите новый контейнер, вы можете смонтировать тот же том в новом контейнере.

Другие вопросы по тегам