Docker
Costruire immagini
Ricerca…
Parametri
Parametro | Dettagli |
---|---|
--Tirare | Garantisce che l'immagine di base ( FROM ) sia aggiornata prima di creare il resto del Dockerfile. |
Costruire un'immagine da un Dockerfile
Una volta che hai un Dockerfile, puoi costruirne un'immagine usando la docker build
. La forma base di questo comando è:
docker build -t image-name path
Se il tuo Dockerfile non è denominato Dockerfile
, puoi usare il flag -f
per dare il nome del Dockerfile da compilare.
docker build -t image-name -f Dockerfile2 .
Ad esempio, per creare un'immagine denominata dockerbuild-example:1.0.0
da un Dockerfile
nella directory di lavoro corrente:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Vedere la documentazione di utilizzo della docker build
per ulteriori opzioni e impostazioni.
Un errore comune è la creazione di un Dockerfile nella directory home dell'utente ( ~
). Questa è una cattiva idea perché durante la docker build -t mytag .
questo messaggio apparirà per molto tempo:
Caricamento del contesto
La causa è il daemon docker che tenta di copiare tutti i file dell'utente (sia la directory home che le sottodirectory). Evita questo specificando sempre una directory per il Dockerfile.
Aggiungere un file .dockerignore
alla directory di build è una buona pratica . La sua sintassi è simile ai file .gitignore
e farà in modo che solo i file e le directory desiderati vengano caricati come contesto del build.
Un semplice Dockerfile
FROM node:5
La direttiva FROM
specifica un'immagine da cui iniziare. È possibile utilizzare qualsiasi riferimento di immagine valido.
WORKDIR /usr/src/app
La direttiva WORKDIR
imposta la directory di lavoro corrente all'interno del contenitore, equivalente all'esecuzione di cd
all'interno del contenitore. (Nota: il RUN cd
non cambierà la directory di lavoro corrente).
RUN npm install cowsay knock-knock-jokes
RUN
esegue il comando specificato all'interno del contenitore.
COPY cowsay-knockknock.js ./
COPY
copia il file o la directory specificati nel primo argomento dal contesto di compilazione (il path
passato al docker build path
) nella posizione nel contenitore specificato dal secondo argomento.
CMD node cowsay-knockknock.js
CMD
specifica un comando da eseguire quando viene eseguita l'immagine e non viene dato alcun comando. Può essere sovrascritto passando un comando alla docker run
.
Ci sono molte altre istruzioni e opzioni; vedere il riferimento Dockerfile per un elenco completo.
Differenza tra ENTRYPOINT e CMD
Esistono due direttive Dockerfile
per specificare quale comando eseguire per impostazione predefinita nelle immagini create. Se si specifica solo CMD
finestra mobile eseguirà tale comando utilizzando il comando ENTRYPOINT
predefinito, che è /bin/sh -c
. È possibile sovrascrivere uno o entrambi il punto di accesso e / o il comando quando si avvia l'immagine costruita. Se si specificano entrambi, ENTRYPOINT
specifica l'eseguibile del processo contenitore e CMD
verrà fornito come parametri di tale eseguibile.
Ad esempio se il tuo Dockerfile
contiene
FROM ubuntu:16.04
CMD ["/bin/date"]
Quindi si utilizza la direttiva ENTRYPOINT
predefinita di /bin/sh -c
e in esecuzione /bin/date
con quel punto di accesso predefinito. Il comando del processo del contenitore sarà /bin/sh -c /bin/date
. Una volta eseguita questa immagine, per impostazione predefinita verrà stampata la data corrente
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
È possibile eseguire l'override di CMD
sulla riga di comando, nel qual caso verrà eseguito il comando specificato.
$ docker run test /bin/hostname
bf0274ec8820
Se si specifica una direttiva ENTRYPOINT
, Docker utilizzerà quell'eseguibile e la direttiva CMD
specifica i parametri predefiniti del comando. Quindi se il tuo Dockerfile
contiene:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Quindi eseguirlo produrrà
$ docker build -t test .
$ docker run test
Hello
È possibile fornire diversi parametri se lo si desidera, ma verranno eseguiti tutti /bin/echo
$ docker run test Hi
Hi
Se si desidera sovrascrivere il punto di accesso elencato nel file Docker (ovvero se si desidera eseguire un comando diverso da echo
in questo contenitore), è necessario specificare il parametro --entrypoint
sulla riga di comando:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
In genere si utilizza la direttiva ENTRYPOINT
per puntare all'applicazione principale che si desidera eseguire e CMD
ai parametri predefiniti.
Esporre una porta nel Dockerfile
EXPOSE <port> [<port>...]
Dalla documentazione di Docker:
L'istruzione
EXPOSE
informa Docker che il contenitore è in ascolto sulle porte di rete specificate in fase di runtime.EXPOSE
non rende accessibili le porte del contenitore all'host. Per fare ciò, è necessario utilizzare il flag-p
per pubblicare un intervallo di porte o il flag-P
per pubblicare tutte le porte esposte. È possibile esporre un numero di porta e pubblicarlo esternamente con un altro numero.
Esempio:
Dentro il tuo Dockerfile:
EXPOSE 8765
Per accedere a questa porta dal computer host, includere questo argomento nel comando di docker run
:
-p 8765:8765
ENTRYPOINT e CMD visti come verbo e parametro
Supponiamo di avere un Dockerfile che termina con
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
se costruisci questa immagine con a
docker built -t inspector .
lanciare l'immagine creata con un Dockerfile come tale con un comando come
docker run -it --net=host --rm inspector
, nethogs monitorerà l'interfaccia chiamata wlan0
Ora se vuoi monitorare l'interfaccia eth0 (o wlan1, o ra1 ...), farai qualcosa di simile
docker run -it --net=host --rm inspector eth0
o
docker run -it --net=host --rm inspector wlan1
Spingendo e tirando un'immagine nell'hub Docker o in un altro registro
Le immagini create localmente possono essere trasferite su Docker Hub o su qualsiasi altro host di repository docker, noto come registro. Utilizzare l' docker login
per accedere a un account hub docker esistente.
docker login
Login with your Docker ID to push and pull images from Docker Hub.
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cjsimon
Password:
Login Succeeded
Un diverso registro docker può essere utilizzato specificando un nome server. Questo funziona anche per i registri privati o self-hosted. Inoltre, è possibile utilizzare un archivio di credenziali esterne per la sicurezza.
docker login quay.io
È quindi possibile contrassegnare e inviare immagini al registro a cui si è effettuato l'accesso. Il tuo repository deve essere specificato come server/username/reponame:tag
. L'omissione del server è attualmente impostata su Docker Hub. (Il registro predefinito non può essere cambiato con un altro provider e non ci sono piani per implementare questa funzione.)
docker tag mynginx quay.io/cjsimon/mynginx:latest
Tag diversi possono essere usati per rappresentare diverse versioni, o rami, della stessa immagine. Un'immagine con più tag diversi mostrerà ogni tag nello stesso repository.
Utilizza le docker images
per visualizzare un elenco di immagini installate installate sul computer locale, inclusa l'immagine appena taggata. Quindi utilizzare push per caricarlo nel registro e tirare per scaricare l'immagine.
docker push quay.io/cjsimon/mynginx:latest
Tutti i tag di un'immagine possono essere estratti specificando l'opzione -a
docker pull quay.io/cjsimon/mynginx:latest
Costruire usando un proxy
Spesso durante la creazione di un'immagine Docker, il Dockerfile contiene istruzioni che eseguono programmi per recuperare risorse da Internet (per esempio wget
per estrarre un build binario del programma su GitHub).
È possibile indicare a Docker di passare le variabili di ambiente set set in modo che tali programmi eseguano tali recuperi attraverso un proxy:
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
sono variabili d'ambiente disponibili solo al momento della compilazione.