Docker
Budowanie obrazów
Szukaj…
Parametry
Parametr | Detale |
---|---|
--Ciągnąć | Zapewnia, że obraz podstawowy ( FROM ) jest aktualny przed zbudowaniem reszty pliku Docker. |
Budowanie obrazu z pliku Docker
Po uzyskaniu pliku Docker można z niego zbudować obraz przy użyciu docker build
. Podstawowa forma tego polecenia to:
docker build -t image-name path
Jeśli Twój plik Dockerfile nie jest nazwany Dockerfile
, możesz użyć flagi -f
aby podać nazwę pliku Dockerfile do zbudowania.
docker build -t image-name -f Dockerfile2 .
Na przykład, aby zbudować obraz o nazwie dockerbuild-example:1.0.0
z pliku Dockerfile
w bieżącym katalogu roboczym:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Aby uzyskać więcej opcji i ustawień, zobacz dokumentację użytkowania docker build
.
Częstym błędem jest tworzenie Dockerfile w katalogu osobistym użytkownika ( ~
). To zły pomysł, ponieważ podczas docker build -t mytag .
ten komunikat pojawi się przez długi czas:
Przesyłanie kontekstu
Przyczyną jest to, że demon dokera próbuje skopiować wszystkie pliki użytkownika (zarówno katalog domowy, jak i jego podkatalogi). Unikaj tego, zawsze określając katalog dla pliku Docker.
Dodanie .dockerignore
plik do katalogu build to dobra praktyka . Jego składnia jest podobna do plików .gitignore
i .gitignore
że tylko pożądane pliki i katalogi zostaną przesłane jako kontekst kompilacji.
Prosty plik Docker
FROM node:5
Dyrektywa FROM
określa obraz, od którego należy zacząć. Można użyć dowolnego ważnego odwołania do obrazu .
WORKDIR /usr/src/app
Dyrektywa WORKDIR
ustawia bieżący katalog roboczy w kontenerze, równoważny uruchamianiu cd
w kontenerze. (Uwaga: RUN cd
nie zmieni bieżącego katalogu roboczego.)
RUN npm install cowsay knock-knock-jokes
RUN
wykonuje podane polecenie w kontenerze.
COPY cowsay-knockknock.js ./
COPY
kopiuje plik lub katalog określony w pierwszym argumencie z kontekstu kompilacji ( path
przekazana do docker build path
) do lokalizacji w kontenerze określonej przez drugi argument.
CMD node cowsay-knockknock.js
CMD
określa polecenie do wykonania, gdy obraz jest uruchamiany i nie podano polecenia. Można go zastąpić, przekazując polecenie do docker run
.
Istnieje wiele innych instrukcji i opcji; Zobacz pełną listę Dockerfile .
Różnica między ENTRYPOINT a CMD
Istnieją dwie dyrektywy Dockerfile
które określają, jakie polecenie ma być domyślnie uruchamiane w wbudowanych obrazach. Jeśli podasz tylko CMD
doker uruchomi tę komendę, używając domyślnego ENTRYPOINT
, czyli /bin/sh -c
. Możesz zastąpić punkt wejścia i / lub polecenie podczas uruchamiania wbudowanego obrazu. Jeśli określisz oba, ENTRYPOINT
określa plik wykonywalny procesu kontenera, a CMD
zostanie dostarczony jako parametry tego pliku wykonywalnego.
Na przykład jeśli Dockerfile
zawiera
FROM ubuntu:16.04
CMD ["/bin/date"]
Następnie używasz domyślnej dyrektywy ENTRYPOINT
/bin/sh -c
i uruchamiasz /bin/date
z tym domyślnym punktem wejścia. Poleceniem Twojego procesu kontenerowego będzie /bin/sh -c /bin/date
. Po uruchomieniu tego obrazu domyślnie zostanie wydrukowana bieżąca data
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
Możesz zastąpić CMD
w wierszu poleceń, w którym to przypadku uruchomi podane polecenie.
$ docker run test /bin/hostname
bf0274ec8820
Jeśli określisz dyrektywę ENTRYPOINT
, Docker użyje tego pliku wykonywalnego, a dyrektywa CMD
określa domyślne parametry polecenia. Więc jeśli Twój Dockerfile
zawiera:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Następnie uruchomi go
$ docker build -t test .
$ docker run test
Hello
Możesz podać inne parametry, jeśli chcesz, ale wszystkie będą działać /bin/echo
$ docker run test Hi
Hi
Jeśli chcesz zastąpić punkt wejścia wymieniony w pliku Docker (tj. Jeśli chcesz uruchomić inne polecenie niż echo
w tym kontenerze), musisz podać parametr --entrypoint
w wierszu polecenia:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
Zasadniczo używasz dyrektywy ENTRYPOINT
aby wskazać główną aplikację, którą chcesz uruchomić, a CMD
parametry domyślne.
Odsłanianie portu w pliku Docker
EXPOSE <port> [<port>...]
Instrukcja
EXPOSE
informuje Dockera, że kontener nasłuchuje na określonych portach sieciowych w czasie wykonywania.EXPOSE
nie udostępnia portów kontenera hostowi. Aby to zrobić, musisz użyć flagi-p
aby opublikować zakres portów lub flagi-P
aby opublikować wszystkie odsłonięte porty. Możesz ujawnić jeden numer portu i opublikować go zewnętrznie pod innym numerem.
Przykład:
Wewnątrz pliku Docker:
EXPOSE 8765
Aby uzyskać dostęp do tego portu z komputera hosta, dołącz ten argument do komendy docker run
:
-p 8765:8765
ENTRYPOINT i CMD postrzegane jako czasownik i parametr
Załóżmy, że masz plik Docker kończący się na
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
jeśli zbudujesz ten obraz za pomocą
docker built -t inspector .
uruchom obraz zbudowany za pomocą takiego pliku Docker za pomocą polecenia takiego jak
docker run -it --net=host --rm inspector
, Nethogs będzie monitorował interfejs o nazwie wlan0
Teraz, jeśli chcesz monitorować interfejs eth0 (lub wlan1 lub ra1 ...), zrobisz coś takiego
docker run -it --net=host --rm inspector eth0
lub
docker run -it --net=host --rm inspector wlan1
Pchanie i ciągnięcie obrazu do Docker Hub lub innego rejestru
Lokalnie utworzone obrazy można przekazać do Docker Hub lub dowolnego innego hosta repozytorium dokerów, znanego jako rejestr. Użyj danych docker login
aby zalogować się do istniejącego konta centrum dokera.
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
Można użyć innego rejestru dokera, określając nazwę serwera. Działa to również w przypadku rejestrów prywatnych lub hostowanych na własny rachunek. Ponadto możliwe jest korzystanie z zewnętrznego magazynu danych logowania dla bezpieczeństwa.
docker login quay.io
Następnie możesz oznaczyć i wypchnąć obrazy do rejestru, do którego jesteś zalogowany. Twoje repozytorium musi być określone jako server/username/reponame:tag
. Pominięcie serwera obecnie domyślnie to Docker Hub. (Domyślnego rejestru nie można zmienić na innego dostawcę i nie ma planów wdrożenia tej funkcji).
docker tag mynginx quay.io/cjsimon/mynginx:latest
Różne tagi mogą być używane do reprezentowania różnych wersji lub gałęzi tego samego obrazu. Obraz z wieloma różnymi tagami wyświetli każdy tag w tym samym repozytorium.
Użyj docker images
aby wyświetlić listę zainstalowanych obrazów zainstalowanych na komputerze lokalnym, w tym nowo oznakowany obraz. Następnie użyj push, aby przesłać go do rejestru i pociągnij, aby pobrać obraz.
docker push quay.io/cjsimon/mynginx:latest
Wszystkie tagi obrazów można wyciągnąć, określając opcję -a
docker pull quay.io/cjsimon/mynginx:latest
Budowanie za pomocą proxy
Często podczas budowania obrazu Dockera plik Docker zawiera instrukcje uruchamiające programy w celu pobrania zasobów z Internetu (na przykład wget
aby pobrać kompilację binarną programu na GitHub).
Możliwe jest poinstruowanie Dockera, aby przekazywał ustawione zmienne środowiskowe, aby takie programy wykonywały te pobrania za pośrednictwem serwera 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
to zmienne środowiskowe, które są dostępne tylko w czasie kompilacji.