Docker
Instalacja
- # curl -fsSL https://get.docker.com/ | sh
- gdy chcemy zainstalować serwer Dockera na Linuksie (obojętnie jaka dystrybucja)
- $ sudo usermod -aG docker nazwa_twojego_konta
- żeby można było wykonywać polecenie
docker
z własnego konta Linuksa, a nie tylko z roota
Podstawowe polecenia
- docker info
- Podstawowe statystyki serwera Dockera (liczba kontenerów w poszczególnych stanach, liczba obrazów w cache’u, wersja serwera, liczba rdzeni procesora hosta, system operacyjny hosta, itp.)
- service docker status
- stan serwera Dockera i jego najnowsze logi
- docker help
- docker help podpolecenie
- lista dostępnych podpoleceń i dostępnych opcji dla wybranego podpolecenia
- docker run --rm -ti ubuntu /bin/bash
- Zaciąga z oficjalnego repozytorium Docker Hub oficjalny obraz systemu plików najnowszego Ubuntu i uruchamia oparty na tym obrazie kontener, a w nim powłokę shella; opcja
--rm
oznacza że kontener ma zostać usunięty po zatrzymaniu (zakończeniu procesubash
) a opcje-ti
oznaczają że chcemy mieć interaktywny dostęp do uruchomionego procesu, jak do terminala
Inne przydatne opcje:-d Uruchom proces kontenera w trybie demona (odpowiednik nohup
)--name mojanazwa Nadaje nazwę kontenerowi (domyślnie jest ona losowana i ma postać przymiotnik_nazwisko
, żeby łatwiej było ją zapamiętać)--expose nr_portu–nr_portu Otwiera w kontenerze zakres portów LISTEN do komunikacji z innymi kontenerami; odpowiednik polecenia EXPOSE w Dockerfile -p 8080:80/tcp Mapuje port 80 kontenera na port 8080 hosta (sufiks /tcp
jest domyślny i można pominąć); niejawnie wykonuje również--expose
-p 7000-8000:7000-8000 Mapowanie przedziału portów -p 80 Mapuje port 80 kontenera na jakiś wolny port hosta ( docker inspect
na kontenerze pozwala ustalić port docelowy)-P robi -p
dla wszystkich eksponowanych portów kontenera (opcja--expose
lub EXPOSE w Dockerfile), mapując na jakieś wolne porty hosta-e NAZWA="Wartość" Przekazuje zmienną środowiskową do kontenera (odpowiednik polecenia ENV w Dockerfile) --read-only=true Montuje główny system plików kontenera w trybie read-only
, tak że procesy działające wewnątrz kontenera nie mogą zapisywać niczego w głównym systemie plików; zapobiega to temu, że logi, o których istnieniu programista nie wie, wypełnią przydzielony kontenerowi dysk w systemie produkcyjnym-v /etc:/host-etc:ro Montuje w katalogu /host-etc
kontenera katalog/etc
hosta z prawami tylko do odczytu (domyślnie jestrw
)-v /data Montuje w katalogu /data
kontenera jakiś katalog w/var/lib/docker/vfs/
hosta. Jeśli podstawowy obraz kontenera zawiera dane w/data
, zostaną one skopiowane do nowego wolumenu w momencie inicjalizacji. Aby usunąć później taki katalog wraz z kontenerem, trzeba użyćdocker rm -v
--tmpfs /tmp:rw,noexec,nodev,nosuid,size=256M Czasem konieczne jest uczynienie katalogu takiego jak /tmp
katalogiem zapisywalnym nawet wtedy, gdy reszta kontenera jest dostępna tylko do odczytu. Wszystkie dane z takich katalogówtmpfs
zostaną utracone z chwilą zatrzymania kontenera--cpu-shares 512 Zasoby procesora obsługiwane są jako „zasoby procesora” (ang. cpu shares). Moc obliczeniowa wszystkich rdzeni procesora w systemie jest przyjmowana jako cała pula udziałów. Wartość 1024 opisuje całą pulę. Jeśli chcesz, aby kontener mógł używać max. 50% mocy obliczeniowej systemu, powinieneś mu przypisać 512 udziałów. Nie są to zasoby na wyłączność, tzn. przypisanie 1024 udziałów nie zatrzyma działania innych kontenerów – jest to raczej podpowiedź dla mechanizmu kolejkowania procesów jak dużo czasu należy przydzielić kontenerowi za każdym razem. --cpuset=0,1 Przypinanie kontenera do wybranych rdzeni procesora -m 512m Twardy limit pamięci: 512 MB --memory-swap=768m Twardy limit swapa: 768 MB --ulimit nofile=100:200 Limity otwartych plików --pids-limit=64 Ogranicza liczbę aktywnych procesów w obrębie kontenera, zapobiegając wyczerpaniu dostępnych zasobów systemu (np. tzw. fork bomb) --log-opt max-size=100m Maksymalna wielkość pliku logów – patrz polecenie docker logs
niżej--log-opt max-file=5 Maksymalna liczba plików logów – najstarsze będą usuwane (domyślna wartość: 1). Jeśli nie ustawiono max-size
, tomax-file
będzie ignorowany.--log-driver=syslog Domyślnie logi kontenera są zrzucane do pliku JSON (sterownik json-file
), ale można ustawić sterowniksyslog
,journald
, a także np.awslogs
(usługa Amazon CloudWatch) czygcplogs
(usługa Google Cloud Logging). Poleceniedocker logs
jest dostępne tylko dla sterownikówjson-file
ijournald
.--restart=on-failure:3 W razie zakończenia z błędem głównego procesu kontenera restartuj proces – ale max. 3 razy; inne wartości to: no
(domyślna),always
– kontener będzie uruchamiany automatycznie nawet gdy został ręcznie zatrzymany, albo po restarcie serwera Dockera niezależnie od tego czy przed restartem kontener działał,unless-stopped
– jakalways
, ale nie uruchomi kontenera podczas startu demona Dockera, jeśli wcześniej kontener został zatrzymany.
Docker uruchamia ponownie kontener z opóźnieniem, aby zapobiec atakom typu DoS. Opóźnienie to zwiększa – początkowo wynosi ono 100ms, a następnie jego wartość jest przez Dockera podwajana. W efekcie kolejne nieudane próby uruchomienia kontenera będą miały opóźnienia 100, 200, 400, 800ms itd. Jeśli kontener zostanie pomyślnie zrestartowany, opóźnienie jest ponownie przywracane do wartości domyślnej równej 100.
--detach-keys ctrl-a,d Definiuje kombinację klawiszy, za pomocą której można odłączyć się od interaktywnego procesu (np. powłoki) uruchomionego w kontenerze; potem można się podłączyć z powrotem za pomocą docker attach
; domyślna kombinacja klawiszy to Ctrl+P,Ctrl+Q – ale w niektórych dystrybucjach Linuksa może być przechwytywana przez managera okienek - docker update --restart=always -m 300M nazwa_kontenera
- Aktualizacja parametrów działającego kontenera
- docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -it mysql
- ściąga z publicznego repozytorium Docker Hub oficjalny obraz MySQLa i uruchamia kontener; możesz się połączyć z bazą MySQL za pomocą wskazanego hasła
- docker run -d myImage tail -f /dev/nul
- Jeśli polecenia nie działają w trybie pierwszoplanowym, kontener uruchomiony w trybie odłączonym zostanie zatrzymany od razu po starcie. Kontener uruchomiony tak jak w tym przykładzie utrzymuje aktywność głównej powłoki Bash.
- docker rename nazwa_kontenera nowa_nazwa_kontenera
- zmienia nazwę kontenera
- docker inspect nazwa_kontenera
- Informacje o kontenerze w postaci JSONa (kiedy uruchomiono, status, udostępniane porty, adres IP, wolumeny)
- docker port nazwa_kontenera
- Informacje o wystawionych portach kontenera
- docker images
- lista obrazów w lokalnym cache’u
- docker search fraza
- wyszukuje obrazy w Docker Hub – warto w pierwszej kolejności brać pod uwagę obrazy oficjalne
- docker stop -t 25 nazwa_kontenera
- Wysyła sygnał SIGTERM do procesów kontenera, a jeśli to nie wystarczy, to po 25 sekundach dodatkowo SIGKILL; zwykły
docker stop
wysyła po prostu SIGTERM bez względu na to czy to wystarczy - docker stop $(docker ps -q)
- Zatrzymuje wszystkie działające kontenery
- docker kill nazwa_kontenera
- Wysyła sygnał SIGKILL to procesów kontenera
- docker pause nazwa_kontenera
- Wstrzymuje wykonywanie procesów kontenera (do czasu wykonania
docker unpause
) - docker unpause nazwa_kontenera
- Wznawia działanie procesów kontenera
- docker exec -ti nazwa_kontenera /bin/bash
- uruchamia dodatkowy proces w kontenerze. Ponieważ
docker attach
może zablokować terminal, zaleca się, aby uzyskiwać kontrolę nad kontenerem za pomocą takiegodocker exec
jak w przykładzie. - docker cp nazwa_kontenera:ścieżka_źródłowa_hosta ścieżka_docelowa_kontenera
- Kopiuje plik z hosta na kontener (wystarczy odwrócić parametry by kopiować w drugą stronę)
- docker logs nazwa_kontenera
- logi kontenera (STDOUT i STDERR procesu PID=1 w kontenerze). Plik dziennika jest dostępny nawet po zatrzymaniu kontenera, dopóki jego system plików nadal istnieje na dysku. Dane są przechowywane w pliku JSON w katalogu
/var/lib/docker
– kompletna ścieżka będzie w kluczuLogPath
w wyniku poleceniadocker inspect
na kontenerze. - docker logs -f nazwa_kontenera
- j.w., ale działa jak
tail -f
- docker stats nazwa_kontenera
- odświeżane co kilka sekund statystyki zużycia zasobów przez procesy kontenera (odpowiednik polecenia
top
) - docker events
- Strumieniuje na konsoli zdarzenia dotyczące kontenerów, takie jak
create
,destroy
,pause
,start
,stop
,commit
, itp. Opcja-f
pozwala założyć filtr – wyświetlane będą tylko zdarzenia określonego typu. Opcje--since
i--until
pozwalają ustalić z jakiego przedziału czasowego (RFC3339) mają być wyświetlone zdarzenia.
Zawisa w oczekiwaniu na zdarzenia takie jak uruchomienie i zatrzymanie kontenera – na bieżąco wyświetla informacje o każdym takim zdarzeniu - docker diff nazwa_kontenera
- Listuje pliki, które zmieniły się lub zostały dodane względem obrazu z którego uruchomiono kontener
- docker commit nazwa_kontenera nazwa_nowego_obrazu
- „Wypala obraz” na podstawie kontenera – lepiej żeby kontener był zatrzymany aby system plików był w stanie stabilnym
- docker commit nazwa_kontenera host:5000/mojobraz
- Jak wyżej, ale obraz jest przeznaczony do przesłania do firmowego repozytorium; obraz fizycznie przesyłamy tam poleceniem
docker push host:5000/mojobraz
- docker ps
- Pokazuje działające kontenery, w tym m.in. jakie porty wystawia każdy kontener
- docker ps -a
- Pokazuje wszystkie kontenery, w tym zatrzymane (bez działających procesów)
- docker rm $(docker ps -a -q)
- Usuwa wszystkie kontenery na serwerze Dockera
- docker rm $(docker ps -a -q --filter 'exited!=0')
- Usuwa wszystkie kontenery, które zakończyły działanie ze statusem różnym od zera
- docker rm $(docker ps -q -f status=exited)
- Usuwa wszystkie kontenery zatrzymane
- docker rmi nazwa_obrazu
- Usuwa wskazany obraz z lokalnego cache’a
- docker rmi $(docker images -q)
- Usuwa wszystkie obrazy z cache’a na serwerze Dockera
- docker run -e DISPLAY=$DISPLAY -v /dev/shm:/dev/shm -v /tmp/.X11-unix:/tmp/.X11-unix --hostname=$HOSTNAME -v $HOME/.Xauthority:/root/.Xauthority -it ubuntu bash
- Uruchamia kontener z Ubuntu w taki sposób, aby można było zainstalować i uruchomić aplikacje z graficznym interfejsem użytkownika (inna często spotykana opcja to użycie VNC)
- docker history nazwa_obrazu
- lista warstw obrazu, wraz z poleceniami tworzącymi te warstwy; opcja
--no-trunc
spowoduje że treść poleceń nie będzie przycięta - docker rm -fv nazwa_kontnera
- Usuwa kontener wraz z podmontowanym katalogiem w
/var/lib/docker/vfs
; opcja-f
pozwala usunąć kontener który nie jest zatrzymany - docker save nazwa_obrazu > mojobraz.tar
- Zrzucenie obrazu (wielowarstwowego) do pliku archiwum
*.tar
; konwersja z powrotem do obrazu poleceniemdocker load mojobraz.tar
- docker export nazwa_kontenera > kontener.tar
- Konwersja kontenera do obrazu i od razu do archiwum
*.tar
. Taki obraz będzie miał tylko jedną warstwę i nie będzie miał zachowanej historii poleceń tworzących warstwy. Poleceniedocker import kontener.tar
przekształci plik archiwum na (jednowarstwowy) obraz. - docker inspect maria | jq -r '.[0].NetworkSettings.Ports."3306/tcp"[0].HostPort'
- jak wygrzebać port hosta na który został zamapowany port wskazanego kontenera – np. 3306 – tutaj baza MySQL kontenera o nazwie
maria
Wolumeny
- docker volume ls
- Lista wszystkich wolumenów (utworzonych np. poprzez
run -v
)-f dangling=true nie używanych przez żaden kontener -f name=da o nazwie zawierającej dany łańcuch - docker volume inspect nazwa_wolumenu
- Szczegóły wolumenu, w szczególności na jaki katalog hosta jest mapowany
- docker run -it -v ~/.bash_history:/root/.bash_history ubuntu
- Wolumen nie musi być katalogiem, może być plikiem
- docker run -it --volumes-from myUbuntu busybox
- Tworzy nowy kontener i montuje do niego te same kontenery które ma kontener
myUbuntu
. Czasami tworzy się kontener tylko po to, żeby służył jako magazyn wolumenów – nie musi on nawet być uruchomiony, a jedynie utworzony poleceniemdocker create
:
docker create -v ~/docker-nginx/html:/usr/share/nginx/html --name myWebSiteData nginx
- docker volume create --name data
- Tworzy wolumen, ale nie podpina go jeszcze do żadnego kontenera. Potem można go podpiąć np. tak:
docker run -it -v data:/data ubuntu
- docker volume rm nazwa_wolumenu
- Usuwa wolumen. Domyślnie polecenie
docker rm
usuwa kontener, ale nie jego wolumeny (wolumeny pozostaną osierocone) – aby usunąć kontener z wolumenami trzeba użyćdocker rm -v
. - docker volume rm $(docker volume ls -qf dangling=true)
- Usuwa wszystkie osierocone wolumeny
Sieci
- docker network ls
- lista dostępnych sieci; domyślnie dostępne są trzy:
bridge
,host
inone
- docker network inspect nazwa_sieci
- informacje o sieci i wchodzących w jej skład kontenerach
- docker network create nazwa_sieci
- Tworzy nową niestandardową sieć. Intencją jest segregacja kontenerów tak, aby jedynymi usługami w sieci były te, które muszą się ze sobą komunikować.
- docker run -it --net=nazwa_sieci ubuntu
- Uruchamia kontener z obrazu
ubuntu
i dodaje go do wskazanej sieci; jeden kontener może należeć do wielu takich sieci. Kontenery należące do tej samej sieci niestandardowej (patrz poprzednie polecenie) mogą się komunikować z użyciem nazw domenowych będących nazwami kontenerów. (Aby kontenery się widziały tak w domyślnej sieci z mostem, muszą być połączone za pomocą opcji--link
poleceniadocker run
– patrz następne polecenie). - docker run --name franek --link aleksandra:ola -it busybox
- Uruchamia kontener o nazwie „franek” oparty na obrazie
busybox
i łączy go z utworzonym wcześniej kontenerem o nazwie „aleksandra”. W nowo utworzonym kontenerze w pliku/etc/hosts
wpis „ola” będzie wskazywał na IP kontenera „aleksandra”. Warto też ustawić jakieś zmienne środowiskowe dla „aleksandry” i zobaczyć jak są one widoczne wśród zmiennych środowiskowych „franka”. Takie łączenie kontenerów jest już przestarzałe – lepiej użyć własnej sieci (patrzdocker network create
i podobne) - docker run -it --net=host ubuntu
- Uruchamia kontener z obrazu
ubuntu
i dodaje go do sieci hosta. Nie przydziela kontenerowi własnego stosu sieciowego, czyli kontener będzie korzystał ze stosu sieciowego hosta (sieć będzie działać nawet dwukrotnie szybciej). Dostęp do kontenera odbywa się za pośrednictwem IP hosta – nie ma potrzeby mapować portów, są one widoczne tak jakby były otwarte na komputerze hosta. - docker network disconnect nazwa_sieci nazwa_kontenera
- Odłącza kontener od wskazanej sieci
Tryb swarm (Docker 1.12+)
Tryb roju pozwala połączyć kilka hostów z Dockerem (wierzchołków, ang. nodes) w klaster zarządzany podobnie jak pojedynczy host z Dockerem. Wszystkie wierzchołki roju muszą mieć otwarte porty:
- 2377 TCP – na potrzeby komunikacji związanej z zarządzaniem „rojem”,
- 7946 TCP i UDP – w celu umożliwienia węzłom komunikacji,
- 4789 TCP i UDP – na potrzeby ruchu w sieci overlay, czyli komunikacji pomiędzy kontenerami
- docker swarm init
- Włącza tryb roju i czyni bieżącego hosta menedżerem roju; na wyjściu wypisywane jest polecenie dołączające kolejny host do klastra
- docker swarm join --token token ip:port
- dołącza host do klastra – patrz poprzednie polecenie; polecenie
docker info
wyświetla informacje o bieżącym stanie roju - docker node ls
- wyświetla szczegółową listę węzłów roju: nazwa hosta, status dostępności, status menedżera
- docker network create --driver overlay mynet
- Tworzy sieć nakładkową (ang. overlay) do komunikacji kontenerów w obrębie roju
- docker service create --replicas 3 -p 80:80 --name nginx nginx
- Uruchamia kontener jako usługę w trybie Swarm
- docker service scale nginx=5
- Skalowanie usługi (liczby kontenerów danej usługi)
Inne podpolecenia docker swarm
to m.in.:
- service inspect
- szczegóły usługi
- service ls
- lista działających usług
- service rm
- usuwanie usługi
- service ps
- lista zadań usługi (polecenia uruchomione dla kontenera)
- service update
aktualizacja środowiska usługi, np. ograniczenia pamięci czy procesora, zmienne środowiskowe itp.
Rejestry, repozytoria, obrazy
Rejestr (np. Docker Hub) zawiera repozytoria – po jednym dla każdej usługi. Repozytorium zawiera różne wersje obrazów jednej usługi.
Pełny, kwalifikowany identyfikator obrazu ma postać:
adres_rejestru/przestrzeń_nazw/nazwa_repozytorium:znacznik
gdzie:
- adres_rejestru ma postać host:port i można go pominąć gdy chodzi nam o Docker Hub,
- przestrzeń_nazw to nazwa użytkownika w rejestrze, można pominąć w przypadku gdy chodzi nam o oficjalne repozytorium w Docker Hub,
- nazwa_repozytorium to inaczej nazwa obrazu,
- domyślny znacznik to
latest
, co oznacza ostatnio zbudowany obraz (niekoniecznie musi być to to samo co najnowsza wersja usługi)
Przykłady identyfikatorów obrazu:
- jakis-rejestr.com/jakis-oficjalny-obraz:1.0
- dla oficjalnego obrazu nie trzeba podawać nazwy użytkownika (przestrzeni nazw)
- scotttigersa/gauth:1.0
- obraz o nazwie
gauth
z tagiem1.0
, w rejestrze Docker Hub, użytkownikscotttigersa
- ubuntu
- oficjalny obraz na Docker Hub, tag
latest
Polecenia związane z rejestrami:
- docker login --username dockerId --password hasło
- Loguje się do publicznego rejestru Docker Hub; sesja zostanie zapisana w
~/.docker/config.json
, więc logowanie wystarczy wykonać tylko raz. Aby zalogować się do rejestru innego niż Docker Hub wystarczy na końcu polecenia dodać namiary na inny rejestr, np.localhost:8080
- docker logout
- Usuwa sesję z pliku
~/.docker/config.json
. - docker pull jakisRejestr.com/jakisOficjalnyObraz:1.0
- ściągnięcie obrazu do lokalnego cache’a; stan cache’a sprawdzamy poleceniem
docker images
- docker build --no-cache -t identyfikator_nowego_obrazu .
- Tworzy nowy obraz na podstawie pliku
Dockerfile
w katalogu bieżącym (katalog budowania, kontekst budowania)- Opcja
--no-cache
gwarantuje nie korzystanie z cache’a warstw obrazu. - Zamiast katalogu można podać URL projektu Git
- Proces budowania uruchamiany jest przez demona Dockera, dlatego całe drzewo katalogu budowania zostanie wysłany do demona. Jeśli nie chcesz aby pewne pliki/katalogi kontekstu budowania były wysyłane do demona, umieść w katalogu budowania plik
.dockerignore
, którego składnia jest analogiczna do.gitignore
, np.:*/tmp* */*/tmp* **/*.log tmp? !important.log
- Opcja
- docker tag mojwitajswiecie:test mojerepo/mojwitajswiecie:wersja1.0.test
- nadanie obrazowi podanemu jako pierwszy parametr dodatkowego identyfikatora określonego przez drugi parametr. Polecenie
docker images
pokaże obydwa identyfikatory w osobnych wierszach. Tak oznaczony obraz nadaje się do umieszczenia w zdalnym repozytorium. Poleceniedocker rmi
tak naprawdę usuwa sam obraz gdy usuniesz jego ostatni identyfikator. - docker push mojerepo/mojwitajswiecie:wersja1.0.test
- Wysyła obraz do repozytorium. Tutaj rejestrem jest DockerHub, użytkownik to
mojerepo
Dockerfile
- FROM identyfikator_obrazu
- Obraz, który ma być podstawą
- MAINTAINER dane_autora
- Imię i nazwisko, kontakt (np. email)
- COPY ścieżka_od ścieżka_do
- Proste kopiowanie plików.
- ścieżka_od jest względem katalogu budowania,
- ścieżka_do jest względem WORKDIR, albo bezwzględna.
- Właścicielem plików docelowych będzie root, uprawnienia zostaną takie same jak ścieżka_od.
- Katalog docelowy jest tworzony automatycznie jeśli nie istnieje.
- Ma znaczenie czy na końcu ścieżek jest znak ‚/’ (np. jego obecność w ścieżka_od oznacza że chodzi o zawartość katalogu).
- ADD ścieżka_od ścieżka_do
- Działa jak COPY, ale jest rozszerzona interpretacja parametru ścieżka_od:
- Można używać symboli wieloznacznych znanych z basha (‚*’ i ‚?’).
- Gdy plik źródłowy jest plikiem archiwum to zostanie automatycznie rozpakowany w katalogu docelowym.
- Jeśli parametr będzie URLem, to zostanie on pobrany z Internetu (nie będzie rozpakowywany w przypadku archiwum) i umieszczony w miejscu docelowym z uprawnieniami 0600.
- Jeśli suma kontrolna zawartości wszystkich kopiowanych plików nie zmieniła się, wykorzystana zostanie warstwa zbuforowana. Jeśli się zmieniła, bufor jest czyszczony (ang. cache busting) i w szczególności wszystkie dalsze instrukcje RUN na pewno nie będą korzystały z bufora.
- CMD …
-
Tutaj umieszczamy polecenie wykonywane przy starcie kontenera, o ile nie nadpiszemy go innym poleceniem w
docker run
. Znaczenie ma tylko ostatnia instrukcja CMD w Dockerfile.- CMD ["plik wykonywalny", "parametr1", "parametr2" …]
- Postać klasyczna
- CMD ["parametr1", "parametr2" …]
- Gdy polecenie jest określone przez ENTRYPOINT
- CMD polecenie parametr1 parametr2 …
- Wykonywane przy użyciu
/bin/sh -c
, przetwarza zmienne środowiskowe w parametrach. Ta forma nie jest polecana, ponieważ wymaga aby w obrazie był zawartysh
, a poza tym poleceniedocker stop
wysyła SIGTERM do procesu o PID=1, a to nie będzie proces polecenia tylko shella.
- ENTRYPOINT …
- Polecenie wykonywane przy starcie kontenera. Uruchamianie kontenera wygląda wtedy jak wywołanie pliku wykonywalnego.
- Jeśli zdefiniowane, to ewentualne CMD i zwykłe parametry
docker run
nie mogą tego polecenia nadpisać, a jedynie dodać parametry. - Aby zmienić polecenie wykonywane przy starcie kontenera, trzeba użyć
docker run --entrypoint nowe_polecenie
. - Znaczenie ma tylko ostatnia instrukcja ENTRYPOINT w Dockerfile.
- ENTRYPOINT ["plik wykonywalny", "parametr1", "parametr2" …]
- Postać klasyczna
- ENTRYPOINT polecenie parametr1 parametr2 …
- Wykonywane przy użyciu
/bin/sh -c
, przetwarza zmienne środowiskowe w parametrach. Przy takiej składni nie da się dodać parametrów wykonania polecenia wdocker run
ani w CMD. Ta forma nie jest polecana, ponieważ wymaga aby w obrazie był zawartysh
, a poza tym poleceniedocker stop
wysyła SIGTERM do procesu o PID=1, a to nie będzie proces polecenia tylko shella.
- Jeśli zdefiniowane, to ewentualne CMD i zwykłe parametry
- LABEL pl.com.tiger.key1="wartość1" pl.com.tiger.key2="wartość2" …
- Przypisuje etykiety klucz/wartość do obrazu. Można je odczytać z wyniku polecenia
docker inspect
na obrazie. - ENV PATH="/var/lib/tomcat8/bin:$PATH" MOJA_ZMIENNA="wartość"
- Ustawia zmienne środowiskowe.
- Można je odczytać w wyniku polecenia
docker inspect
na obrazie. - Ustawienie zmiennej PATH pozwala w CMD nie podawać pełnej ścieżki polecenia do wykonania, a jedynie samo polecenie.
- Opcja
--env
(lub-e
) wdocker run
dodaje lub nadpisuje zmienne środowiskowe zdefiniowane w obrazie.
- Można je odczytać w wyniku polecenia
- EXPOSE numer_portu
- Otwiera port na przychodzący ruch sieciowy z innych kontenerów.
- Nie udostępnia automatycznie portu hostowi (potrzebna opcja
-p
lub-P
wdocker run
). - W
docker run
można nadpisać EXPOSE używając opcji--expose
.
- Nie udostępnia automatycznie portu hostowi (potrzebna opcja
- RUN polecenie parametr1 parametr2… && polecenie2…
- Polecenie shella wykonywane podczas budowania obrazu.
- Generuje nową warstwę obrazu. Dlatego zamiast pisać kilka kolejnych instrukcji RUN lepiej użyć jednego RUN i oddzielić polecenia operatorem
&&
. - Jeśli treść instrukcji RUN nie zmieni się między dwoma procesami budowania obrazu, Docker ponownie wykorzysta istniejącą warstwę w buforze. To jest niebezpieczne, gdy instrukcja to np.
svn checkout
– warto wtedy wyczyścić bufor przed budowaniem obrazu. Patrz także uwagi do instrukcji ADD oraz opcjadocker build --no-cache
.
- Generuje nową warstwę obrazu. Dlatego zamiast pisać kilka kolejnych instrukcji RUN lepiej użyć jednego RUN i oddzielić polecenia operatorem
- USER login
- Odpowiednik
sudo su - login
podczas budowania obrazu - VOLUME ["/var/lib/tomcat8/webapps/"]
- Definiuje wolumen, ale nie pozwala wskazać odpowiadającego mu katalogu hosta
- WORKDIR katalog
- Odpowiednik
cd katalog
podczas budowania obrazu - ARG nazwa=wartość
- Definiuje parametr budowania obrazu i (opcjonalnie) nadaje mu wartość domyślną.
- Zmienne zdefiniowane za pomocą instrukcji ARG i ENV mogą być używane w instrukcjach RUN (gdy jest konflikt nazw ARG i ENV, wygrywa ENV).
- Wartość parametru można zdefiniować za pomocą
docker build --build-arg nazwa=wartość
. - Nie zaleca się w pliku Dockerfile definiować wartości domyślnych będących danymi uwierzytelniającymi, bo będą one widoczne w wynikach polecenia
docker history
dla obrazu
- ONBUILD INSTRUKCJA_DOCKERFILE
- Określa dodatkowe instrukcje Dockerfile, które będą wyzwalane gdy nasz obraz zostanie wykorzystany jako podstawa (FROM) dla innego obrazu.
- INSTRUKCJA_DOCKERFILE będzie wykonywana bezpośrednio po FROM obrazu-dziecka i nie jest dziedziczona przez dalsze obrazy-potomki.
- Wyzwalane instrukcje dla obrazu-dziecka są pokazywane w wynikach polecenia
docker inspect
wywołanym na obrazie rodzica
- STOPSIGNAL SIGKILL
- Określa jaki sygnał powinien zostać wysłany do kontenera w celu zakończenia działania kontenera
- HEALTHCHECK --interval=5m --timeout=2s --retries=3 CMD curl -f http://localhost/ || exit 1
- Określa jak ma być testowany kontener w celu sprawdzenia, czy nadal działa.
- Sprawdzenie stanu kontenera następuje co interval. Do czasu pierwszego testu status kontenera to
starting
. W razie powodzenia status jesthealthy
. W razie retries niepowodzeń status jest ustawiany naunhealthy
. Gdy test nie zakończy się w czasie timeout, uznaje się że zakończył się niepowodzeniem. - CMD ma zwracać 0 gdy kontener działa, każda inna wartość oznacza niepowodzenie testu.
docker ps
pokazuje status każdego kontenera.- Znaczenie ma tylko ostatnia instrukcja HEALTHCHECK w Dockerfile.
- Sprawdzenie stanu kontenera następuje co interval. Do czasu pierwszego testu status kontenera to
- SHELL ["/bin/bash", "-c"]
- Shell dla poleceń RUN i CMD (domyślnie
/bin/sh -c
).
Przydatne linki
- Docker Hub
- Rejestr publicznych obrazów Dockera
- The Docker Store
- Inny (nowszy) rejestr
- Awesome Docker
- Lista użytecznych linków związanych z nauką Dockera. Warto sklonować sobie ten projekt GitHuba aby w przyszłości dokonywać aktualizacji i ustalać co się zmieniło aby być na bieżąco z tematem.