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 psAby wylistować wszystkie kontenery łącznie z nieaktywnymi używamy polecenia:
docker ps -aZałóż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 pruneAby 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 obrazupo 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