Оценив ответы и изучив тему, я хотел бы подвести итог.
Способ обновления контейнеров с помощью Docker выглядит следующим образом:
Контейнеры приложений не должны хранить данные приложений . Таким образом, вы можете в любое время заменить контейнер приложения новой версией, выполнив что-то вроде этого:
docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
-e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql
Вы можете хранить данные либо на хосте (в каталоге, смонтированном как том), либо в специальных контейнерах только для данных . Подробнее об этом
Обновление приложений (например, с помощью обновления yum / apt-get) в контейнерах считается антишаблоном . Прикладные контейнеры должны быть неизменными , что должно гарантировать воспроизводимое поведение. Некоторые официальные образы приложений (в частности, mysql: 5.6) даже не предназначены для самостоятельного обновления (apt-get upgrade не будет работать).
Я хотел бы поблагодарить всех, кто дал свои ответы, чтобы мы могли видеть все разные подходы.
Ярослав Ставничий
источник
docker rename my-mysql-container trash-container
того, чтобы создать новый?Мне не нравится монтировать тома как ссылку на каталог хоста, поэтому я придумал шаблон для обновления докерских контейнеров с полностью управляемыми докерами контейнерами. Создание нового док-контейнера с
--volumes-from <container>
предоставит новому контейнеру с обновленными изображениями общее владение управляемыми томами Docker.my_mysql_container
Еще не сразу удалив оригинал , у вас есть возможность вернуться обратно к известному рабочему контейнеру, если в обновленном контейнере нет нужных данных или он не прошел проверку работоспособности.На этом этапе я обычно запускаю любые скрипты резервного копирования, которые у меня есть, для контейнера, чтобы обеспечить себе сеть безопасности на случай, если что-то пойдет не так
Теперь у вас есть возможность убедиться, что данные, которые вы ожидаете в новом контейнере, есть, и выполнить проверку работоспособности.
Тома докеров будут храниться, пока их использует любой контейнер, поэтому вы можете безопасно удалить исходный контейнер. Как только оригинальный контейнер удален, новый контейнер может принять тезку оригинала, чтобы сделать все так же красиво, как и должно было начаться.
Есть два основных преимущества использования этого шаблона для обновления док-контейнеров. Во-первых, это устраняет необходимость монтировать тома в каталоги хостов, позволяя напрямую переносить тома в обновленные контейнеры. Во-вторых, вы никогда не окажетесь в положении, когда нет рабочего док-контейнера; поэтому, если обновление завершится неудачно, вы можете легко вернуться к тому, как оно работало раньше, снова раскрутив исходный док-контейнер.
источник
./postgres-data/:/var/lib/postgres/data
- т.е. смонтировал./postgres-data/
Просто для предоставления более общего (не специфичного для mysql) ответа ...
Синхронизировать с реестром образа сервиса ( https://docs.docker.com/compose/compose-file/#image ):
Создайте контейнер заново, если изменились файл или изображение docker-compose:
Управление изображениями контейнеров является одной из причин использования docker-compose (см. Https://docs.docker.com/compose/reference/up/ ).
Аспект управления данными также охватывается docker-compose через подключенные внешние «тома» (см. Https://docs.docker.com/compose/compose-file/#volumes ) или контейнер данных.
Это оставляет потенциальные проблемы обратной совместимости и миграции данных нетронутыми, но это «аппликативные» проблемы, а не специфичные для Docker, которые необходимо проверять на предмет замечаний к выпуску и тестов ...
источник
Я хотел бы добавить, что если вы хотите выполнить этот процесс автоматически (загрузить, остановить и перезапустить новый контейнер с такими же настройками, как описано @Yaroslav), вы можете использовать WatchTower. Программа, которая автоматически обновляет ваши контейнеры при их изменении https://github.com/v2tec/watchtower
источник
Рассмотрим для этого ответы:
app_schema
app_db
root123
Как обновить MySQL при хранении данных приложения внутри контейнера
Это считается плохой практикой , потому что если вы потеряете контейнер, вы потеряете данные. Хотя это плохая практика, вот возможный способ сделать это:
1) Сделайте дамп базы данных как SQL:
2) Обновите изображение:
3) Обновить контейнер:
4) Восстановите дамп базы данных:
Как обновить контейнер MySQL, используя внешний том
Использование внешнего тома - лучший способ управления данными и упрощение обновления MySQL. Потеря контейнера не приведет к потере данных. Ты можешь использовать docker-compose для облегчения управления многоконтейнерными Docker-приложениями на одном хосте:
1) Создайте
docker-compose.yml
файл для управления вашими приложениями:2) Обновить MySQL (из той же папки, что и
docker-compose.yml
файл):Примечание: последняя команда выше обновит образ MySQL, заново создаст и запустит контейнер с новым образом.
источник
docker-compose
, будет ли это работать? stackoverflow.com/a/31485685/65313volumes_from
ключ теперь устарел (даже удален в версии 3 составного файла) в пользу новогоvolumes
ключа.docker pull image_uri:tag && docker restart container_running_that_image
работал на меня. Нет необходимостиdocker-compose pull && docker-compose up -d
.Подобный ответ на выше
источник
Вот как это выглядит
docker-compose
при создании кастомаDockerfile
.docker build -t imagename:version .
это будет хранить вашу новую версию локально.docker-compose down
docker-compose.yml
файл, чтобы отразить новое имя изображения, которое вы установили на шаге 1.docker-compose up -d
. Он будет искать изображение локально и использовать ваш обновленный.-РЕДАКТИРОВАТЬ-
Мои шаги выше более многословны, чем они должны быть. Я оптимизировал рабочий процесс, включив этот
build: .
параметр в файл docker-compose. Пошаговые шаги выглядят так:docker-compose build
docker-compose up -d
В то время я не понимал, но docker-compose достаточно умен, чтобы просто обновить мой контейнер до нового образа с помощью одной команды, вместо того, чтобы сначала его выключать.
источник
docker-compose up -d
не останавливая все сначала.Если вы не хотите использовать Docker Compose, я могу порекомендовать portainer . Он имеет функцию воссоздания, которая позволяет вам воссоздавать контейнер при извлечении последнего изображения.
источник
Вам необходимо либо перестроить все образы и перезапустить все контейнеры, либо каким-либо образом обновить программное обеспечение и перезапустить базу данных. Там нет пути обновления, но вы сами разрабатываете.
источник
docker restart
команда, но я не уверен , что будет забрать изменения изображений. А что происходит с моими данными внутри контейнеров?Принимая от http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/
Вы можете обновить все существующие образы, используя следующий конвейер команд:
источник
Убедитесь, что вы используете тома для всех постоянных данных (конфигурации, журналов или данных приложения), которые вы храните в контейнерах, связанных с состоянием процессов внутри этого контейнера. Обновите ваш Dockerfile и перестройте образ с нужными вам изменениями, а затем перезапустите контейнеры с вашими томами, смонтированными в соответствующем месте.
источник
Это то, с чем я тоже боролся за свои собственные изображения. У меня есть серверная среда, из которой я создаю образ Docker. Когда я обновляю сервер, я бы хотел, чтобы все пользователи, использующие контейнеры на основе моего образа Docker, могли обновиться до последней версии сервера.
В идеале я предпочел бы сгенерировать новую версию образа Docker, и все контейнеры на основе предыдущей версии этого образа автоматически обновляются до нового образа «на месте». Но этот механизм, кажется, не существует.
Итак, следующий лучший дизайн, который я смог придумать, - это предоставить способ обновления самого контейнера - подобно тому, как настольное приложение проверяет наличие обновлений, а затем обновляет себя. В моем случае это, вероятно, будет означать создание сценария, включающего Git-трюки из известного тега.
Изображение / контейнер на самом деле не меняется, но меняются «внутренние» этого контейнера. Вы можете представить, что делаете то же самое с apt-get, yum или с тем, что подходит для вашей среды. Наряду с этим я обновил бы myserver: последнее изображение в реестре, чтобы любые новые контейнеры основывались на последнем образе.
Мне было бы интересно услышать, есть ли какой-либо уровень техники, который обращается к этому сценарию.
источник
Обновить
В основном это делается для того, чтобы запросить контейнер не обновлять, так как создание изображений - это способ сделать
У меня возникла та же проблема, поэтому я создал docker-run , очень простой инструмент командной строки, который запускается внутри docker-контейнера для обновления пакетов в других работающих контейнерах.
Он использует docker-py для связи с работающими контейнерами Docker и обновления пакетов или запуска любой произвольной команды
Примеры:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
по умолчанию
date
команда запускается во всех запущенных контейнерах и возвращает результаты, но вы можете выполнить любую команду, напримерdocker-run exec "uname -a"
Чтобы обновить пакеты (в настоящее время используется только apt-get):
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run update
Вы можете создать и псевдоним и использовать его как обычную командную строку, например
alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'
источник
apt update; apt upgrade
, изображение будет расти.)