Docker — to potężne narzędzie do tworzenia, wdrażania i zarządzania kontenerami, które stało się de facto standardem w branży rozwoju oprogramowania. Jednym z kluczowych elementów Docker jest Dockerfile — plik tekstowy zawierający instrukcje do tworzenia obrazu Docker. Zrozumienie Dockerfile i umiejętność jego prawidłowego użycia — to podstawa efektywnego korzystania z Docker.
Co to jest Dockerfile?
Dockerfile — to skrypt, który zawiera zestaw poleceń i instrukcji do tworzenia obrazu Docker. Obraz Docker, z kolei, jest niezmiennym szablonem, który zawiera wszystko, co potrzebne do uruchomienia kontenera: system operacyjny, biblioteki, zależności i samo aplikację.
Podstawowe instrukcje Dockerfile
Na początek przyjrzyjmy się podstawowym instrukcjom, które są używane w Dockerfile:
FROM: Ta instrukcja określa bazowy obraz, na podstawie którego będzie tworzony nowy obraz. Na przykład, FROM ubuntu:20.04 wskazuje, że bazowym obrazem będzie Ubuntu 20.04.
RUN: Używana do wykonywania poleceń w kontenerze. Zwykle używana do instalacji pakietów i wykonywania innych operacji niezbędnych do przygotowania środowiska.
CMD: Określa polecenie, które zostanie wykonane przy uruchomieniu kontenera. W przeciwieństwie do RUN, to polecenie nie jest wykonywane podczas budowy obrazu, a tylko przy uruchomieniu kontenera.
ENTRYPOINT: Pozwala określić polecenie, które zawsze będzie wykonywane przy uruchomieniu kontenera. Może być nadpisane podczas uruchamiania kontenera za pomocą parametrów wiersza poleceń.
COPY i ADD: Te instrukcje są używane do kopiowania plików i katalogów z lokalnego systemu plików do systemu plików obrazu. COPY wykonuje proste kopiowanie, a ADD może dodatkowo rozpakować pliki i pobierać je z URL.
ENV: Ustawia zmienne środowiskowe wewnątrz kontenera.
EXPOSE: Wskazuje, które porty będą otwarte w kontenerze dla zewnętrznego dostępu.
VOLUME: Tworzy punkt montowania do pracy z trwałym magazynem.
WORKDIR: Ustawia katalog roboczy dla wszystkich kolejnych instrukcji.
Przykład Dockerfile
Rozważmy prosty przykład Dockerfile dla aplikacji Node.js:
# Ustawiamy bazowy obraz
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 kod źródłowy aplikacji
COPY . .
# Ustawiamy port
EXPOSE 3000
# Określamy polecenie do uruchomienia aplikacji
CMD ["npm", "start"]
Szczegółowa analiza Dockerfile:
FROM node:14 — Wskazuje, że bazowym obrazem będzie oficjalny obraz Node.js w wersji 14. Oznacza to, że do naszego obrazu zostaną dołączone wszystkie niezbędne zależności do działania Node.js .
WORKDIR /app — Ustawia katalog roboczy /app, do którego będą kopiowane pliki i wykonywane polecenia.
COPY package.json ./* — Kopiuje pliki package.json i package-lock.json do katalogu roboczego kontenera. Pliki te zawierają informacje o zależnościach aplikacji.
RUN npm install — Wykonuje instalację zależności określonych w package.json.
COPY . . — Kopiuje wszystkie pliki i foldery z bieżącego katalogu (gdzie znajduje się Dockerfile) do katalogu roboczego kontenera.
EXPOSE 3000 — Wskazuje, że kontener będzie nasłuchiwał na porcie 3000.
CMD ["node", "app.js"] — Określa polecenie do uruchomienia aplikacji. W tym przypadku jest to uruchomienie pliku app.js za pomocą Node.js.
Utwórz plik app.js z następującą zawartością, lub użyj własnego:
// app.js
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
Utwórz plik package.json z następującą zawartością:
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js app with Express",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
Użycie Dockerfile
Teraz, gdy omówiliśmy podstawowe instrukcje i przyjrzeliśmy się przykładowi Dockerfile, przejdźmy do praktycznego użycia. Aby stworzyć obraz Docker i uruchomić kontener, należy wykonać kilka poleceń w terminalu.
Upewnij się, że pliki app.js, package.json i Dockerfile znajdują się w tym samym katalogu. Następnie stwórz obraz.
Tworzenie obrazu:
docker build -t my-node-app .
Tutaj -t my-node-app ustawia nazwę obrazu, a . wskazuje, że Dockerfile znajduje się w bieżącym katalogu.
Uruchamianie kontenera:
docker run -p 3000:3000 my-node-app
Polecenie docker run uruchamia kontener na podstawie stworzonego obrazu. Parametr -p 3000:3000 wskazuje, że port 3000 na maszynie hosta będzie przekierowany na port 3000 w kontenerze. Twój serwer powinien się pomyślnie uruchomić, a Ty będziesz mógł uzyskać do niego dostęp, otwierając w przeglądarce http://localhost:3000. Gdzie zobaczysz banalne powitanie "Hello, World!".
Podsumowanie
Dockerfile — to potężne narzędzie do automatyzacji i standaryzacji procesu tworzenia obrazów Docker. Zrozumienie podstawowych instrukcji i zasad pracy z Dockerfile pozwala programistom efektywnie zarządzać środowiskami i wdrażać aplikacje w kontenerach. Ważne jest, aby pamiętać, że Dockerfile powinien być zoptymalizowany i zawierać tylko niezbędne polecenia, aby zminimalizować rozmiar obrazu i zwiększyć wydajność kontenerów.