Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

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 procesu bash) 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_portunr_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 jest rw)
-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ów tmpfs 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, to max-file będzie ignorowany.
--log-driver=syslog Domyślnie logi kontenera są zrzucane do pliku JSON (sterownik json-file), ale można ustawić sterownik syslog, journald, a także np. awslogs (usługa Amazon CloudWatch) czy gcplogs (usługa Google Cloud Logging). Polecenie docker logs jest dostępne tylko dla sterowników json-file i journald.
--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 – jak always, 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ą takiego docker 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 kluczu LogPath w wyniku polecenia docker 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 poleceniem docker 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. Polecenie docker 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 poleceniem docker 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 i none
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 polecenia docker 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 (patrz docker 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 tagiem 1.0, w rejestrze Docker Hub, użytkownik scotttigersa
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
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. Polecenie docker 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ł zawarty sh, a poza tym polecenie docker 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 w docker run ani w CMD. Ta forma nie jest polecana, ponieważ wymaga aby w obrazie był zawarty sh, a poza tym polecenie docker stop wysyła SIGTERM do procesu o PID=1, a to nie będzie proces polecenia tylko shella.
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) w docker run dodaje lub nadpisuje zmienne środowiskowe zdefiniowane w obrazie.
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 w docker run).
  • W docker run można nadpisać EXPOSE używając opcji --expose.
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 opcja docker build --no-cache.
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 jest healthy. W razie retries niepowodzeń status jest ustawiany na unhealthy. 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.
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.
Share and Enjoy:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Blip
  • Blogger.com
  • Gadu-Gadu Live
  • LinkedIn
  • MySpace
  • Wykop