poniedziałek, 30 września 2019

Docker - wersja, kontener, obraz

Docker różni się od tradycyjnej wirtualizacji (VirualBox, VMware, Hyper-V itp. ) tym, że umożliwia uruchomienie aplikacji w wydzielonym kontenerze bez konieczności tworzenia maszyny wirtualnej. Wiadomo, że każda maszyna wirtualna musi mieć zainstalowany system operacyjny oraz zarezerwowane określone zasoby systemowe zgodnie z minimalnymi wymaganiami systemowymi. W dalszej części znajdzie się parę informacji na temat używania narzędzia Docker. Zakladamy, że instalację narzędzia Docker mamy już za sobą.

Informację o wersji


Do uzyskania informacji o wersji Docker-a oraz jego komponentów służą następujące komendy:
docker –version
docker-compose --version
docker-machine –version
docker version
docker info

Obrazy i kontenery


Pracując z narzędziem Docker należy wiedzieć czym jest obraz i kontener. Dla mnie najbardziej obrazujące jest porównanie obrazu do klasy a kontenera do instancji tej klasy. Obrazu jest niemodyfikowalny i na jego podstawie tworzymy kontener który możemy dowolnie modyfikować. Co więcej ze zmodyfikowanego kontenera możemy utworzyć nową klasę lub jej inną wersję która to z kolei staje się niemodyfikowalna i stanowi podstawę tworzenia kontenerów.

Kontenery


 Aby odpalić prosty kontener na podstawie obrazu ubuntu w wersji 16.04 wykonujemy następujące polecenie:
docker run -i -t ubuntu:16.04 /bin/bash

Jeżeli nie mamy jeszcze pobranego obrazu ubuntu w wersji 16.04 zostanie on pobrany. Następnie zobaczymy wiersz zachęty naszego kontenera z systemem ubuntu w wersji 16.04. Możemy oczywiście wyświetlić zawartość lsb-release aby się upewnić, co do wersji naszego ubuntu.
root@1e7d15de5a0f:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
 Ogólnie składnia polecenia docker run jest następująca:
docker run [opcje] obraz[:tag] [polecenia]

Kilka z opcji:
  • -i - sprawia, że kontener zostanie uruchomiony w trybie interaktywnym, co znaczy, że przechwytuje on standardowe wejście kontenera STDIN
  • -t - alokuje emulator terminala następnie przypisuje go do kontenera
  • --rm – automatycznie usuwa kontener przy wyjściu
  • -d – uruchomienie kontenera w trybie odłączonym
  • --name="jakas_nazwa" - nazwa za pomocą której możemy się odwoływać do kontenera. Jeżeli nie podamy tej nazwy wówczas wygenerowana zostanie losowa nazwa.


Na pierwszy rzut oka połączenie opcji –itd wydaję się nielogiczne, ponieważ to wybranie zarówno trybu interaktywnego jak i odłączonego. Ale uruchomienie kontenera tylko z opcją –d spowoduje wyłączenie kontenera zaraz po wykonaniu polecenia. Jeżeli użyjemy –itd kontener będzie odłączony, ale będzie działał w tle.

polecenie – jest to opcjonalny parametr, ponieważ osoba tworząca obraz mogła dostarczyć domyślne polecenie używając instrukcji CMD w pliku Dockerfile. Uruchamiając obraz można nadpisać tą instrukcję CMD za pomocą polecenia.

Odłączanie kontenera


Jeżeli widzimy linię zachęty naszego kontenera a chcemy wrócić do linii poleceń Docker-a nie wyłączając kontenera to musimy odłączyć kontener. Aby to zrobić należy użyć sekwencji klawiszy Ctrl+P i Ctrl+Q. Czyli najpierw wciskamy Ctrl+P i od razu Ctrl+Q. Czasami nie jest to łatwe przynajmniej pod Windows. Trzeba dojść do wprawy. Mój sposób polega na tym, że wciskam Ctrl po czym szybko naciskam P potem Q.

Listowanie kontenerów


Do wylistowania aktywnych kontenerów służy polecenie:
docker ps
Aby wylistować wszystkie kontenery łącznie z nieaktywnymi używamy polecenia:
docker ps -a 
Załóżmy, że odpalamy dwa kontenery, przy czym jeden z parametrem name:
docker run -i -t -d ubuntu:16.04 /bin/bash
docker run -i -t -d --name="maszynaTest" ubuntu:16.04 /bin/bash
Następnie listujemy aktywne kontenery za pomocą polecenia docker ps i otrzymujemy następujące wyniki:
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED
STATUS              PORTS               NAMES
8526e765becb        ubuntu:16.04        "/bin/bash"         2 minutes ago
Up 2 minutes                            maszynaTest
c423cfebf41a        ubuntu:16.04        "/bin/bash"         2 minutes ago
Up 2 minutes                            adoring_sammet
Jak widzimy na powyższym wyniku mamy odpalone dwa kontenery. Odwołując się do kontenerów używamy jego ID lub nazwy. CONTENER ID  to identyfikator kontenera, który składa się z 64 cyfr szesnastkowych. Domyślnie pokazywane jest 12 cyfr. Aby zobaczyć wszystkie cyfry trzeba dodać parametr no-trunc przy wyświetlaniu (docker ps --no-trunc). Jak widzimy, jeżeli nie dodamy podczas odpalania kontenera parametru name Docker wygeneruje nam losową nazwę zlepioną z dwóch słów. W naszym przypadku jeden kontener ma nazwę adoring_sammet i to jest losowo wygenerowana nazwa drugi z kolei ma nazwę maszynaTest, czyli tak jak wpisaliśmy w parametrze name. Oczywiście nazwa musi być unikatowa.



Operacje na kontenerach


Podłączanie do kontenera

Jeżeli mamy aktywny kontener i chcemy się do niego podczepić wówczas wykorzystujemy następujące polecenie :
docker attach [ID kontenera lub nazwa]

Włączanie i wyłączanie kontenera

Aby wyłączyć aktywny kontener używamy polecenia:
docker stop [ID kontenera lub nazwa]
Aby włączyć nieaktywny kontener używamy polecenia:
docker start [ID kontenera lub nazwa]
Do włączenia kontenera możemy również użyć polecenia z parametrem –a:
docker start -a [ID kontenera lub nazwa]
które działa tak, że od razu podpina nas do kontenera czyli wykonają się automatycznie dwa polecenia:
docker start [ID kontenera lub nazwa]
docker attach [ID kontenera lub nazwa]

Pałzowanie kontenera

Aby „zapałzować” i „odpałzować” kontener używamy polecenia:
docker pause [ID kontenera lub nazwa]
docker unpause [ID kontenera lub nazwa]

Różnice kontenera w stosunku do obrazu

Aby sprawdzić, jakie zmiany zostały wprowadzone w kontenerze wykonujemy następujące polecenie:
docker diff [ID kontenera lub nazwa]

Informacje na temat kontenera

Można wyświetlić szczegółowe informację na temat kontenera, które wyświetlają się w formacie JSON. Informację te można oczywiście filtrować. Aby wyświetlić niefiltrowane informację wykonujemy polecenie:
docker inspect [ID kontenera lub nazwa]

Wyświetlanie logów kontenera

Aby wyświetlić logi kontenera wykonujemy następujące polecenie:
docker logs [ID kontenera lub nazwa]

Usuwanie kontenerów

Aby usunąć pojedynczy kontener wykonujemy polecenie:
docker rm [ID kontenera lub nazwa]
Aby usunąć wszystkie nieaktywne kontenery możemy wykonać jedno z dwóch poleceń:
docker rm $(docker ps -aq -f state=exited)
lub
docker container prune
Aby usunąć wszystkie kontenery łącznie z aktywnymi należy wykonać polecenie:
docker rm -f $(docker ps -aq)

Obrazy


Docker Hub to domyślne publiczne repozytorium obrazów. Stąd pobierane są obrazy o ile nie wpiszemy jawnie adresu innego repozytorium. Docker Hub umożliwia również wgrywanie obrazów przez niezależnych programistów. Obrazy takie są oznaczane identyfikatorem użytkownika przed nazwą obrazu.

Pobieranie obrazów

Aby pobrać obraz należy wykonać jedno z następujących poleceń:
docker pull busybox
docker pull busybox:1.15
docker pull nazwa-tworcy/nazwa_obrazu
docker pull inne_repozytorium.com/nazwa_obrazu

Pierwsze polecenie pobiera obraz o nazwie busybox. Nie określiliśmy jego wersji, więc zostanie pobrana wersja ostatnia. Drugie polecenie również pobiera obraz busybox, ale już w określonej wersji 1.15. Trzecie polecenie dotyczy pobrania obrazu, który nie jest oficjalny i został dodany przez użytkownika, dlatego jest poprzedzony nazwą twórcy. Trzecie polecenie pobiera obraz z innego niż oficjalne repozytorium.

Wyszukiwanie obrazów

Wiemy już jak pobierać obrazy, ale musimy jeszcze wiedzieć jak je wyszukać. Interesujące nas obrazy możemy przeszukiwać na stronie https://hub.docker.com/explore/ lub możemy wykorzystać do tego celu następujące polecenie:
docker search php

W wynikach mamy informację czy dany obraz jest oficjalnym obrazem oraz mamy informację o ilości gwiazdek przyznanych każdemu obrazowi. Jeżeli szukamy na stronie wówczas mamy dodatkowo informację o ilości pobrań oraz możemy zobaczyć dodatkowe informację na temat obrazu w tym jego wersji.

Listowanie pobranych obrazów

Aby zobaczyć listę pobranych obrazów wykonujemy jedno z następujących poleceń:
docker images
docker image ls

W moim przypadku wynik był następujący:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED
SIZE
busybox latest e1ddd7948a1c 7 weeks ago
1.16MB
busybox 1.25 e02e811dd08f 23 months ago
1.09MB

Jak widzimy na wyniku pokazuje się nam nazwa obrazu jego wersja(TAG) oraz ID obrazu. Analogicznie jak przy kontenerach ID domyślnie pokazuje 12 cyfr. Aby zobaczyć wszystkie 64 należy dodać do poleceń listujących parametr --no-trunc. Widzimy również rozmiar obrazy i czas który upłynął od jego utworzenia.

Usuwanie pobranych obrazów

Aby usunąć obraz wykonujemy następujące polecenie:
docker rmi [nazwa_obrazu[:tag] lub ID obrazu]

Biorąc pod uwagę powyższy wynik listowania obrazów dwa poniższe polecenia usuwają ten sam obraz:
docker rmi busybox:1.25
docker rmi e02e811dd08f

Tworzenie nowego obrazu

Nowy obraz możemy stworzyć na jeden z dwóch sposobów. Pierwszy sposób polega na tym, że zapisujemy nasz istniejący kontener jako nowy obraz. Drugi sposób polega na stworzenie pliku Dockerfile o określonej składni i poleceniach na podstawie którego tworzony jest nowy obraz.

Jeżeli stworzyliśmy kontener i skonfigurowaliśmy go w określony sposób i chcemy, aby powstał z niego obraz wówczas wystarczy wykonać następujące polecenie:
docker commit [ID kontenera lub nazwa] nazwa_nowego_obrazu
nazwa_nowego_obrazu może być dowolną nazwą, ale najlepiej trzymać się konwencji z ukośnikiem przykładowo moje/test1 wówczas łatwo będzie odróżnić ten obraz od innych. Warto tutaj pamiętać, że możemy sprawdzić, jakie zmiany zostały wykonane w stosunku do bazowego obrazu kontenera za pomocą docker diff [ID kontenera lub nazwa] – opisano powyżej przy kontenerach.

Tworzenie obrazu na podstawie pliku zaczynamy od stworzeniu pliku o nazwie Dockerfile w którym używamy określonych poleceń. Poniżej znajduje się przykładowy plik Dockerfile:

FROM buntu:16:04
RUN apt-get update &&
    apt-get install –y apache2 &&
    apt-get clean
ENV APACHE_LOG_DIR /var/log/apache2
ENTRYPOINT [”/usr/sbin/apache2ctl”, ‘-D’, ”FOREGROUND”]
Następnie mając już plik Dockerfile wykonujemy następujące polecenie:
docker build [ścieżka_do_folderu] -t nazwa_nowego_obrazu[:wersja]
Jako pierwszy parametr docker build podajemy ścieżkę do folderu w którym jest nasz plik o nazwie Dockerfile. Parametr –t określa oczywiście nazwę obrazu pod jaką będzie widoczny nasz obraz i ewentualnie wersję.

Poniżej zamieszczono kilka najważniejszych poleceń używanych w pliku Dockerfile:
  • FROM <obraz>[:wersja] – najważniejszy parametr umieszczamy jako pierwszy określa bazowy obraz
  • MAINTANER <szczegóły autora> informacja o autorze
  • COPY <źródło> <cel> - kopiowanie z hosta pliku lub folderów do nowego obrazu
  • ADD <źródło> <cel> - podobne do copy ale obsługuje pliki TAR i zdalne adresy URL
  • ENV <klucz> <wartość> - definiowanie zmiennej środowiskowej w nowym obrazie
  • ARG <klucz> <wartość> - przekazanie zmiennych które mogą być użyte podczas budowania obrazu. Zmienne w pliku Dockerfile mogą mieć domyślne wartości ale używając flagi –build-arg można je nadpisać
  • VOLUME <punkt_uruchamiania> - definiowanie wolumenów
  • EXPOSE <port[/protokół]> - otwarcie portu kontenera. Można podawać kilka po sobie. Aby zadziałao trzeba dodac do docker run parametr -P
  • RUN <polecenie> - jedno z najważniejszych poleceń umożliwia wykonanie poleceń podczas budowania obrazu.
  • CMD <polecenie> - podobne do RUN tylko wykonuje się podczas tworzenia kontenera i może być napisane za pomocą argumentów polecenia docker run
  • ENTRYPOINT <polecenie> - podobne do CMD ale nie może być napisane. Jeżeli w pliku jest więcej niż jedno wystąpienie to użyte zostanie ostatnie



Wgrywanie obrazu do publicznego repozytorium


Jeżeli już stworzyliśmy nasz obraz i chcemy go wgrać do publicznego repozytorium tak aby też inni mogli z niego korzystać w tym my będąc na innych stacjach musimy się najpierw zalogować wpisując polecenie:
docker login
Zostaniemy zapytani o login i hasło do Docker Hub. Następnie aby wgrać obraz wpisujemy polecenie:
docker push hublogin/nazwa obrazu
po wykonaniu nasz obraz będzie ogólno dostępny w publicznym repozytorium.


Warto jeszcze wspomnieć, że cały proces tworzenia obrazów można zautomatyzować poprzez połączenia Docker Hub z kontem na GitHub lub Bitbucket na które wrzucamy Dockerfile. Dokcer Hub automatycznie na ich podstawie generuje obrazy.

Używanie narzędzia docker-composer


W tym miejscu jedynie wspomnimy o narzędziu docker-composer. Narzędzie docker-composer przeznaczone jest do obsługi grup kontenerów Dockera. Narzędzie docker-composer umożliwia pobieranie i budowanie obrazów, czuwa nad właściwą kolejnością uruchamiania kontenerów oraz ich połączeniami i wolumenami. Wszelkie informacje potrzebne do opisanego działania zapisywane są w pliku docker-composer.yml w języki YAML.

Brak komentarzy:

Prześlij komentarz