W ramach uzupełniania wiedzy przeczytałem książkę „Docker. Praktyczne zastosowania” (polskie tłumaczenie „Docker: Up & Running” Karl Matthias, Sean Kane, O’Reilly Media) z 2015 roku. Moja motywacja wynikła z fakt że mimo zaliczenia wewnętrznego szkolenia dla developerow w firmie e-point około 2 lat temu moja wiedza bardzo szybko „wyparowała” i konieczne było jej uporządkowanie.
Książka ma charakter kompendium wiedzy i opisuje ogólne założenia konteneryzacji, pracę z obrazami i konkretnymi kontenerami. Jest dobrze przetłumaczona na polski, ma przykłady gotowe do uruchomienia i generalnie bardzo dobrze się czyta.
Czytając książkę zrobiłem sobie szereg notatek które po uporządkowaniu stały się ściągawką z poleceń dockera która przyda mi się w przyszłości, więc może także przydać się innym użytkownikom.
Praca z obrazami:
- Dockerfile – plik konfiguracyjny
- budowanie obrazu:
$ docker build -t example/docker-node-hello:latest .
- uruchamianie zbudowanego obrazu:
$ docker run -d -p 8080:8080 example/docker-node-hello:latest
- lista obrazów:
$ docker images
- kasowanie obrazu
$ docker rmi id_obrazu
- sprawdzanie zawartości (składu) obrazu:
$ docker history id_obrazu
Kontenery:
- lista działających kontenerów
$ docker ps -a
- zatrzymanie kontenera:
$ docker stop id_kontenera
- publiczne rejestry: https://hub.docker.com/explore/
- logowanie do rejestru + wylogowywanie:
$ docker login
$ docker logout
- tagowanie własnych obrazów:
$ docker tag example/docker-node-hello:latest mberkan/docker-node-hello:latest
- lista obrazów na serwerze:
$ docker images
- wypchnięcie obrazu do repozytorium:
$ docker push mberkan/docker-node-hello:latest
- pobranie obrazu z repozytorium
$ docker pull mberkan/docker-node-hello:latest
- polecenie „run” = „crate” + „start”
- tworzenie kontenera:
$ docker create --name="awesome-service" ubuntu:latest
- ustawianie nazwy hosta w czasie startu:
$ docker run --rm -ti --hostname="mojkontener.przyklad.com" ubuntu:latest /bin/bash
- ustawienie magazynu danych
$ docker run --rm -ti -v /mnet/session_data:/data ubuntu:latest /bin/bash
- mapowanie portów
$ docker run --rm -p 6379:6379 redis:latest
- ograniczenia zasobów procesora (2), io (1) i allokacji pamięci (2):
$ docker run --rm -ti progrium/stress --cpu 2 --io 1 --vm 2 --vm-bytes 128M --timeout 120s
- kilka prób jeżeli kontener nie chce wstać:
--restart=on-failure:3
- zatrzymywanie kontenera:
$ docker stop id_kontenera
- żeby zakillować po 25 sekundach można zrobić
$ docker stop -t 25 id_kontenera
- zakillowanie:
$ docker kill id_kontenera
- zapauzowanie / wznowienie
$ docker pause id_kontenera
$ docker unpause id_kontenera
- „wejście” do działającego kontenera:
$ docker exec -t -i id_kontenera /bin/bash
- sprawdzenie zmian w plikach w lokalnym kontenerze względem obrazu:
$ docker diff id_kontenera
- usunięcie kontenera:
$ docker rm id_kontenera
Monitoring kontenerów:
- sprawdzanie szczegółów kontenera
$ docker inspect id_kontenera
- sprawdzenie używanych wolumenów:
$ docker volume ls
$ docker volume inspect id_wolumenu
- przeglądanie logów z kontenera
$ docker logs -f id_kontenera
- statystyki kontenera
$ docker stats id_kontenera
- lista procesów w kontenerze
$ docker top id_kontenera
- wyświetlanie eventów
$ docker events
- wyświetlenie intefejsów sieciowych używanych przez kontenery:
$ docker network ls
$ docker network inspect id_interfejsu_sieciowego
- inne (nieprzetesowane)
$ docker cp # kopiowanie
$ docker export # zapisywanie systemu plików jako tar
$ docker save # zapisywanie obrazu jako tar
$ docker import # wczytywanie obrazu z tar
Inne polecenia dockera:
- sprawdzanie wersji komponentów:
$ docker version
- sprawdzanie wersji serwera:
$ docker info
Do zarządzania zależnościami pomiędzy kontenerami służy docker-compose.
Inne użyteczne polecenia „niedockerowe”
- wyświetlanie drzewa procesów w linuxie:
$ ps axlfww
$ ps -ejH
$ pstree
$ pstree `pidof dockerd` - przeglądanie zdarzeń w procesie:
$ sudo strace -p `pidof dockerd`
- lista otwartych plików przez proces:
$ sudo lsof -p `pidof dockerd`
- wyświetlenie aktywnych połączeń sieciowych:
$ sudo netstat -an
$ sudo netstat -anp - wypisywanie n-tej (2) kolumny outputu:
$ ps -ef | awk '{print $2}'
- wyświetlanie listy interejsów sieciowych
$ ip addr show
Narzędzia do koordynacji:
- Helios od Spotify
- narzędzia do Dockera z Ansible
Narzędzia do planowania przetwarzania rozproszonego:
- Kubernetes od Google
- Apache Mesos
Kolejna książka szerzej opisująca Dockera i przetwarzanie rozproszone: „Docker Cookbook” Sebastian Goasguen (2015) – niestety na razie brak polskiego tłumaczenia.