Dockerfile – tworzenie własnych obrazów
1. Wprowadzenie
W poprzednich lekcjach poznałeś, czym są obrazy Dockera i jak można nimi zarządzać. Teraz nadszedł czas, by nauczyć się tworzyć własne obrazy — w pełni dostosowane do potrzeb Twoich aplikacji. Podstawowym narzędziem służącym do ich budowania jest plik Dockerfile — prosty, tekstowy skrypt zawierający zestaw instrukcji, które Docker wykonuje krok po kroku, aby stworzyć obraz.
2. Czym jest Dockerfile
Dockerfile to plik konfiguracyjny, który definiuje, jak ma zostać zbudowany obraz Dockera. Zawiera instrukcje, które określają m.in.:
- z jakiego obrazu bazowego korzystać,
- jakie pliki skopiować do obrazu,
- jakie pakiety zainstalować,
- jaki program uruchomić po starcie kontenera.
Docker przetwarza Dockerfile warstwa po warstwie, tworząc nowy obraz. Każda instrukcja generuje nową warstwę, która jest zapisywana w pamięci podręcznej (cache), co przyspiesza ponowne budowanie obrazu.
Zasada działania: Docker odczytuje instrukcje od góry do dołu i wykonuje je w kolejności, np.:
FROM python:3.11
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
3. Budowa pliku Dockerfile
Plik Dockerfile nie ma rozszerzenia i znajduje się zwykle w głównym katalogu projektu.
Każda linia to jedna instrukcja, a ich kolejność ma znaczenie — wcześniejsze warstwy są wykorzystywane jako podstawa dla kolejnych.
Najczęściej używane instrukcje:
| Instrukcja | Opis |
|---|---|
| FROM | Określa obraz bazowy (np. system lub język). To punkt wyjścia. |
| RUN | Uruchamia polecenie w trakcie budowania obrazu (np. instalacja pakietów). |
| COPY | Kopiuje pliki z lokalnego systemu do obrazu. |
| WORKDIR | Ustawia katalog roboczy wewnątrz kontenera. |
| CMD | Definiuje polecenie uruchamiane po starcie kontenera. |
4. Omówienie kluczowych instrukcji
4.1 FROM
Każdy Dockerfile musi zaczynać się od instrukcji FROM.
Określa ona, na jakim obrazie bazowym ma zostać oparty nowy obraz.
Przykłady:
Obrazy bazowe można pobrać z Docker Hub lub z prywatnych rejestrów.
4.2 RUN
Instrukcja RUN pozwala wykonać dowolne polecenie w systemie (np. instalację pakietów).
Przykłady:
Każde RUN tworzy nową warstwę, dlatego warto łączyć komendy przy pomocy &&, aby obraz był lżejszy.
4.3 COPY
Kopiuje pliki lub foldery z lokalnego katalogu do środka obrazu Dockera.
Przykład:
Pierwszy argument to ścieżka źródłowa (na hoście), a drugi — miejsce docelowe (w obrazie).
4.4 WORKDIR
Ustawia katalog roboczy (podobnie jak cd w terminalu).
Wszystkie kolejne polecenia (RUN, COPY, CMD) będą wykonywane wewnątrz tego katalogu.
Przykład:
Jeśli katalog nie istnieje, Docker automatycznie go utworzy.
4.5 CMD
Określa komendę uruchamianą po starcie kontenera (np. start serwera aplikacji). Może być zapisana w dwóch formatach:
- Forma tablicowa (zalecana):
dockerfile
CMD ["python", "app.py"]
Zapewnia lepszą kompatybilność z systemem Dockera.
- Forma powłokowa:
dockerfile
CMD python app.py
W Dockerfile może występować tylko jedna instrukcja CMD — jeśli umieścisz kilka, tylko ostatnia zostanie użyta.
5. Budowanie obrazu za pomocą docker build
Po utworzeniu pliku Dockerfile można zbudować nowy obraz.
Polecenie docker build analizuje Dockerfile i tworzy obraz warstwa po warstwie.
Składnia:
-t— nadaje nazwę i ewentualny tag obrazowi (np.myapp:1.0),.— oznacza bieżący katalog jako kontekst budowania (miejsce, gdzie znajduje się Dockerfile i potrzebne pliki).
Przykład:
Docker przeanalizuje instrukcje i wyświetli postęp tworzenia każdej warstwy. Po zakończeniu budowy obraz będzie dostępny lokalnie — można to sprawdzić komendą:
6. Praktyka – stworzenie własnego obrazu aplikacji
Przykład 1: Aplikacja Python (Flask)
Struktura projektu:
myapp/
│
├── app.py
├── requirements.txt
└── Dockerfile
app.py
requirements.txt
flask==3.0.0
Dockerfile
Budowanie i uruchamianie:
Po uruchomieniu odwiedź w przeglądarce: http://localhost:5000 Zobaczysz komunikat: "Witaj w mojej aplikacji Docker Flask!"
Przykład 2: Aplikacja Node.js
Struktura projektu:
myapp/
│
├── server.js
├── package.json
└── Dockerfile
server.js
package.json
Dockerfile
Budowanie i uruchamianie:
Następnie otwórz przeglądarkę i przejdź do http://localhost:3000 Zobaczysz komunikat: "Hello from Docker + Node.js!"
7. Dobre praktyki przy tworzeniu Dockerfile
- Używaj lekkich obrazów bazowych (np.
alpine,slim), aby zmniejszyć rozmiar obrazu. - Łącz polecenia RUN, by uniknąć nadmiarowych warstw.
- Ignoruj zbędne pliki (np. logi, dane lokalne) – użyj pliku
.dockerignore. - Ustal wersje bibliotek, aby uniknąć błędów kompatybilności.
- Używaj etykiet (LABEL), by dodać metadane do obrazu (autor, wersja, opis).
8. Podsumowanie
W tej lekcji nauczyłeś się:
- czym jest Dockerfile i jak działa jego architektura warstwowa,
- jak używać podstawowych instrukcji: FROM, RUN, COPY, WORKDIR, CMD,
- jak zbudować własny obraz przy pomocy
docker build, - oraz jak stworzyć praktyczny obraz dla aplikacji Python (Flask) lub Node.js (Express).
Dzięki Dockerfile możesz w pełni kontrolować środowisko aplikacji, tworzyć spójne i przenośne obrazy, a także automatyzować proces budowy środowisk w projektach zespołowych i produkcyjnych.