2015-07-22 16 views
8

TL; DR In sostanza, Cerco questo:Docker immagine push over SSH (distribuito)

docker push myimage ssh://myvps01.vpsprovider.net/ 

sto riuscendo a cogliere la logica che sta dietro tutta la Docker Hub/cosa del Registro di sistema. So che posso eseguire un registro privato, ma per quello devo configurare l'infrastruttura di eseguire effettivamente un server.

Ho fatto una sbirciatina all'interno del funzionamento interno di Docker (beh, almeno il filesystem), e sembra che i livelli di immagine Docker siano solo un mucchio di tarball, più o meno, con alcuni nomi di file elaborati. Penso ingenuamente che non sarebbe impossibile creare un semplice script Python per fare push/pull distribuito, ma ovviamente non ci ho provato, ecco perché sto facendo questa domanda.

Esistono motivi tecnici per cui Docker non può semplicemente eseguire push/pull distribuito (senza server), come Git o Mercurial?

Penso che questo sarebbe un grande aiuto, dal momento che potrei semplicemente spingere le immagini che ho costruito sul mio portatile direttamente sui server delle app, invece di spingere prima su un server di repository da qualche parte e poi tirare dai server delle app. O forse ho appena frainteso il concetto e il Registro è una caratteristica davvero essenziale di cui ho assolutamente bisogno?

EDIT Alcuni contesto che si spera spiega il motivo per cui voglio che questo, si consideri il seguente scenario:

  • sviluppo, test effettuato sul mio portatile (OSX, tapis roulant Docker, utilizzando finestra mobile-comporre per la definizione dei servizi e dipendenze)
  • distribuzione in un ambiente vivo per mezzo di uno script (auto-scritte, bash, poche dipendenze da macchina dev, fondamentalmente solo macchina Docker)
  • distribuzione in un nuovo VPS con pochissime dipendenze, tranne l'accesso SSH e Docker demone.
  • Nessun servizio "permanenti" in esecuzione da nessuna parte, vale a dire io in particolare non voglio ospitare un registro in esecuzione in modo permanente (soprattutto non accessibili a tutte le istanze VPS, anche se questo potrebbe probabilmente essere risolto con un po 'di tunneling SSH intelligente)

La soluzione migliore corrente è utilizzare la macchina Docker per puntare al server VPS e ricostruirla, ma rallenta la distribuzione in quanto ogni volta devo creare il contenitore dall'origine.

risposta

13

Se si desidera spostare le immagini di ancoraggio su un determinato host, è già presente tutto in Docker per consentire ciò. L'esempio seguente mostra come spingere un'immagine finestra mobile tramite SSH:

docker save <my_image> | ssh -C [email protected] docker load 
  • docker save produrrà un archivio tar di un'immagine della finestra mobile (compresi i suoi strati)
  • -C è per ssh per comprimere i dati flusso
  • docker load crea un'immagine finestra mobile da un archivio tar

Si noti che la combinazione di un registro docker + docker pull ha il vantaggio di scaricare solo i livelli mancanti.Pertanto, se si aggiorna frequentemente un'immagine di finestra mobile (aggiunta di nuovi livelli o modifica di alcuni ultimi livelli), il comando docker pull genererebbe meno traffico di rete rispetto alla pressione di immagini docker complete tramite ssh.

+5

che so di caricare e salvare, ma l'intero punto sarebbe quello di essere intelligenti e spingendo/tirando solo gli strati che si differenziano. – Krumelur

3

Salvare/caricare un'immagine su un host Docker e passare a un registro (privato o Hub) sono due cose diverse.

L'ex @Thomasleveil ha già affrontato.

Quest'ultimo in realtà fa ha "intelligenza" per spingere solo i livelli richiesti.

È possibile testarlo facilmente con un registro privato e un paio di immagini derivate.

Se abbiamo due immagini e uno è derivato dalle altre, poi fare:

docker tag baseimage myregistry:5000/baseimage 
docker push myregistry:5000/baseimage 

spingerà tutti i livelli che non sono già presenti nel Registro di sistema. Tuttavia, quando si quindi spingere l'immagine derivata successiva:

docker tag derivedimage myregistry:5000/derivedimage 
docker push myregistry:5000/derivedimage 

si può notare che solo un singolo strato viene spinto - a condizione che il Dockerfile è stato costruito in modo tale che richiede un solo strato (ad esempio, il concatenamento dei parametri RUN, come da Dockerfile Best Practises).

Sull'host Docker, è anche possibile eseguire un registro privato Dockerised.

Vedi Containerized Docker registry

Al meglio delle mie conoscenze e come del momento della stesura di questo, la spinta di registro/tirare/meccanismo di query non supporta SSH, ma solo HTTP/HTTPS. A differenza di Git e amici.

Vedi Insecure Registry su come gestire un registro privato attraverso HTTP, soprattutto essere consapevoli che è necessario modificare le opzioni del motore finestra mobile e riavviarlo:

Aprire il file/finestra mobile/etc default/o/etc/sysconfig/docker per la modifica di .

A seconda del sistema operativo in uso, le opzioni di avvio del daemon Engine.

Modificare (o aggiungere) la linea DOCKER_OPTS e aggiungere il flag --insecure-registry .

Questo flag prende l'URL del registro, ad esempio.

DOCKER_OPTS = "- myregistrydomain.com:5000 insicuro-registro"

Chiudere e salvare il file di configurazione.

Riavviare il demone Docker

Troverete anche le istruzioni per utilizzare i certificati autofirmati, che consente di utilizzare HTTPS.

utilizzo dei certificati autofirmati

[...] 

questo è più sicuro rispetto alla soluzione del Registro insicuro. È necessario configurare ogni demone finestra mobile che vuole accedere al Registro di sistema

Generate your own certificate: 

mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt 

Be sure to use the name myregistrydomain.com as a CN. 

Use the result to start your registry with TLS enabled 

Instruct every docker daemon to trust that certificate. 

This is done by copying the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt. 

Don’t forget to restart the Engine daemon. 
+1

Grazie per la spiegazione dettagliata. Ho aggiornato la mia domanda con un contesto su ciò che sto cercando di realizzare. Fondamentalmente, sto bene con l'esecuzione del motore Docker stesso, e voglio ospitare un registro che punta all'installazione Docker della mia macchina di sviluppo, servita sulla connessione SSH che già utilizzo. Mi rendo conto che probabilmente non è possibile al momento, il che significa che la tua risposta è probabilmente accettabile. – Krumelur

+0

Ah, ho capito. Aggiungerò informazioni alla mia risposta, affermando che è mia opinione corrente che SSH non è un'opzione per i registri (privati). Salvo qualche bizzarro scenario di tunneling SSH. – Marakai

+0

Un ulteriore punto: le tue modifiche: alcuni dei tuoi obiettivi sono fortemente orientati verso Orchestration e CI/CD. Piattaforme come Bamboo o Jenkins sono in grado di farlo con Docker, ma poiché sto ancora imparando e valutando da solo quelle opzioni, non lo metterò nella mia risposta poiché ritengo che non sarebbe definitivo. – Marakai

Problemi correlati