Wybierz region
pl
  • PL
  • EN
Wydrukuj

Docker – stawianie kontenera aplikacji

Ten wpis będzie poświęcony budowaniu kontenera aplikacji przy użyciu Dockera w środowisku Linux.

Przy użyciu Dockera możemy uruchomić aplikację w odizolowanym środowisku zwanym kontenerem.  Pozwala to na uruchomienie wielu kontenerów na danym hoście, które są lekkie i nie pożerają wielu zasobów. Dzieje się tak, ponieważ nie mają nad sobą hipernadzorcy. Daje to dodatkowe zasoby, które możemy wykorzystać na uruchomienie kolejnych kontenerów. Zanim jednak kontener zostanie uruchomiony musi zostać zbudowany- do tego potrzebny będzie obraz. Docker buduje obraz czytając polecenia z pliku Dockerfile:

Poniżej opis zawartości: FROM- Definiuje na jakim obrazie będzie bazował nasz zbudowany obraz, np. w powyższym przykładzie obraz będzie bazował na obrazie systemu centos:7, co oznacza, że wszelkie dodatkowe zależności muszą być dodane do kontenera w formie kolejnych warstw. Każda kolejna operacja dodaje poszczególne zależności, gdyż zaczynamy z całkiem „surowym” obrazem.

LABEL- Dodaje metadane do obrazu. Może być to jakakolwiek informacja na temat aplikacji/obrazu, np. numer wersji czy imię autora.

RUN- To polecenie wykonuje daną komendę na poziomie budowania obrazu. Polecenie RUN ma dwie formy:

RUN polecenie

RUN ["polecenie", "parametr1", "parametr2"]

Jeśli Wykonujemy po sobie kilka komend RUN, każde kolejne polecenie będzie wykonane zawierając efekty poprzednich, dokładając kolejne warstwy, np:

RUN mkdir /opt/nowy_katalog

RUN mv /home/user/plik.sh /opt/nowy_katalog && chown user:group /opt/nowy_katalog/plik.sh

COPY- Polecenie to kopiuje katalogi z określonej lokalizacji maszyny źródłowej i dodaje je do wyznaczonej ścieżki docelowej w kontenerze. Przykład na zrzucie powyżej.

ENTRYPOINT –  W dużym uproszczeniu komenda ENTRYPOINT pozwala na uruchomienie kontenera w trybie wykonywalnym, tj. zdefiniowany skrypt będzie wykonany przy starcie kontenera.

ENTRYPOINT [„polecenie”, „parametr1”, „parametr2”] 
BUDOWANIE KONTENERA

Gdy już posiadamy gotowy plik Dockerfile możemy zbudować obraz, który posłuży do uruchomienia kontenera. Budowanie kontenera odbywa się poprzez:

docker build [sciezka_do_dockerfile]
Budując obraz warto skorzystać z opcji –no-cache i –force-rm

docker build –no-cache –force-rm –tag=[tag_obrazu] ./
Udany build zakończy się komunikatem:

Successfully built 195fc8821ff7
Wartość „ 195fc8821ff7” to ID obrazu. Możemy go podejrzeć przez:

docker image ls
Wynikiem tego polecenia będzie lista zbudowanych obrazów:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

test 1.0 195fc8821ff7 16 minutes ago 2.03 GB

Jeśli podczas budowania pojawią się problemy, budowanie przerwie się i wyświetlony zostanie log błędu. W przypadku potrzeby usunięcia obrazu używamy polecenia:

Docker image rm [id_obrazu]
Usunięcie obrazu może okazać się nieudane jeśli jest on używany przez kontener.

Posiadając gotowy obraz możemy przejść do uruchomienia kontenera. W zależności od potrzeb możemy uruchomić kontener jako daemon bądź otworzyć cli kontenera od razu po starcie.

Uruchomienie kontenera w trybie daemon z wystawieniem kontenera na porcie 8080 hosta:

docker run -it -d -p 8080:80 –name=[nazwa_kontenera] tag
Przykład:

docker run -it -d –name=test test:1.0 
-i – tryb interaktywny

t – pseudo TTY

-d – uruchomienie kontenera w trybie daemon

-p –Port- w powyższym przykładzie ruch przekazywany jest z portu kontenera do portu hosta. Wykorzystanie opcji -p czyli –publish powinno nastąpić kiedy chcemy umożliwić połączenie z kontenerem spoza hosta.

--name – nazwa kontenera

/bin/sh – uruchamia sesję bash po starcie kontenera

Po uruchomieniu kontenera w trybie daemon konsola wypisze jego id i zostanie on uruchomiony w tle. W zależności od tego czy uruchomienie się udało czy nie, output z polecenia docker container ls będzie różny. Powyższa komenda wyświetla wszystkie działające kontenery, jeśli jakiś został zbudowany, lecz przestał działać możemy go podejrzeć dodając argument -a

Docker container ls -a.
Uruchomienie kontenera z otwarciem konsoli cli po starcie:

docker run -it -p 8080:80 –name=[nazwa_kontenera] tag /bin/sh
Na końcu polecenia uruchamiam sesję bash przez /bin/bash od razu po starcie kontenera.

Aby zakończyć sesję bash należy w konsoli kontenera podać polecenie exit. Warto jednak pamiętać, że exit wyłączy kontener jeśli nie był on uruchomiony w trybie daemon. Jeśli uruchamiamy kontener z opcją -d polecenie exit zaskutkuje zamknięciem sesji bash kontenera, lecz nadal będzie on działał w tle.

Jeśli uruchomienie kontenera nie będzie możliwe a błąd wskazuje na docker.proxy lub docker-runc oznacza to najprawdopodobniej brak linka symbolicznego w /usr/libexec/docker. Aplikacja odpytuje o plik /usr/libexec/docker/docker-runc, który nie istnieje. W takiej sytuacji należy dodać link symboliczny:

ln -s /usr/libexec/docker/docker-runc-current /usr/libexec/docker/docker-runc

A następnie dodać sciezke /usr/libexec/docker/docker-runc do zmiennej środowiskowej $PATH.

Logi kontenera możemy podejrzeć przez:

docker logs [id_kontenera]
Mam nadzieję, że tym wpisem przybliżyłem Wam jak podejść do budowania kontenera aplikacji. To wszystko to oczywiście tylko czubek góry lodowej. W kolejnych artykułach z tej serii będę kontynuował temat budowania kontenerów przy użyciu dockera. Poruszę także aspekt automatyzacji całego procesu wraz z  budowaniem kontenera na dany trigger, np. pojawienie się wersji. Korzystając z Dockera warto zainteresować się Kubernetesem, o którym opowiem w dalszych artykułach so stay tuned!


Dawid Wełnicki

Specjalista ds. technologii – zajmuję się administacją infrastruktury rozwojowej w środowiskach Windows i Linux oraz współpracuję przy rozwoju podejścia DevOps, prywatnie interesuję się bezpieczeństwem IT. W wolnych chwilach lubię pograć w tytuły takie jak: Call Of Duty Warzone, PUBG czy GTA V :)


Wydrukuj