Jak udostępnić mój obraz Docker bez korzystania z Docker-Hub?

257

Zastanawiam się, gdzie dokładnie są przechowywane obrazy Dockera na moim lokalnym komputerze hosta. Czy mogę udostępnić mój obraz dokera bez użycia Docker-Hublub Dockerfileprawdziwego obrazu dokera? A co dokładnie się dzieje, gdy „wypycham” obraz Docker do Docker-Hub?

Yaquawa
źródło
2
Do wykorzystania w przyszłości: dobry artykuł na temat przenoszenia obrazów dokerów
Mifeet,

Odpowiedzi:

243

Obrazy dokerów są przechowywane jako warstwy systemu plików. Każde polecenie w Dockerfile tworzy warstwę. Możesz także tworzyć warstwy za pomocą docker commitwiersza poleceń po wprowadzeniu pewnych zmian ( docker runprawdopodobnie przez ).

Te warstwy są domyślnie przechowywane pod /var/lib/docker. Chociaż możesz (teoretycznie) wybrać pliki stamtąd i zainstalować je na innym serwerze dokera, prawdopodobnie jest to zły pomysł, aby grać z wewnętrzną reprezentacją używaną przez Docker.

Po wypchnięciu obrazu warstwy te są wysyłane do rejestru (rejestr koncentratora dokerów, domyślnie… chyba że otagujesz obraz innym prefiksem rejestru) i tam przechowywane. Podczas wypychania identyfikator warstwy służy do sprawdzania, czy masz już warstwę lokalnie, czy należy ją pobrać. Możesz użyć, docker historyaby zobaczyć, które warstwy (inne obrazy) są używane (i do pewnego stopnia, które polecenie utworzyło warstwę).

Jeśli chodzi o opcje udostępniania obrazu bez wypychania go do rejestru centrum dokowania, najlepsze opcje to:

  • docker saveobraz lub docker exportpojemnik. Spowoduje to wyświetlenie pliku tar na standardowe wyjście, więc będziesz chciał zrobić coś takiego docker save 'dockerizeit/agent' > dk.agent.latest.tar. Następnie możesz użyć docker loadlub docker importna innym hoście.

  • Zarządzaj swoim prywatnym rejestrem. - Nieaktualne, patrz komentarze Zobacz obraz rejestru dokera . Zbudowaliśmy rejestr oparty na s3, który możesz uruchamiać i zatrzymywać w razie potrzeby (cały stan jest przechowywany w wybranym koszyku s3), co jest banalne w konfiguracji. Jest to również ciekawy sposób na obserwowanie, co dzieje się podczas wypychania do rejestru

  • Użyj innego rejestru, takiego jak quay.io (nie próbowałem go osobiście), chociaż prawdopodobnie dotyczy to również wszystkiego, co masz do czynienia z centrum dokowania .

Abel Muiño
źródło
6
Do wglądu w przyszłości łącze do obrazu rejestru dokera jest nieaktualne. Powinieneś teraz używać Docker Registry 2.0 i kodu na github /
docker
1
Nie jestem pewien, czy Rejestr 2.0 jest gotowym do użycia zamiennikiem oryginalnego. Wydaje się, że brakuje niektórych podstawowych funkcji, takich jak wyszukiwarka stackoverflow.com/questions/30113726/docker-registry-2-0-api-v2
JoshRivers
1
Pytanie o docker save: kiedy wypycham obraz, który pochodzi z innego obrazu (powiedzmy python:2.7) do rejestru, obraz nadrzędny nie musi być przesyłany więcej niż raz, chyba że się zmieni. Czy mogę zapisać częściowe obrazy, aby osiągnąć podobną optymalizację rozmiaru pliku? Skaczę przez te obręcze, ponieważ jestem hobbystą z wieloma obrazami i nie chcę płacić za prywatny rejestr.
Pieter
4
Czy nie możesz po prostu pobrać plików SRC z repozytorium git, w tym pliku Docker i docker buildna hoście?
jshxe
1
@Jishaxe częścią mojej kompilacji jest npm install... Nie mogę zbudować na moim hoście, ponieważ ma bardzo mało pamięci i ten krok zawsze kończy się niepowodzeniem (patrz: github.com/npm/npm/issues/5021 )
Soft Bullets
46

Na podstawie tego bloga można udostępnić obraz dokera bez rejestru dokera, wykonując:

docker save --output latestversion-1.0.0.tar dockerregistry/latestversion:1.0.0

Po wykonaniu tego polecenia można skopiować obraz na serwer i zaimportować go w następujący sposób:

docker load --input latestversion-1.0.0.tar
030
źródło
18

Wysłanie obrazu dokera do zdalnego serwera można wykonać w 3 prostych krokach:

  1. Lokalnie zapisz obraz dokera jako plik .tar :
docker save -o <path for created tar file> <image name>
  1. Lokalnie użyj scp, aby przenieść plik .tar do pilota

  2. Na zdalnym serwerze załaduj obraz do okna dokowanego:

docker load -i <path to docker image tar file>
JSON C11
źródło