
Docker pozwala na konteneryzację (zamknięcie w hermetycznym pudełku) wszystkich rzeczy potrzebnych do uruchomienia aplikacji.
Dockerfile
Wszystko zaczyna się od pliku Dockerfile w którym to jest definiowany obraz (Docker image). Podstawowe opcje jakie można zdefiniować to:
FROM – pozwala na zdefiniowanie rozszerzanego obrazu (Docker image). Przykładowo FROM eclipse-temurin
WORKDIR – pozwala na zdefiniowanie ścieżki w której będzie się wszystko odbywało. Przykładowo WORKDIR /myAppInContainer
COPY – pozwala na skopiowanie plików z lokalnego środowiska do obrazu (Docker image). Przykładowo COPY ./localFile ./myAppInContainer/
RUN – pozwala na uruchomienie komendy w trakcie budowania obrazu (Docker image). Przykładowo RUN javac Main.java czy npm install.
CMD – pozwala na zdefiniowanie komendy egzekwowanej przy uruchamianiu kontenera (Docker container). Przykładowo CMD java Main czy node app.js.
Docker image – obraz
Posiadając już gotowy plik Dockerfile, można zbudować obraz, czyli coś co zawiera już najczęściej system operacyjny, interpreter kodu/kompilator, środowisko uruchomieniowe, kod aplikacji i inne. Może (i często tak jest) ważyć prawie 1 GB. Aby zbudować obraz należy przejść do katalogu zawierającego plik Dockerfile i użyć polecenia:
docker build -t myImageName:myTagName .
Docker container – kontener
Posiadając już zbudowany obraz, można uruchomić dowolną ilość kontenerów – będą to całkowicie odrębne systemy. Aby uruchomić nowy kontener należy użyć polecenia run:
docker run myImageName:myTagName --name containerName
Aby zatrzymać kontener:
docker stop containerName
Aby uruchomić już istniejący kontener należy użyć polecenia start:
docker start containerName
Przydatne parametry – docker run
-d
uruchamia kontener w trybie detached mode (uruchomienie w tle) – czyli kontener zostaje uruchomiony ale nie powoduje to zablokowania konsoli (tak jak to działa domyślnie) – możliwe jest dalsze z niej korzystanie
–rm
dzięki temu parametrowi uruchomiony kontener zostanie automatycznie usunięty po jego zatrzymaniu
-p localport:containerport
pozwala na upublicznienie portów kontenera
-it
daje możliwość interaktywności z kontenerem (przykładowo możliwe będzie wprowadzanie wartości z poziomu konsoli). W rzeczy samej są to dwa oddzielne parametry -i oraz -t. -i zapewnia interaktywność a -t daje wsparcie dla konsoli.
Sprawdzanie istniejących już obrazów
Aby sprawdzić dostępne (zbudowane lub pobrane) obrazu należy użyć polecenia:
docker images
Sprawdzanie kontenerów
Aby sprawdzić jakie mamy uruchomione kontenery należy skorzystać z polecenia:
docker ps
Aby sprawdzić wszystkie dostępne kontenery (również te zatrzymane należy dodać parametr a:
docker -a ps
Nazwa i tag obrazu
Każdy obraz posiada zarówno nazwę jak i tag:
imageName:imageTag
nazwa będzie wskazywała na obraz a tag na wersję. Przykładowo jdk od firmy eclipse posiada nazwę eclipse-temurin, a jedne z dostępnych tagów to: 11.0.21_9-jre-centos7, 11-jre-centos7 11.0.21_9-jre-ubi9-minimal, 11-jre-ubi9-minimal
Co jeśli nie określimy tagu?
Jeśli nie określimy tagu to automatycznie będzie pobrany/przypisany tag o nazwie latest.
Pobieranie gotowego obrazu
Czasami chcemy skorzystać z już istniejącego obrazu (na przykład z https://hub.docker.com/). Aby pobrać taki obraz używamy polecenia docker pull:
docker pull imageName:imageTag
przykładowo:
docker pull eclipse-temurin:17-alpine
Czyszczenie
Kontenerów
Aby usunąć kontener musi on być uprzednio zatrzymany. I można użyć do tego użyć następującego polecenia:
docker rm containerName
Aby usunąć wszystkie zatrzymane kontenery:
docker container prune
Obrazów
Aby usunąć obraz wszystkie powiązane z nim kontenery muszą zostać usunięte. Aby usunąć obraz należy użyć polecenia:
docker rmi imageName:imageTag
Aby usunąć wszystkie (możliwe do usunięcia) obrazy należy użyć polecenia:
docker image prune