Kontenery Docker
Obrazy, kontenery, sieci oraz Docker Compose — od mechanizmu systemu operacyjnego do kompletnego środowiska aplikacji.
Obrazy, kontenery, sieci oraz Docker Compose — od mechanizmu systemu operacyjnego do kompletnego środowiska aplikacji.
Inna wersja środowiska, brak zależności, odmienna konfiguracja i ręczne kroki tworzą niepowtarzalne wdrożenia.
chroot ogranicza widok systemu plików procesu.Kupowany pod obciążenie szczytowe. Przez większość czasu część CPU i RAM pozostaje niewykorzystana.
Lepsza konsolidacja, ale każda VM utrzymuje własny system operacyjny i rezerwuje zasoby.
Wspólne jądro oznacza mniejszy narzut, większą gęstość usług i szybsze skalowanie.
Koszt to nie tylko zakup serwera: energia, chłodzenie, miejsce, licencje, utrzymanie i czas administratorów.
| Maszyna wirtualna | Kontener | |
|---|---|---|
| System gościa | Pełny | Współdzielone jądro hosta |
| Start | Zwykle wolniejszy | Zwykle sekundy lub mniej |
| Rozmiar | GB | MB–GB |
| Granica izolacji | Hypervisor | Mechanizmy jądra |
Docker wykorzystuje mechanizmy jądra Linuksa. Jądro tworzy izolację i limity — Docker dostarcza model obrazów, API i narzędzia.
udziały i limity
limit i reakcja na przekroczenie
kontrola dostępu do urządzeń
Obraz to stos niezmiennych warstw. Dwa kontenery uruchomione z tego samego obrazu współdzielą warstwy obrazu, ale każdy otrzymuje własną cienką warstwę zapisu.
Zmiana pliku nie modyfikuje obrazu. Mechanizm copy-on-write kopiuje zmieniany plik do warstwy kontenera.
Na Windows korzystają z jądra Linuksa dostarczanego przez WSL 2. To najczęstszy tryb pracy Docker Desktop.
eclipse-temurin:21-jreKorzystają z jądra Windows i obrazów Windows Server. Wymagają zgodnego hosta Windows; nie uruchomimy ich natywnie na jądrze Linuksa.
mcr.microsoft.com/windows/nanoserverObraz musi pasować do rodziny jądra hosta. Docker Desktop pozwala przełączać tryb Linux/Windows containers.
Środowiskiem umożliwiającym uruchamianie dystrybucji i narzędzi Linuksa na Windows. WSL 2 używa prawdziwego jądra Linuksa.
wsl --install
wsl --status
wsl --list --verboseKod przechowywany w systemie plików WSL zwykle działa wydajniej niż kod montowany z dysku Windows.
docker.io — serwer przechowujący obrazy. Pominięty oznacza domyślnie Docker Hub.
library/postgres — nazwa i przestrzeń obrazu. library oznacza Docker Official Image.
17 — wariant lub wersja. Brak tagu oznacza latest, a nie „najnowszy bezpieczny”.
postgres:17 · eclipse-temurin:21-jre · ghcr.io/acme/api:1.4.2
Rzadko zmieniające się zależności umieszczamy przed często zmienianym kodem.
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn packagepubliczne i oficjalne obrazy
GitHub Container Registry
obrazy organizacji
registry/repository:tag · tag może się zmienić, digest wskazuje konkretną treść.
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
USER 10001
ENTRYPOINT ["java", "-jar", "app.jar"]Obraz bazowy: eclipse-temurin — Docker Official Image. Docker pobierze go z rejestru, jeśli nie ma go lokalnie.
FROM maven:3-eclipse-temurin-21 AS build
WORKDIR /src
COPY . .
RUN mvn -q -DskipTests package
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /src/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]Źródła obrazów: maven — etap budowania · eclipse-temurin — mały obraz uruchomieniowy.
# .dockerignore
target
.git
.idea
.envNie wysyłaj do silnika sekretów, repozytorium ani zbędnych artefaktów.
docker build -t space-api:1.0 .
docker image ls
docker image inspect space-api:1.0
docker history space-api:1.0docker history.Kontener ma własną konfigurację, sieć i warstwę zapisu. Usunięcie kontenera usuwa tę warstwę — dane trwałe wymagają wolumenu.
docker run łączy kilka operacjidocker run -d --name space-api \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=docker \
space-api:1.0-d tło · --name nazwa · -p port · -e zmienna
ps, logi oraz endpoint HTTP.EXPOSE dokumentuje port. Dopiero -p udostępnia go hostowi.
docker network create mission-net
docker run --network mission-net --name db mysql:8
docker run --network mission-net --name api space-apiAPI łączy się z db:3306, nie z localhost:3306.
localhost, potem wspólną sieć i rozwiązywanie nazwy db.docker volume create mysql-data
docker run --name db \
-v mysql-data:/var/lib/mysql \
mysql:8mysql-data — nazwa nadana przez nas,/var/lib/mysql — miejsce danych wewnątrz kontenera,Named volume wybieramy dla danych aplikacji. Bind mount jest wygodniejszy, gdy człowiek ma edytować pliki z hosta, np. kod źródłowy.
docker rm -f db # dane zostają
docker volume ls # volume nadal istnieje
docker run --name db-new \
-v mysql-data:/var/lib/mysql mysql:8
docker volume rm mysql-data # jawnie usuwa danedocker ps -a
docker logs -f NAME
docker exec -it NAME sh
docker inspect NAMEdocker stop NAME
docker rm NAME
docker image ls
docker volume lsps, logs, exec i inspect na działającym API.docker ps -a — czy proces nadal działa?docker logs — co zgłosiła aplikacja?docker inspect — jaka jest konfiguracja?docker exec — co widać od środka?Jeden plik deklaruje usługi, obrazy, sposób budowania, sieci, wolumeny, porty, zmienne i warunki gotowości.
compose.yamlservices:
db:
image: postgres:17
environment:
POSTGRES_DB: missions
POSTGRES_PASSWORD: DB_PASSWORD_FROM_ENV
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:publikuje port dla przeglądarki
wywołuje bazę po nazwie db
zapisuje dane w wolumenie
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
timeout: 3s
retries: 10
depends_on:
db:
condition: service_healthydocker compose config
docker compose up --build -d
docker compose ps
docker compose logs -f api
docker compose down
docker compose down -v # usuwa też dane!