Conosciamo e amiamo tutti Docker, una piattaforma per creare, gestire e distribuire contenitori di applicazioni su più macchine. Docker Inc. fornisce un servizio per ospitare container open source da scaricare (o estrarre) come un repository git noto come "Docker Registry". Pensalo come un GitHub per container Docker.
Ma cosa succede se si desidera ospitare il proprio registro separato da quello pubblico? Bene, Docker Inc. ha aperto la propria applicazione di registro su GitHub.
Questo tutorial ti guiderà attraverso il processo di configurazione di un registro Docker privato utilizzando CoreOS su un nuovo VPS.
CoreOS + Docker
Non passeremo un sacco di tempo a esaminare esattamente ciò che Docker e CoreOS possono fare, poiché non rientra nell'ambito di questo tutorial. In sostanza, CoreOS è progettato per enormi cluster di server, è piccolo, veloce e ottiene automaticamente regolari aggiornamenti di sicurezza. Il suo file system di root è anche di sola lettura, il che significa che è necessario utilizzare Docker per eseguire qualsiasi tipo di software non incluso con l'installazione di base.
Questo rende Core OS un sistema host perfetto per Docker!
Estrazione ed esecuzione del registro più recente
Docker Inc. ha fornito il Registro di sistema come immagine di livello superiore, ciò significa che possiamo eliminarlo con un semplice:
docker pull registry
Questo può richiedere alcuni minuti a seconda della velocità di connessione.
Un vantaggio di essere un'immagine di livello superiore significa anche che riceve supporto e aggiornamenti regolari.
Ora proviamo il registro. Possiamo creare un nuovo contenitore usando l'immagine del registro:
docker run -p 5000:5000 -d --name=basic_registry registry
Per coloro che non hanno usato Docker troppo, la -p
bandiera rappresenta PORT
, il che significa che stiamo esponendo la porta 5000 dal contenitore alla porta host 5000.
Il -d
flag sta per daemon
, questo farà funzionare il container in background e non stamperà l'output nella sessione SSH corrente, vogliamo anche nominare questo container di test di base usando l' --name
opzione in modo da poterlo gestire facilmente in un secondo momento.
Assicurarsi che il contenitore del registro di base sia in esecuzione utilizzando docker ps
. L'output dovrebbe essere simile a:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edfb54e4a8c4 registry:0.8.1 "/bin/sh -c 'exec do 7 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp basic_registry
Inoltre, visita http://YOUR_IP:5000
nel tuo browser Web e dovresti ricevere un messaggio come il seguente:
"docker-registry server (dev) (v0.8.1)"
Notare la parola dev
tra parentesi. Ciò significa che il server sta attualmente eseguendo la configurazione dev. Vedremo presto altre configurazioni.
Ora hai il tuo registro container (molto semplice) in esecuzione! Ma non abbiamo ancora finito.
Forse vuoi mantenere questo privato da occhi indiscreti, o forse archiviare le tue immagini su Amazon S3 invece di archiviazione locale. Esaminiamo le varie opzioni di configurazione nella sezione successiva.
Prima di andare avanti, uccidiamo il contenitore di test in modo che non ci imbattiamo in porte in conflitto.
docker kill basic_registry
Configurazione del registro
Esistono due modi in cui possiamo passare la configurazione al registro Docker. Un modo è passare le variabili di ambiente a un nuovo contenitore e l'altro è aggiungere un file di configurazione.
Ecco alcune delle opzioni di configurazione comuni che utilizzeremo:
loglevel
- La quantità minima di informazioni per accedere alla console. L'impostazione predefinita è info
.
standalone
- Questo registro dovrebbe agire da solo? (Non interrogare mai il registro pubblico.) L'impostazione predefinita è true
.
index_endpoint
- Se non autonomo, quale altro indice interrogheremo? Predefinito index.docker.io
.
cache
e cache_lru
- Opzioni relative all'utilizzo di una cache Redis per file di piccole dimensioni, di cui parleremo più avanti.
storage
- Quale backend di archiviazione dovremmo usare per questo server? (In questo tutorial useremo local).
storage_path
- Se si utilizza l'archiviazione locale, quale directory dovremmo usare per conservare i file?
Prima di iniziare a lavorare con la configurazione, abbiamo bisogno di un file di base con cui lavorare. Il file dal repository Docker Registry su GitHub funzionerà perfettamente:
wget https://raw.githubusercontent.com/docker/docker-registry/0.8/config/config_sample.yml
Il file deve essere salvato correttamente con un output come:
2014-09-14 14:09:01 (156 MB/s) - 'config_sample.yml' saved [5384/5384]
Grande! Ora possiamo modificare questo file per adattarlo alle nostre esigenze.
L'unico editor di testo fornito con Core OS è vim
, ma non preoccuparti se non l'hai mai usato prima, questo spiegherà passo dopo passo cosa modificare e come farlo.
vim config_sample.yml
Dopo aver aperto il file, premi il I
tasto e nell'angolo in basso a destra dovrebbe essere visualizzato: -- INSERT --
per la modalità di inserimento. Scorri fino alla fine del file usando i tasti freccia, dovresti vedere una sezione etichettata prod
.
Modificheremo le due linee, le modifiche sono di seguito
prod:
<<: *local
storage_path: _env:STORAGE_PATH:/data
Ciò che abbiamo fatto è cambiare la prod
configurazione per derivare dalla local
sezione anziché dalla s3
sezione. Quindi abbiamo sovrascritto il storage_path
per utilizzare il percorso /data
all'interno del nuovo contenitore.
Dopo aver verificato che tutte le modifiche sono corrette, premi ESC
per uscire dalla modalità di inserimento e digitare :wq
(questo significa scrivere le modifiche nel file ed uscire da VIM.)
Ora rinominiamo il file in just config.yml
mv config_sample.yml config.yml
Redis caching (opzionale)
Se desideri utilizzare redis per velocizzare il registro dei container, è semplice come estrarre un nuovo container dal registro pubblico e aggiungere qualche altra riga di configurazione.
Per prima cosa, tira l'immagine di livello superiore di Redis:
docker pull redis
Una volta che l'immagine è stata estratta correttamente, possiamo eseguirla e denominarla come abbiamo fatto con il registro dei test:
docker run -d --name registry-redis redis
Poiché redis è in memoria, non è necessario eseguire alcuna configurazione per esso, poiché lo collegheremo al contenitore del registro nei passaggi successivi.
Ancora una volta, assicurati che funzioni utilizzando docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54f65641eccf redis:2.8 "redis-server" 2 seconds ago Up 1 seconds 6379/tcp registry-redis
Ora riaprire config.yml
in vim
e accedere alla modalità di inserimento proprio come la prima volta che l'abbiamo modificata.
Aggiungi le seguenti righe sotto la prod
sezione, assicurandoti di rientrare correttamente. Questa volta stiamo solo aggiungendo cache
e cache_lru
.
cache:
host: _env:REDIS_PORT_6379_TCP_ADDR
port: _env:REDIS_PORT_6379_TCP_PORT
db: 0
cache_lru:
host: _env:REDIS_PORT_6379_TCP_ADDR
port: _env:REDIS_PORT_6379_TCP_PORT
db: 1
Le variabili di ambiente REDIS_PORT_6379_TCP_ADDR
e REDIS_PORT_6379_TCP_PORT
vengono passate al contenitore del registro al momento del collegamento con il contenitore Redis.
Con ciò, ora hai impostato un contenitore Redis che funzionerà di pari passo con il tuo contenitore di registro. Ora sulla costruzione del registro!
Costruire il container
Abbiamo tutte le configurazioni impostate e pronte, ora abbiamo bisogno di costruire l'attuale contenitore del registro.
Fuoco fino vim Dockerfile
a creare una nuova Dockerfile. Accedi alla modalità di inserimento e segui le modifiche seguenti.
FROM registry:latest
# Add the custom configuration file we made
ADD ./config.yml /docker-registry/config/config.yml
# Create the data directory
RUN mkdir /data
# Set the configuration file to config.yml
env DOCKER_REGISTRY_CONFIG /docker-registry/config/config.yml
# Make sure we use the prod configuration settings
env SETTINGS_FLAVOR prod
Quello che abbiamo fatto sopra è essenzialmente estendere l'immagine del registro in modo che utilizzi il nostro file di configurazione e le nostre impostazioni. Un file Docker è un insieme di istruzioni di compilazione che Docker può leggere e compilare. Se vuoi saperne di più sui Dockerfile e sulla loro sintassi, dai un'occhiata alla documentazione ufficiale del sito Docker.
Successivamente è necessario creare il contenitore per l'uso.
docker build -t my_registry .
Sending build context to Docker daemon 13.82 kB
Sending build context to Docker daemon
Step 0 : FROM registry
---> e42d15ec8417
Step 1 : ADD ./config.yml /docker-registry/config/config.yml
---> 4339f026d459
Removing intermediate container 2d5138fbcd34
Step 2 : RUN mkdir /data
---> Running in a090f0bdbfd1
---> 8eb27ba6e12a
Removing intermediate container a090f0bdbfd1
Step 3 : env DOCKER_REGISTRY_CONFIG /docker-registry/config/config.yml
---> Running in 565b5bfb2b22
---> 914462e46dc0
Removing intermediate container 565b5bfb2b22
Step 4 : env SETTINGS_FLAVOR prod
---> Running in 31a92847b851
---> b5949575c374
Removing intermediate container 31a92847b851
Successfully built b5949575c374
Ora siamo pronti per correre!
Creiamo una directory sul nostro sistema host da montare nel contenitore come /data
volume.
mkdir registry-data
Ora possiamo creare un nuovo contenitore. Se si prevede di utilizzare la cache Redis, utilizzare il secondo comando di seguito.
# For a non-Redis cache registry
docker run -d -p 5000:5000 -v /home/core/registry-data:/data --name=private_reg my_registry
# For a Redis cached registry (Must have followed Redis Caching section above)
docker run -d -p 5000:5000 -v /home/core/registry-data:/data --name=private_reg --link registry-redis:redis my_registry
Per assicurarsi che il server funzioni correttamente, visitare http://YOUR_IP:5000
. Vedrai il seguente messaggio:
"docker-registry server (prod) (v0.8.1)"
Nota il (prod)
significato delle nostre modifiche alla configurazione hanno avuto successo!
Ora che abbiamo il nostro registro in esecuzione, vogliamo che il client Docker sui nostri computer locali inizi a usarlo. Di solito useresti il comando:, docker login
ma per il nostro uso, dobbiamo aggiungere un altro argomento al comando login:
docker login YOUR_IP:5000
Inserisci un nome utente e una password (pensa a questo come creare un nuovo account) e ignora il messaggio che indica che devi attivarlo.
Quindi, estraiamo un'immagine stock e inseriamola nel nostro repository.
# Pull the busybox image from the public registry
docker pull busybox
# Tag it with our IP/URL
docker tag busybox YOUR_IP:5000/busybox
# Push it to our newly made registry
docker push YOUR_IP:5000/busybox
Se tutto procede correttamente, il messaggio finale dovrebbe essere simile a:
Pushing tag for rev [a9eb17255234] on
Congratulazioni! Hai configurato il tuo repository docker personale.
Qual è il prossimo?
Ecco alcune idee su come migliorare il tuo nuovo registro privato:
- Proxy inverso usando Nginx o Apache per mettere ulteriore sicurezza davanti ad esso, come una semplice autenticazione HTTP.
- Ottieni un dominio per il tuo server e configuralo in modo da poter accedere al tuo registro con qualcosa come: register.mysite.com
- Acquista (o auto-firma) un certificato SSL per aggiungere ancora più protezione se i tuoi contenitori contengono informazioni riservate.