Как сохранить все образы Docker и скопировать на другой компьютер
У меня есть список изображений, представленных ниже, в моей системе, и я хочу скопировать все эти изображения на удаленный компьютер.
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
u14_py269 latest 6a1ec0b508b3 4 days ago 885.9 MB
u12_py273 latest c2a804894851 4 days ago 686 MB
u12_core latest 0d61eba80df2 4 days ago 629.1 MB
c6_py266 latest cb1a94742d59 4 days ago 1.32 GB
c6_core latest 77c2ed19d87f 4 days ago 1.278 GB
c7_py275 latest bb1d3de68452 4 days ago 1.117 GB
c7_core latest ca14a76e9cca 4 days ago 1.081 GB
u14_py35 latest d110c7e4a1f5 5 days ago 914.5 MB
u14_py34 latest 085a37cb8614 5 days ago 830.7 MB
u14_py276 latest 8927c6167930 5 days ago 834.1 MB
u14_core latest 93ead5abc25b 5 days ago 776.9 MB
centos centos6 36877b5acebb 5 days ago 228.9 MB
ubuntu latest 36248ae4a9ac 5 days ago 188 MB
ubuntu 12.04 94a7cb19a65b 5 days ago 137.8 MB
edgester/gerrit latest ce4e3238052a 6 days ago 735.2 MB
u14_as374_py276 latest fa5fb7189d70 11 days ago 1.497 GB
c721_as373_py275 latest 03ccf6961d0c 11 days ago 844.3 MB
c721_as373_py35 latest b5fece3dd45b 11 days ago 1.127 GB
c171_con_core latest 8af0d24a38a0 2 weeks ago 377.2 MB
u14_as374_php55 latest 29df638e363a 3 weeks ago 1.073 GB
j_u14_as374_php55 latest 29df638e363a 3 weeks ago 1.073 GB
centos centos7 c8a648134623 8 weeks ago 196.6 MB
centos latest c8a648134623 8 weeks ago 196.6 MB
j_u14_as374_py276 latest 28f379d60882 10 weeks ago 871.5 MB
ubuntu 14.04 89d5d8e8bafb 10 weeks ago 187.9 MB
В настоящее время я использую метод, предложенный для сохранения и загрузки изображений Docker, но я считаю, что должен быть лучший способ справиться со всеми изображениями.
Ответы
Ответ 1
Если вы хотите экспортировать все изображения одновременно, создайте один большой tar файл:
docker save $(docker images -q) -o /path/to/save/mydockersimages.tar
Если вы хотите сохранить несколько изображений в одном файле .tar
:
IDS=$(docker images | awk '{if ($1 ~ /^(debian|centos)/) print $3}')
docker save $IDS -o /path/to/save/somedockersimages.tar
Наконец, если вы хотите экспортировать несколько изображений, по одному файлу .tar
на изображения (не эффективно на диске: общий слой сохраняется в каждом файле .tar
):
docker images | awk '{if ($1 ~ /^(openshift|centos)/) print $1 " " $2 " " $3 }' | tr -c "a-z A-Z0-9_.\n-" "%" | while read REPOSITORY TAG IMAGE_ID
do
echo "== Saving $REPOSITORY $TAG $IMAGE_ID =="
docker save -o /path/to/save/$REPOSITORY-$TAG-$IMAGE_ID.tar $IMAGE_ID
done
Вы также можете сохранить список изображений, чтобы можно было пометить восстановленные изображения:
docker images | sed '1d' | awk '{print $1 " " $2 " " $3}' > mydockersimages.list
На удаленной машине вы можете load
(импортировать) изображения:
docker load -i /path/to/save/mydockersimages.tar
и пометить импортированные изображения:
while read REPOSITORY TAG IMAGE_ID
do
echo "== Tagging $REPOSITORY $TAG $IMAGE_ID =="
docker tag "$IMAGE_ID" "$REPOSITORY:$TAG"
done < mydockersimages.list
Для получения дополнительной информации о сохранении/загрузке читайте: Как копировать образы Docker с одного хоста на другой без использования репозитория
Ответ 2
Сохраните все изображения с name:tag
в один файл tar
:
docker save $(docker images | sed '1d' | awk '{print $1 ":" $2 }') -o allinone.tar
Затем загрузите все изображения:
docker load -i allinone.tar
Ответ 3
С хостингом Windows Server команда немного отличается. Используя ответ #EthanSN, я обнаружил, что сработало следующее - используя форматирование go:
docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allinone.tar
И команда загрузки:
docker load -i allinone.tar
Работал отлично, без необходимости импортировать машину для загрузки любых изображений.
Ответ 4
Большое спасибо всем вашим awnsers, но я нашел простое и безопасное решение для экономии:
docker save -o ubuntu.tar myjenk:latest jenkins/jenkins:lts
REPOSITORY TAG
myjenk latest
jenkins/jenkins lts
после восстановления изображений:
docker load < ubuntu.tar
Ответ 5
Вы можете использовать Bash для итерации по ответу на docker images
docker save -o <save image to path> <image name>
на каждом изображении, а затем (при условии, что вы сохранили их все в одной папке) вы можете сжать его и scp это к удаленному хосту.
Ответ 6
Используя реестр, вы можете иметь рабочий процесс, похожий на Git. Измените локальный контейнер, скопируйте изменения в локальное изображение, а затем нажмите изображение в реестр. Затем вы можете вытащить изображение с удаленного компьютера.
Вы можете использовать общедоступный Docker Hub, или вы можете настроить свой собственный сервер реестра.
https://docs.docker.com/registry/
Ответ 7
Скрипт для выполнения функции сохранения и загрузки Docker (проверено и опробовано):
Докер Сохранить:
#!/bin/bash
#files will be saved in the dir 'Docker_images'
mkdir Docker_images
cd Docker_images
directory='pwd'
c=0
#save the image names in 'list.txt'
doc= docker images | awk '{print $1}' > list.txt
printf "START \n"
input="$directory/list.txt"
#Check and create the image tar for the docker images
while IFS= read -r line
do
one='echo $line | awk '{print $1}''
two='echo $line | awk '{print $1}' | cut -c 1-3'
if [ "$one" != "<none>" ]; then
c=$((c+1))
printf "\n $one \n $two \n"
docker save -o $two$c'.tar' $one
printf "Docker image number $c successfully converted: $two$c \n \n"
fi
done < "$input"
Загрузка докера:
#!/bin/bash
cd Docker_images/
directory='pwd'
ls | grep tar > files.txt
c=0
printf "START \n"
input="$directory/files.txt"
while IFS= read -r line
do
c=$((c+1))
printf "$c) $line \n"
docker load -i $line
printf "$c) Successfully created the Docker image $line \n \n"
done < "$input"