Docker
Afbeeldingen bouwen
Zoeken…
parameters
Parameter | Details |
---|---|
--Trekken | Zorgt ervoor dat de basis afbeelding ( FROM ) is up-to-date voor de bouw van de rest van de Dockerfile. |
Een afbeelding samenstellen uit een Dockerfile
Zodra u een Docker-bestand hebt, kunt u er een afbeelding van maken met behulp van docker build
. De basisvorm van dit commando is:
docker build -t image-name path
Als uw Dockerfile niet de naam Dockerfile
, kunt u de vlag -f
gebruiken om de naam te geven van het te bouwen Dockerfile.
docker build -t image-name -f Dockerfile2 .
Om bijvoorbeeld een afbeelding met de naam dockerbuild-example:1.0.0
te bouwen dockerbuild-example:1.0.0
vanuit een Dockerfile
in de huidige werkmap:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Raadpleeg de gebruiksdocumentatie van de docker build
voor meer opties en instellingen.
Een veel voorkomende fout is het maken van een Docker-bestand in de thuismap van de gebruiker ( ~
). Dit is een slecht idee omdat tijdens het docker build -t mytag .
dit bericht zal lang verschijnen:
Context uploaden
De oorzaak is dat de docker-daemon alle bestanden van de gebruiker probeert te kopiëren (zowel de thuismap als de bijbehorende submappen). Vermijd dit door altijd een map op te geven voor het Docker-bestand.
Het is een goede gewoonte om een .dockerignore
bestand aan de build-directory toe te voegen. De syntaxis is vergelijkbaar met .gitignore
bestanden en zorgt ervoor dat alleen gewenste bestanden en mappen worden geüpload als context van de build.
Een eenvoudige Dockerfile
FROM node:5
De FROM
richtlijn specificeert een afbeelding om mee te beginnen. Elke geldige afbeeldingsreferentie kan worden gebruikt.
WORKDIR /usr/src/app
De WORKDIR
richtlijn stelt de huidige werkmap in de container in, vergelijkbaar met het uitvoeren van cd
in de container. (Opmerking: met RUN cd
wordt de huidige werkmap niet gewijzigd.)
RUN npm install cowsay knock-knock-jokes
RUN
voert de gegeven opdracht in de container uit.
COPY cowsay-knockknock.js ./
COPY
kopieert het bestand of de map die in het eerste argument van de build context (de path
toegevoerd aan docker build path
) om de locatie van de container die door het tweede argument.
CMD node cowsay-knockknock.js
CMD
specificeert een opdracht om uit te voeren wanneer de afbeelding wordt uitgevoerd en er geen opdracht wordt gegeven. Het kan worden opgeheven door een opdracht door te geven aan docker run
.
Er zijn veel andere instructies en opties; zie de Dockerfile-referentie voor een volledige lijst.
Verschil tussen ENTRYPOINT en CMD
Er zijn twee Dockerfile
richtlijnen om op te geven welke opdracht standaard moet worden uitgevoerd in ingebouwde afbeeldingen. Als u alleen CMD
opgeeft, voert ENTRYPOINT
die opdracht uit met de standaard ENTRYPOINT
, namelijk /bin/sh -c
. U kunt het ingangspunt en / of het commando of beide overschrijven wanneer u de ingebouwde afbeelding start. Als u beide opgeeft, geeft ENTRYPOINT
het uitvoerbare bestand van uw containerproces aan en wordt CMD
geleverd als de parameters van dat uitvoerbare bestand.
Bijvoorbeeld als uw Dockerfile
bevat
FROM ubuntu:16.04
CMD ["/bin/date"]
Dan gebruikt u de standaard ENTRYPOINT
richtlijn van /bin/sh -c
en voert u /bin/date
met dat standaardinvoerpunt. Het commando van uw containerproces is /bin/sh -c /bin/date
. Zodra u deze afbeelding uitvoert, wordt standaard de huidige datum afgedrukt
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
U kunt CMD
op de opdrachtregel overschrijven. In dat geval wordt de opgegeven opdracht uitgevoerd.
$ docker run test /bin/hostname
bf0274ec8820
Als u een ENTRYPOINT
instructie opgeeft, gebruikt Docker dat uitvoerbare bestand en geeft de CMD
richtlijn de standaardparameter (s) van de opdracht op. Dus als uw Dockerfile
bevat:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Dan zal het produceren
$ docker build -t test .
$ docker run test
Hello
U kunt desgewenst verschillende parameters opgeven, maar deze worden allemaal uitgevoerd /bin/echo
$ docker run test Hi
Hi
Als u het in uw Dockerfile vermelde ingangspunt wilt overschrijven (dwz als u een andere opdracht dan echo
in deze container wilt uitvoeren), moet u de parameter --entrypoint
op de opdrachtregel opgeven:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
Over het algemeen gebruikt u de ENTRYPOINT
richtlijn om te verwijzen naar uw hoofdtoepassing die u wilt uitvoeren en CMD
naar de standaardparameters.
Een poort in het Docker-bestand weergeven
EXPOSE <port> [<port>...]
Uit de documentatie van Docker:
De instructie
EXPOSE
informeert Docker dat de container tijdens runtime naar de opgegeven netwerkpoorten luistert.EXPOSE
maakt de poorten van de container niet toegankelijk voor de host. Om dat te doen, moet u de vlag-p
gebruiken om een reeks poorten te publiceren of de vlag-P
om alle zichtbare poorten te publiceren. U kunt het ene poortnummer vrijgeven en extern publiceren onder een ander nummer.
Voorbeeld:
In uw Docker-bestand:
EXPOSE 8765
Om toegang te krijgen tot deze poort vanaf de hostmachine, neemt u dit argument op in uw docker run
opdracht:
-p 8765:8765
ENTRYPOINT en CMD gezien als werkwoord en parameter
Stel dat u een Docker-bestand hebt dat eindigt op
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
als je deze afbeelding bouwt met een
docker built -t inspector .
start de afbeelding gebouwd met zo'n Dockerfile met een commando zoals
docker run -it --net=host --rm inspector
, zal nethogs de interface met de naam wlan0 bewaken
Als u nu de interface eth0 (of wlan1 of ra1 ...) wilt controleren, doet u zoiets
docker run -it --net=host --rm inspector eth0
of
docker run -it --net=host --rm inspector wlan1
Een afbeelding naar een Docker Hub of een ander register duwen en trekken
Lokaal gemaakte afbeeldingen kunnen worden gepusht naar Docker Hub of een andere docker repo-host, bekend als een register. Gebruik docker login
om u aan te melden bij een bestaand Docker Hub-account.
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
Een ander docker-register kan worden gebruikt door een servernaam op te geven. Dit werkt ook voor particuliere of zelf gehoste registers. Verder is het voor de veiligheid mogelijk om een externe referentieopslag te gebruiken.
docker login quay.io
U kunt vervolgens afbeeldingen taggen en pushen naar het register waarbij u bent aangemeld. Je repository moet worden opgegeven als server/username/reponame:tag
. Het weglaten van de server is standaard de Docker Hub. (Het standaardregister kan niet worden gewijzigd in een andere provider en er zijn geen plannen om deze functie te implementeren.)
docker tag mynginx quay.io/cjsimon/mynginx:latest
Verschillende tags kunnen worden gebruikt om verschillende versies of takken van dezelfde afbeelding weer te geven. Een afbeelding met meerdere verschillende tags zal elke tag in dezelfde repo weergeven.
Gebruik docker images
om een lijst met geïnstalleerde afbeeldingen te zien die op uw lokale computer zijn geïnstalleerd, inclusief uw nieuw getagde afbeelding. Gebruik vervolgens push om het naar het register te uploaden en trek om de afbeelding te downloaden.
docker push quay.io/cjsimon/mynginx:latest
Alle tags van een afbeelding kunnen worden getrokken door de optie -a
docker pull quay.io/cjsimon/mynginx:latest
Bouwen met behulp van een proxy
Vaak als beeld Docker gebouw, de Dockerfile bevat instructies die loopt programma's om middelen te halen uit het Internet ( wget
bijvoorbeeld om een programma binaire build trekken GitHub bijvoorbeeld).
Het is mogelijk om Docker te instrueren om ingestelde set omgevingsvariabelen door te geven, zodat dergelijke programma's die ophaalacties uitvoeren via een 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
zijn omgevingsvariabelen die alleen tijdens de build beschikbaar zijn.