Co to jest Docker?
Docker to sposób na konteneryzację aplikacji (umieszczanie kodu w boksach, które mogą działać samodzielnie). W magiczny sposób tworzy on komputer wirtualny, ale tak naprawdę nie są to komputery wirtualne.
Kontenery to boksy, które nie mają systemu operacyjnego hosta, więc są niezależne od urządzenia, na którym działają.
Korzyści:
- Izolacja: Każdy kontener działa w odseparowanym środowisku.
- Przenośność: Kontenery są niezależne od środowiska.
- Skalowalność: Łatwe dodawanie i usuwanie kontenerów w zależności od obciążenia.
- Szybkość: Szybkie uruchamianie i zatrzymywanie kontenerów dzięki mechanizmom jądra systemu operacyjnego.
Obrazy
Pokaż, jakie obrazy są dostępne lokalnie:
docker images
Kontenery
Pokaż, jakie kontenery są aktywne (zwraca ID kontenera):
docker ps
Pokaż wszystkie kontenery (zarówno aktywne, jak i nieaktywne):
docker ps -a
Zarządzanie kontenerami
Odpal obraz (stwórz z niego kontener):
docker start <IMAGE>
Zatrzymaj kontener:
docker stop <CONTAINER ID>
Zatrzymaj wszystkie uruchomione kontenery:
docker kill $(docker ps -q)
Usuń kontener:
docker rm <CONTAINER ID>
Usuń wszystkie kontenery (zarówno aktywne, jak i nieaktywne):
docker rm --force $(docker ps -a -q)
Zarządzanie obrazami
Usuń obraz:
docker rmi <IMAGE ID>
Usuń wszystkie dostępne obrazy:
docker rmi --force $(docker images -q)
Pobieranie obrazu
Pobierz obraz nginix w wersji 1.31:
docker pull nginx:1.31
Uruchamianie kontenera
Odpal nginixa w trybie logowania do terminala:
docker run nginx:1.31
Odpal nginxa w tle (detached mode):
docker run -d nginx:1.31
Odpal obraz z Docker Hub, jeśli nie zostanie znaleziony lokalnie:
docker run nginx:1.22-alpine
Uruchom nginx na porcie 80 w tle i przekieruj port 9000 na localhost:
docker run -d -p 9000:80 nginx:latest
Teraz nginx jest dostępny na porcie 9000.
Logi kontenera
Odpali logi kontenera:
docker logs <CONTAINER ID>
Ich lokalizacja na hoście to:
tail -f /var/lib/docker/containers/<container id>/<container id>-json.log
Docker Compose
Uruchom plik docker-compose.yaml w trybie detached (tło):
docker-compose up -d
Kopiowanie z hosta do kontenera:
Kopiowanie pojedynczego pliku:
docker cp [ścieżka_do_pliku_na_hostcie] [nazwa_lub_id_kontenera]:[ścieżka_w_kontenerze]
Przykład:
docker cp ./lokalny_plik.txt moj_kontener:/app/lokalny_plik.txt
Kopiowanie całego folderu:
docker cp [ścieżka_do_folderu_na_hostcie] [nazwa_lub_id_kontenera]:[ścieżka_w_kontenerze]
Przykład:
docker cp ./folder_na_hostcie moj_kontener:/app/
Kopiowanie z kontenera do hosta:
Kopiowanie pojedynczego pliku:
docker cp [nazwa_lub_id_kontenera]:[ścieżka_w_kontenerze] [ścieżka_na_hostcie]
Przykład:
docker cp moj_kontener:/app/plik_w_kontenerze.txt ./plik_w_hostcie.txt
Kopiowanie całego folderu (do folderu na hoście):
docker cp [nazwa_lub_id_kontenera]:[ścieżka_w_kontenerze] [ścieżka_folderu_na_hostcie]
Przykład:
docker cp moj_kontener:/app/folder_w_kontenerze ./folder_na_hostcie/
Sieci w Dockerze
Pobierz szczegóły portu dla kontenera:
docker container port <container-name>
# 80/tcp -> 0.0.0.0:80
# 80/tcp -> :::80
Pobierz IP dla kontenera:
docker container inspect --format '{{ .NetworkSettings.IPAddress }}' webhost
Pokaż wszystkie sieci:
docker network ls
Zbadaj sieć:
docker network inspect <network-name>
Utwórz wirtualną sieć:
docker network create <network-name>
Aby użyć customowego bridge, możemy skorzystać z opcji –driver.
Podłącz sieć do kontenera:
docker network connect <network-name> <container-name>
Odłącz sieć do kontenera:
docker network disconnect <network-name> <container-name>
Podłącz się do sieci podczas uruchamiania kontenera:
docker container run -d --name <container-name> --network <network-name> <image>
Domyślne typy sieci:
Bridge lub Docker0 - domyślna wirtualna sieć mapowana na adres IP hosta. Pozwala kontenerom na komunikację między sobą, gdy działają na tym samym hoście Dockera.
host - specjalna sieć, która przyłącza kontener bezpośrednio do hosta, pomijając wirtualną sieć.
none - W kontenerze dostępny jest tylko interfejs localhost.
Przy użyciu sieci w Dockerze możemy zapewnić, że:
powiązane aplikacje są w tej samej sieci Dockera, ich komunikacja odbywa się tylko w ramach wirtualnej sieci, ruch może być przekierowywany z hosta do kontenera tylko wtedy, gdy publikujemy kontener za pomocą opcji –publish lub -p.
DNS
Kontenery mogą komunikować się ze sobą w tej samej wirtualnej sieci za pomocą nazw hostów.
Docker domyślnie przypisuje nazwę hosta na podstawie nazwy kontenera. Niemniej jednak, możemy również używać aliasów.
Aby dostarczyć kontenerom aliasy sieciowe, możemy postępować w następujący sposób:
docker container run --rm --network <nazwa-sieci> --network-alias <alias-sieciowy-kontenera> <obraz>
Dzięki temu kontenery w tej samej wirtualnej sieci mogą ze sobą komunikować się za pomocą aliasów.
Flaga –rm sprawia, że kontener zostanie trwale usunięty po zakończeniu działania.