Сохранить текущее состояние образа докера и экспортировать на другой сервер - PullRequest
0 голосов
/ 13 ноября 2018

Я новичок в докере и контейнерах.Я выполнил следующие шаги, чтобы перенести мою базу данных postgres, работающую в контейнере Docker:

docker save -o <path for generated tar file> <image name>
scp root@192.10.1.5:/images/gpdb.tar root@192.10.2.5:/images

На конечном сервере (192.10.2.5):

docker load -i /images/gpdb.tar

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

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Попытка переместить контейнер, как это, не лучшая практика. Однако может потребоваться некоторая настройка, чтобы привести ваш контейнер в правильное состояние.

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

docker run -v /data/mysql:/var/lib/mysql/data ... mysql

Теперь вы можете делать все, что захотите, с контейнером , даже с docker rm, но при условии, что /data/mysql на вашем хосте не поврежден, ваши данные в порядке. Это также означает, что вы можете использовать обычный scp для копирования данных на другой хост и docker run в том же контейнере, что является более типичным путем миграции.

Если вы создаете и запускаете пользовательские образы, необходимо проверить пару вещей:

  • Вы действительно должны использовать какой-то реестр Docker, будь то Docker Hub, что-то, что предлагает ваш облачный провайдер, что-то стороннее или что-то самостоятельно. docker save перемещение изображений - последнее средство, которое редко требуется.

  • Сами изображения должны быть построены из Dockerfiles и, как и все остальное в вашем приложении, должны быть проверены в системе контроля версий. В идеале у вас есть автоматизированная система сборки (непрерывная интеграция), работающая docker build && docker push для вас. Никогда не используйте docker commit или docker export: они являются рецептом для получения разных версий программного обеспечения на разных системах и не помнят, как вы туда попали.

  • Ваше приложение должно минимизировать объем данных, которые оно хранит локально. Лучший вариант - хранить все во внешней базе данных, а затем вы можете просто указать на базу данных; если локальное файловое хранилище действительно неизбежно, попробуйте поместить все это в один каталог, который не находится в дереве исходного кода вашего приложения.

  • Локально вы должны свободно иметь возможность docker stop; docker rm; docker run того же контейнера и не потерять данные. Проверьте это, прежде чем выполнять миграцию между хостами.

Если вы можете структурировать свое приложение так, чтобы все его данные находились во внешней базе данных, рассмотрите возможность запуска базы данных на выделенном хосте с очень хорошими процедурами резервного копирования. Если вы сделали все до этого момента, вы можете получить серьезный скоординированный сбой жесткого диска и потерять все ваши хосты Docker, а на самом деле ничего не потерять (потому что вы можете docker build изображения из источника снова и docker run контейнеры и данные вне хоста).

0 голосов
/ 13 ноября 2018

фиксирует текущее состояние изображения

docker commit currentcontainer newimage

сохранить изображение в виде файла tar

docker save newimage > /tmp/newimage.tar

загрузить контейнер из изображения

docker load < /tmp/newimage.tar
0 голосов
/ 13 ноября 2018

Нет базы данных, потому что команды docker save и docker commit не сохраняют тома контейнера ...

Вот скрипт для этого:

https://github.com/ricardobranco777/docker-volumes.sh

# Stop the container 
docker stop $CONTAINER
# Create a new image
docker commit $CONTAINER $CONTAINER
# Save and load image to another host
docker save $CONTAINER | ssh $USER@$HOST docker load 

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

### On the other host:

# Create container with the same options used by the previous container
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER
0 голосов
/ 13 ноября 2018

Ваш контейнер был основан на изображении при запуске, но после запуска все изменения не повлияют на изображение.

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

Примерно так: см. здесь

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

Затем сохраните новое изображение в tar и сделайте то, что вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...