Diversity w polskim IT
Dawid Wełnicki
Asseco Poland S.A.
Dawid WełnickiSpecjalista ds. technologii @ Asseco Poland S.A.

Stawianie kontenera aplikacji za pomocą Dockera w środowisku Linuxa

Sprawdź jak zbudować kilka kontenerów, które możesz później uruchamiać jednocześnie na jednym hoście.
26.10.20214 min
Stawianie kontenera aplikacji za pomocą Dockera w środowisku Linuxa

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:

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ć ścieżkę /usr/libexec/docker/docker-runc do zmiennej środowiskowej $PATH.

Logi kontenera możemy podejrzeć przez:

docker logs [id_kontenera]
<p>Loading...</p>