Docker - dockerfile i warstwy

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 481 razy

Plik dockerfile umożliwia nie tylko wybranie obrazu bazowego, ale również wskazanie folderu docelowego aplikacji, kopiowania plików do obrazu, uruchamianie skryptów wewnątrz kontenera przy jego starcie i wiele, wiele innych. Oto przykładowy plik dockerfile:

FROM node:14 WORKDIR /app COPY / ./ RUN npm install EXPOSE 8888 CMD ["npm", "start"]

Pierwsza linijka to oczywiście ładowanie obrazu bazowego, kolejna WORKDIR to nic innego jak wskazanie folderu bazowego. Polecenie COPY kopiuje zawartość bieżącego folderu (na dysku twardym) do obrazu. Następnie jest RUN, które w tym przypadku instaluje zależności. W moim przypadku stworzyłem mały projekt serwera API z użyciem node-a i modułu express. Kolejna linijka 8888 opisuje port, na którym udostępnione zostanie API. Niestety nie jest to ustawienie, które ma jakiś realny wpływ na to, na którym porcie jest wystawione wewnętrznie API, należy to traktować jako informację nie zaś rzeczywiste ustawienie. W ostatniej linijce polecenie CMD uruchamia serwer.

Każda linijka kodu znajdującego się w pliku dockerfile jest warstwą, oznacza to, że modyfikacja ostatniego polecenia nie będzie miała wpływu na wcześniejsze polecenia i dlatego, jeżeli ulegnie ona zmianie to przy przebudowaniu obrazu nie będzie konieczne wykonanie pozostałych poleceń. Docker wykryje zmiany i przebuduje tylko te warstwy, które tego wymagają.

Przed zbudowaniem obrazu warto dodać plik .dockerignore, w którym można określić pliki do zignorowania:

dockerfile node_modules

Czas zbudować obraz:

docker build -t node-api:1.0 .

co spowoduje zbudowanie obrazu:

[+] Building 9.0s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                            0.0s 
 => [internal] load .dockerignore                                                                                                                                                                                               0.0s 
 => => transferring context: 50B                                                                                                                                                                                                0.0s 
 => [internal] load metadata for docker.io/library/node:14                                                                                                                                                                      0.0s 
 => [internal] load build context                                                                                                                                                                                               1.5s 
 => => transferring context: 4.37MB                                                                                                                                                                                             1.5s 
 => [3/4] COPY / ./                                                                                                                                                                                                             0.2s 
 => [4/4] RUN npm install                                                                                                                                                                                                       7.1s 
 => exporting to image                                                                                                                                                                                                          0.2s 
 => => exporting layers                                                                                                                                                                                                         0.2s 
 => => writing image sha256:e0b890e8b609d5d0e87bd2339593940cc4cc3d755cf6e1891dfb0052a1200733                                                                                                                                    0.0s 
 => => naming to docker.io/library/node-api:1.0                                                                                                                                                                                 0.0s 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

No i jeszcze może uruchomić kontener:

docker run -p 8889:8888 --name node node-api:1.0

W moim przypadku wpisując w przeglądarce adres: localhost:8889 mogę zobaczyć zwróconą wartość z serwera API. Pokuszę się jeszcze o sprawdzenie, czy plik dockerfile nie został załączony:

docker container exec node ls
controllers      
index.js
node_modules     
package-lock.json
package.json     
routes

Jak widać plik dockerfile nie istnieje wewnątrz kontenera ale plik node_modules już tak. Jest to spowodowane tą linijką kodu z pliku dockerfile:

RUN npm install
Propozycje książek
tytuł: Kubernetes i Docker w środowisku produkcyjnym przedsiębiorstwa. Konteneryzacja i skalowanie aplikacji oraz jej integracja z systemami korporacyjnymi autor: Scott Surovich, Marc Boorshtein

Tytuł:

Kubernetes i Docker w środowisku produkcyjnym przedsiębiorstwa. Konteneryzacja i skalowanie aplikacji oraz jej integracja z systemami korporacyjnymi

Autor:

Scott Surovich, Marc Boorshtein

tytuł: Bezpieczeństwo kontenerów w DevOps. Zabezpieczanie i monitorowanie kontenerów Docker autor: Jose Manuel Ortega Candel

Tytuł:

Bezpieczeństwo kontenerów w DevOps. Zabezpieczanie i monitorowanie kontenerów Docker

Autor:

Jose Manuel Ortega Candel

tytuł: Docker dla programistów. Rozwijanie aplikacji i narzędzia ciągłego dostarczania DevOps autor: Richard Bullington-McGuire, Michael Schwartz, Andrew K. Dennis

Tytuł:

Docker dla programistów. Rozwijanie aplikacji i narzędzia ciągłego dostarczania DevOps

Autor:

Richard Bullington-McGuire, Michael Schwartz, Andrew K. Dennis

tytuł: Docker dla praktyków. Wydanie II autor: Jeeva S. Chelladhurai, Vinod Singh, Pethuru Raj

Tytuł:

Docker dla praktyków. Wydanie II

Autor:

Jeeva S. Chelladhurai, Vinod Singh, Pethuru Raj

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona

Załączniki:

Pliki prostego serwera API napisanego w node