Как сохранить все образы 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

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

Ответ 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"