Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

Docker

Instalacja

Docker jest dostępny jako pakiet w każdej dystrybucji Linuksa, choć zwykle w niezbyt świeżej wersji. Jak zainstalować najnowszą wersję można się dowiedzieć z dokumentacji. Aby nie trzeba było wykonywać poleceń Dockera z konta administratora, dodaj swoje własne konto użytkownika do grupy docker (trzeba potem zrestartować usługę Dockera i przelogować się, czyli np. zrestartować maszynę).

Przydatne 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.)
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ć)
-p 8080:80/tcp Mapuje port 80 kontenera na port 8080 hosta (sufiks /tcp jest domyślny i można pominąć)
-p 80 Mapuje port 80 kontenera na jakiś wolny port hosta (docker inspect na kontenerze pozwala ustalić port docelowy)
-e NAZWA="Wartość" Przekazuje zmienną środowiskową do kontenera
--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; 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
--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) i always
--net=host Nie przydziela kontenerowi własnego stosu sieciowego, czyli kontener będzie korzystał ze stosu sieciowego hosta (sieć będzie działać nawet dwukrotnie szybciej)
--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 inspect nazwa_kontenera
Informacje o kontenerze w postaci JSONa (kiedy uruchomiono, status, udostępniane porty, adres IP)
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 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
docker logs nazwa_kontenera
logi kontenera (STDOUT i STDERR procesów chodzących w 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
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 -a
Pokazuje wszystkie kontenery, w tym zatrzymane (bez działających procesów)
docker ps
Pokazuje działające kontenery
docker rm $(docker ps -a -q)
Usuwa wszystkie kontenery na serwerze Dockera
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 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 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 build --no-cache=true -t nazwa_nowego_obrazu .
Tworzy nowy obraz na podstawie pliku Dockerfile w katalogu bieżącym; opcja --no-cache gwarantuje nie korzystanie z cache’a warstw obrazu
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 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”.
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ę. 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
Share and Enjoy:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Blip
  • Blogger.com
  • Gadu-Gadu Live
  • LinkedIn
  • MySpace
  • Wykop