CodeGym /Kursy /Docker SELF /Dockerfile: tworzenie i struktura pliku

Dockerfile: tworzenie i struktura pliku

Docker SELF
Poziom 13 , Lekcja 1
Dostępny

2.1 Podstawowe koncepcje Dockerfile

Dockerfile — to plik tekstowy, zawierający sekwencję poleceń, które Docker używa do stworzenia obrazu. Służy jako „przepis”, opisujący, jak ma być zbudowany obraz – od warstwy bazowej do stanu końcowego. Zrozumienie struktury i procesu tworzenia Dockerfile jest ważne dla efektywnego korzystania z Dockera.

Podstawowe koncepcje Dockerfile:

  1. Idempotencja: polecenia w Dockerfile powinny być idempotentne — ich wielokrotne wykonanie daje ten sam rezultat.
  2. Kolejność: polecenia są wykonywane w kolejności od góry do dołu. Kolejność ma znaczenie, bo każde polecenie tworzy nową warstwę obrazu.
  3. Struktura warstwowa: praktycznie każda instrukcja dodaje nową warstwę do obrazu. Te warstwy są buforowane, co pozwala zoptymalizować proces budowy.

Struktura Dockerfile:

Dockerfile składa się z instrukcji, z których każda wykonuje określoną funkcję. Oto podstawowe z nich:

  1. FROM: ustawia obraz bazowy, który zostanie użyty do stworzenia nowego obrazu.
  2. MAINTAINER: określa autora Dockerfile (przestarzałe, ale przydatne dla informacji).
  3. RUN: wykonuje polecenia w kontenerze i tworzy nową warstwę.
  4. COPY: kopiuje pliki i katalogi z kontekstu budowy do systemu plików kontenera.
  5. ADD: kopiuje pliki i katalogi, wspiera rozpakowywanie archiwów i pobieranie plików przez URL.
  6. WORKDIR: ustawia katalog roboczy dla kolejnych poleceń.
  7. ENV: ustawia zmienne środowiskowe.
  8. CMD: określa polecenie domyślne, które jest wykonywane przy uruchomieniu kontenera.
  9. ENTRYPOINT: ustawia polecenie wykonywane przy uruchomieniu kontenera, z możliwością przekazania argumentów.
  10. EXPOSE: wskazuje porty używane przez kontener.
  11. VOLUME: tworzy punkt montowania dla zewnętrznych woluminów.

2.2 Tworzenie Dockerfile

Przykład tworzenia Dockerfile

Zobaczmy prosty przykład tworzenia Dockerfile dla aplikacji webowej na Node.js.

Krok 1: Tworzenie podstawowego Dockerfile

Utwórz plik o nazwie Dockerfile w katalogu głównym swojego projektu i dodaj następujące linie:

dockerfile

# Używamy bazowego obrazu Node.js
FROM node:14

# Ustawiamy katalog roboczy
WORKDIR /app

# Kopiujemy package.json i package-lock.json
COPY package*.json ./

# Instalujemy zależności
RUN npm install

# Kopiujemy wszystkie pliki projektu
COPY . .

# Wskazujemy port, który będzie używany przez aplikację 
EXPOSE 3000

# Definiujemy komendę do uruchamiania aplikacji
CMD ["node", "app.js"]

Ten Dockerfile wykonuje następujące kroki:

  1. FROM node:14: używa oficjalnego obrazu Node.js w wersji 14 jako bazy.
  2. WORKDIR /app: ustawia katalog roboczy dla kolejnych komend.
  3. COPY package*.json ./: kopiuje pliki package.json i package-lock.json do katalogu roboczego.
  4. RUN npm install: instaluje zależności z pliku package.json.
  5. COPY . .: kopiuje wszystkie pliki projektu do katalogu roboczego kontenera.
  6. EXPOSE 3000: wskazuje, że aplikacja będzie używać portu 3000.
  7. CMD ["node", "app.js"]: definiuje komendę do uruchomienia aplikacji.

Krok 2: Budowanie obrazu

Po stworzeniu Dockerfile zbuduj obraz za pomocą komendy docker build:

Terminal

docker build -t my-node-app .

Ta komenda stworzy obraz o nazwie my-node-app, używając Dockerfile z bieżącego katalogu.

Krok 3: Uruchamianie kontenera

Uruchom kontener na podstawie stworzonego obrazu za pomocą komendy docker run:

Terminal

docker run -d -p 3000:3000 my-node-app

Ten przykład uruchamia kontener w tle, przekierowując port 3000 kontenera na port 3000 maszyny hosta. Teraz możesz uzyskać dostęp do aplikacji pod http://localhost:3000.

2.3 Dodatkowe instrukcje Dockerfile

1. Ustawienie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, które będą dostępne w kontenerze, używając instrukcji ENV.

dockerfile

ENV NODE_ENV=production

2. Używanie kilku komend RUN

Czasami warto połączyć kilka komend w jedną instrukcję RUN, aby zmniejszyć liczbę warstw, zmniejszyć rozmiar obrazu i przyspieszyć budowanie.

dockerfile

RUN apt-get update && apt-get install -y \
  curl \
  git \
  && rm -rf /var/lib/apt/lists/*

Przydatne! Jeśli komenda nie mieści się w jednej linii, można użyć symbolu \, aby kontynuować w następnej linii. Zostanie to zinterpretowane jako jedna komenda.

Przydatne! Aby zapisać kilka komend w jednej linii, można użyć &&: command1 && command2 && command3. To pozwala na sekwencyjne wykonanie kilku komend.

Optymalizacja kolejności komend

Aby efektywnie korzystać z cache Docker, najpierw kopiuj pliki, które rzadko się zmieniają (np. package.json), i instaluj zależności przed dodaniem pozostałych plików projektu.

Przykład zaawansowanego Dockerfile

W bardziej skomplikowanych projektach może być konieczne rozszerzone Dockerfile z dodatkowymi ustawieniami.

dockerfile

# Używamy minimalnego obrazu bazowego Node.js
FROM node:14-alpine

# Ustawiamy katalog roboczy
WORKDIR /usr/src/app

# Kopiujemy package.json i instalujemy zależności
COPY package*.json ./
RUN npm install --only=production

# Kopiujemy kod źródłowy
COPY . .

# Określamy port do pracy
EXPOSE 8080

# Ustawiamy zmienne środowiskowe
ENV NODE_ENV=production

# Uruchamiamy aplikację
CMD ["node", "server.js"]
3
Zadanie
Docker SELF, poziom 13, lekcja 1
Niedostępne
Tworzenie prostego pliku Dockerfile dla aplikacji Node.js
Tworzenie prostego pliku Dockerfile dla aplikacji Node.js
3
Zadanie
Docker SELF, poziom 13, lekcja 1
Niedostępne
Optymalizacja Dockerfile z instalacją zależności
Optymalizacja Dockerfile z instalacją zależności
3
Zadanie
Docker SELF, poziom 13, lekcja 1
Niedostępne
Użycie kilku poleceń RUN
Użycie kilku poleceń RUN
3
Zadanie
Docker SELF, poziom 13, lekcja 1
Niedostępne
Użycie minimalnego obrazu bazowego
Użycie minimalnego obrazu bazowego
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION