Docker를 사용하지 않고 Docker Hub에서 Docker 이미지 다운로드


32

Docker Hub 에서 Docker 이미지를 수동으로 다운로드하고 싶습니다 . 보다 구체적으로, Docker 클라이언트 소프트웨어가 설치되어 있지 않은 제한된 환경의 시스템에있는 Docker Hub에서 Docker 이미지를 다운로드하려고합니다. 공식 API를 사용하면 이것이 가능할 것이라고 생각 했지만, 그렇지 않은 것 같습니다. 다음 토론을 참조하십시오.

API가 이미지 다운로드를 지원하지 않는 경우가 실제로 있습니까? 이 문제를 해결하는 방법이 있습니까?


업데이트 1 :

다음 ServerFault 게시물을 보았습니다.

허용 솔루션은 용도 docker save내 상황에 도움이되지 않는 명령을. 그러나 거기에 게시 된 다른 솔루션은 다음 StackOverflow 게시물을 인용합니다.

해결책 중 하나 는 이미지 다운로드를위한 명령을 생성 할 수있는 docker-registry-debug 라는 명령 줄 도구를 나타냅니다 curl. 내가 가진 것은 다음과 같습니다.

user@host:~$ docker-registry-debug curlme docker ubuntu

# Reading user/passwd from env var "USER_CREDS"
# No password provided, disabling auth
# Getting token from https://index.docker.io
# Got registry endpoint from the server: https://registry-1.docker.io
# Got token: signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read
curl -i --location-trusted -I -X GET -H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read" https://registry-1.docker.io/v1/images/ubuntu/layer

user@host:~$ curl \
-i --location-trusted -I -X GET \
-H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read" 

https://registry-1.docker.io/v1/images/ubuntu/layer
HTTP/1.1 404 NOT FOUND
Server: gunicorn/18.0
Date: Wed, 29 Nov 2017 01:00:00 GMT
Expires: -1
Content-Type: application/json
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 29
X-Docker-Registry-Version: 0.8.15
X-Docker-Registry-Config: common
Strict-Transport-Security: max-age=31536000

불행히도 curl생성 된 명령이 작동하지 않는 것처럼 보입니다 .


업데이트 2 :

Docker Hub에서 레이어 블롭을 다운로드 할 수있는 것 같습니다. 다음은 현재 진행중인 방법입니다.

인증 토큰을 받으십시오.

user@host:~$ export TOKEN=\
"$(curl \
--silent \
--header 'GET' \
"https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull" \
| jq -r '.token' \
)"

이미지 매니페스트를 가져옵니다.

user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'

이미지 매니페스트를 가져와 BLOB 합계를 추출하십시오.

user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum'

sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
sha256:be588e74bd348ce48bb7161350f4b9d783c331f37a853a80b0b4abc0a33c569e
sha256:e4ce6c3651b3a090bb43688f512f687ea6e3e533132bcbc4a83fb97e7046cea3
sha256:421e436b5f80d876128b74139531693be9b4e59e4f1081c9a3c379c95094e375
sha256:4c7380416e7816a5ab1f840482c9c3ca8de58c6f3ee7f95e55ad299abbfe599f
sha256:660c48dd555dcbfdfe19c80a30f557ac57a15f595250e67bfad1e5663c1725bb

단일 레이어 Blob을 다운로드하여 파일에 씁니다.

user@host:~$ BLOBSUM=\
"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"

user@host:~$ curl \
--silent \
--location \
--request GET \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"

모든 BLOB 합계를 파일에 씁니다.

user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum' > ubuntu-blobsums.txt

매니페스트에서 모든 레이어 블로 브를 다운로드하십시오.

user@host:~$ while read BLOBSUM; do
curl \
--silent \
--location \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"; \
done < blobsums.txt

이제 레이어 블롭이 많이 있으며 이미지로 다시 결합해야합니다.


관련된 링크들:


"더 구체적으로, Docker 클라이언트 소프트웨어가 설치되어 있지 않은 제한된 환경의 시스템에있는 Docker Hub에서 Docker 이미지를 다운로드하려고합니다." =>이 머신에서 이미지를 가지는 요점은 무엇입니까? (쉬운 해결 방법은 피벗 호스트를 사용하는 것입니다. 피벗 호스트는 dockerhub에서 도커 풀을 가져 와서 도커 저장 / 도커 푸시 후 내부 레지스트리로 이동합니다)
Tensibai

@Tensibai에 다른 컴퓨터에 복사 하지 도커을 가지고 있지만 하지 않는 인터넷에 액세스 할 수 있습니다.
igal

도커 풀 코드를 보셨습니까? 기본적인 http 호출을 통해 이와 같은 것을 구축 할 수있는 방법으로 들립니다
Tensibai

@ Tensibai 나는 그것을 알아 낸 것 같아요. 또한 Docker 커뮤니티에서 솔루션을 얻은 것 같습니다. 오늘 다시 돌아와서 솔루션을 게시하겠습니다.
igal

@ Tensibai 나는 문제를 해결하는 쉘 스크립트 로 솔루션 을 게시 했습니다 .
igal

답변:


23

따라서 Moby Project 에는 Moby Github 에 Docker로 가져올 수있는 형식으로 Docker Hub 에서 이미지를 다운로드 할 수 있는 셸 스크립트 가 있습니다.

스크립트의 사용법 구문은 다음과 같습니다.

download-frozen-image-v2.sh target_dir image[:tag][@digest] ...

이 이미지는 다음에 가져올 수 있습니다 tardocker load:

tar -cC 'target_dir' . | docker load

스크립트가 예상대로 작동하는지 확인하기 위해 Docker Hub에서 Ubuntu 이미지를 다운로드하여 Docker에로드했습니다.

user@host:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@host:~$ tar -cC 'ubuntu' . | docker load
user@host:~$ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

첫 번째 (않는 인터넷 클라이언트에서 데이터를 복사에 실제로 내가 가진 것 없는 (어떤 대상 / 대상 컴퓨터에 고정 표시기가 설치되어) 않습니다 도커가 설치되어) :

user@nodocker:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@nodocker:~$ tar -C 'ubuntu' -cf 'ubuntu.tar' .
user@nodocker:~$ scp ubuntu.tar user@hasdocker:~

그런 다음 대상 호스트에서 이미지를로드하고 사용하십시오.

user@hasdocker:~ docker load ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

The machine with internet connectivity does not and cannot have Docker installed. 하지만 당신은 적용합니다docker load
030

@ 030 스크립트가 작동하고 다운로드 이미지 데이터를 Docker로 가져올 수 있는지 테스트 / 시연합니다. 실제로 Docker가 설치된 컴퓨터에 먼저 데이터를 복사해야합니다.
igal

아마도 당신은 설명을 위해 그 부분을 추가 할 수 있습니다
030

2
@ 030 워크 플로가 실제로 어떻게 보이는지 보여주는 예제 세션을 추가했습니다.
igal

7

저장소에서 Docker 이미지를 검색하여 여러 형식으로 저장할 수있는 Skopeo 라는 도구가 있습니다.

예를 들면 다음과 같습니다.

  1. 이미지를 다운로드하고 레이어를 타르볼로 저장하십시오. skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu

  2. /tmp/ubuntu.tar원하는 경우 다른 기계로 전송하십시오 .

  3. 인터넷에 연결되지 않은 Docker 인스턴스에 이미지를로드하십시오. docker load --input /tmp/ubuntu.tar

CentOS 7 repo에서 패키지 이름으로 제공 skopeo됩니다. 현재 데비안 또는 우분투 패키지는 없습니다 (그러나 컴파일하기는 쉽습니다).


3

동기 부여에 감사드립니다. Powershell 버전을 만들었습니다. 그것을 확인하십시오 ... 그것으로 당신은 Windows 바탕 화면과 루트 또는 관리자 권한없이 도커 시스템에 ssh-scp 도구를 사용하여 dockerhub 컨테이너에서 제한된 docker 네트워크로 이동할 수 있습니다

https://gitlab.com/Jancsoj78/dockerless_docker_downloader 새로운 해커 도구 :)

$image = "ubuntu"
$tag = "latest"
$imageuri = "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/"+$image+":pull"
$taguri = "https://registry-1.docker.io/v2/library/"+$image+"/manifests/"+$tag
$bloburi = "https://registry-1.docker.io/v2/library/"+$image+"/blobs/sha256:"

#token request
$token = Invoke-WebRequest -Uri $imageuri | ConvertFrom-Json | Select -expand token

#pull image manifest
$blobs = $($(Invoke-Webrequest -Headers @{Authorization="Bearer $token"} -Method GET -Uri $taguri | ConvertFrom-Json | Select -expand fsLayers ) -replace "sha256:" -replace "@{blobSum=" -replace "}")

#download blobs
for ($i=0; $i -lt $blobs.length; $i++) {
    $blobelement =$blobs[$i]

    Invoke-Webrequest -Headers @{Authorization="Bearer $token"} -Method GET -Uri $bloburi$blobelement -OutFile blobtmp

    $source = "blobtmp"
    $newfile = "$blobelement.gz"

#overwrite
Copy-Item $source $newfile -Force -Recurse
#source blobs
ls *.gz
}
#postprocess
echo "copy these .gz to your docker machine"
echo "docker import .gz backward one by one"
echo "lastone with ubuntu:latest"
echo "after docker export and reimport to make a simple layer image"

1

나에게 당신이 무엇을 달성하려고하는지 그리고 왜 시도가 문제의 해결책이 아닌지는 명확하지 않습니다. 이 문제를 해결 해야하는 경우 @ Tensibai 및 기타 Q & A가 표시하고 싶습니다. 인터넷 연결이 가능한 시스템에서 도커를 먼저 가져 와서 도커 이미지를 저장하고 인터넷에 연결하지 않고 컴퓨터에 복사 한 다음 이미지를로드하고 실행하십시오. .

데모

시스템 A에는 이미지가 없습니다 :

userA@systemA ~ $ docker images
REPOSITORY        TAG               IMAGE ID          CREATED             SIZE
userA@systemA ~ $

dockerhub에서 이미지를 가져옵니다.

userA@systemA ~ $
docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bc95e04b23c0: Pull complete 
f3186e650f4e: Pull complete 
9ac7d6621708: Pull complete 
Digest: sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887
Status: Downloaded newer image for nginx:latest
userA@systemA ~ $ docker images
REPOSITORY        TAG               IMAGE ID            CREATED             SIZE
nginx             latest            9e7424e5dbae        10 days ago         108MB

도커 이미지 저장 :

userA@systemA ~ $ docker save nginx -o nginx.tar

도커 이미지를 systemB에 복사하여로드하십시오.

userB@systemB ~ $ docker load -i nginx.tar
cec7521cdf36: Loading layer  58.44MB/58.44MB
350d50e58b6c: Loading layer  53.76MB/53.76MB
63c39cd4a775: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest
userB@systemB ~ $ docker images
REPOSITORY        TAG               IMAGE ID            CREATED             SIZE
nginx             latest            9e7424e5dbae        10 days ago         108MB

1
인터넷에 연결된 시스템은 Docker를 설치하지 않았거나 설치할 수 없습니다. 문제는 Docker 클라이언트 사용 하지 않고 이미지를 다운로드하는 방법을 묻는 것입니다 . 내 솔루션을 참조하십시오 .
igal

0

다음은 적합한 파이썬 스크립트입니다. 따라서 OS 독립 솔루션이 있습니다 : docker-drag

그렇게 사용하면 docker load를 사용하여 가져올 수있는 TAR 아카이브가 생성됩니다.

python docker_pull.py hello-world
python docker_pull.py alpine:3.9
python docker_pull.py kalilinux/kali-linux-docker

1
github 계정을 닫은 경우 아무것도 남아 있지 않습니다. 공유해도 괜찮다면 링크를 유지하고 스크립트를 여기에 붙여 넣으십시오. 당신은 할 수 있습니다 편집 , 답변을 코드를 붙여 넣은 다음 + K 또는 CTRL 그와 유형을 선택 {}하여 포맷 할 수있는 편집기 상단 표시 줄에 (코드) 버튼을 누릅니다.
Tensibai

여기에 코드를 붙여 넣고 싶지만 100 줄 길이이며 읽을 수 있다고 생각하지 않습니다. 그럼에도 불구하고 코드를 포크하여 스크립트 사본을 저장할 수 있습니다.
Dutfaz

그것은 저를위한 것이 아닙니다. 자신을지지하는 답변을 얻는 것이 아닙니다. 링크가 끊어지면 누군가 이것이 몇 달 안에이 답변을 읽는 데 도움이 될 것이라고 생각하십니까? (답변의 최대 크기는 30k 자입니다)
Tensibai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.