Docker Contexts – czyli jak ułatwić sobie życie
Jeżeli zdarzyło Ci się uruchamiać skonteneryzowaną aplikację w innym miejscu niż tylko na Twoim komputerze, to ten post jest zdecydowania dla Ciebie!
Wykorzystując Docker Contexts, pokażę Ci jak ułatwić sobie życie i nie musieć za każdym razem łączyć się do serwera docelowego gdzie działa Docker i Twoja aplikacja.
Opis Problemu
Często istnieje potrzeba, aby podejrzeć co dzieje się w danym momencie na serwerze, na którym wdrożyliśmy aplikację przy wykorzystaniu Dockera. Szczególnie w początkowej fazie projektu, gdzie nie mamy jeszcze w pełni skonfigurowanego monitoringu, zasadnym jest sprawdzanie przynajmniej stanu zużycia zasobów (docker stats
). Jeśli chcesz wiedzieć więcej na temat monitoringu, zajrzyj TUTAJ.
W momencie, gdy mamy kilka środowisk (dev, staging, prod) – za każdym razem musimy przełączać się pomiędzy serwerami.
Standardowa procedura jest następująca:
- Loguję się za pomocą SSH do serwera docelowego
- Sprawdzam stan kontenerów / stan zużycia zasobów
- Wykonuję jakieś akcje
- Zamykam połączenie SSH
$ ssh user@destinationhost $ docker ps -a $ docker stats --no-stream $ exit
Docker Contexts
Mechanizm, który jest głównym powodem tego posta — Docker Contexts. Dzięki niemu, z lokalnej maszyny (np. Twojego laptopa) możesz zarządzać Dockerem na zdalnych hostach. Co ważne, może to być zwykły Docker, klaster Docker Swarm oraz klaster Kubernetes (!).
Najważniejszą zaletą tego rozwiązania jest możliwość definiowania wielu contextów i ich odpowiedniego nazywania.
Załóżmy, że masz dostęp do serwera developerskiego i do stagingowego. Wystarczy zdefiniować dwa contexty: dev i staging — oczywiście za pomocą Docker CLI (coś, co znasz i używasz na co dzień).
Sprawdźmy zatem jak to działa 🙂
$ docker context --help Usage: docker context COMMAND Manage contexts Commands: create Create a context export Export a context to a tar or kubeconfig file import Import a context from a tar or zip file inspect Display detailed information on one or more contexts ls List contexts rm Remove one or more contexts update Update a context use Set the current docker context
Jeżeli nigdy wcześniej nie definiowałeś nowych contextów, domyślnie posiadasz jeden:
$ docker context ls NAME DESCRIPTION DOCKER ENDPOINT ORCHESTRATOR default * Current DOCKER_HOST based configuration npipe:////./pipe/docker_engine swarm
Jak tworzyć i używać contexty
Należy wspomnieć, że Docker Contexts do komunikacji pomiędzy lokalną maszyną a zdalnym hostem wykorzystuje połączenie SSH. Zanim zaczniesz zabawę z Docker Contexts, potrzebujesz skonfigurować połączenie z Twoim lokalnym komputerem, a hostem docelowym za pomocą SSH z wykorzystaniem kluczy. Jeżeli nie wiesz jak to zrobić, możesz spojrzeć na ten artykuł.
UWAGA: Od jakiegoś czasu SSH jest dostępne również na Windowsie – sam z tego korzystam na co dzień 🙂
Tworzymy nowy Docker Context, o nazwie dev-context
$ docker context create dev-context --docker "host=ssh://user@remote_host" dev-context Successfully created context "dev-context" $ docker context ls NAME DESCRIPTION DOCKER ENDPOINT ORCHESTRATOR default * Current DOCKER_HOST based configuration npipe:////./pipe/docker_engine swarm dev-context ssh://user@remote_host
OK, mamy to. Możemy zacząć korzystać z dev-context
.
Przykładowo, chciałbym wyświetlić aktualny stan zużycia zasobów na zdalnym hoście.
$ docker --context dev-context stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O f12209c30718 caddy 0.00% 2.52MiB / 1.861GiB 0.13% 2.1kB / 0B 10.8MB / 0B a6059f35f030 cadvisor 18.40% 67.84MiB / 1.861GiB 3.56% 1.4MB / 63.8MB 22MB / 0B 671da3a620d3 alertmanager 0.05% 16.56MiB / 1.861GiB 0.87% 270kB / 103kB 19.4MB / 24.6kB ea0d74500b38 grafana 0.01% 28.07MiB / 1.861GiB 1.47% 145kB / 39.1kB 38.5MB / 242kB 5b951fe4f274 nodeexporter 0.00% 13.75MiB / 1.861GiB 0.72% 582kB / 11.3MB 11.1MB / 0B 78a69302bb2c prometheus 2.17% 85.43MiB / 1.861GiB 4.48% 76.1MB / 2.31MB 223MB / 48.7MB 9591d2576885 pushgateway 0.00% 12.3MiB / 1.861GiB 0.65% 217kB / 978kB 12MB / 0B
Zmiana domyślnego contextu
Idąc krok dalej, możemy ustawić dev-context
jako domyślny. To pozwoli na uruchamianie wszystkich komend CLI bezpośrednio na zdalnym hoście, bez konieczności wskazywania na dev-context
Aby to zrobić wystarczy użyć następującej komendy:
$ docker context use dev-context dev-context Current context is now "dev-context" $ docker stats --no-stream CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O f12209c30718 caddy 0.00% 2.52MiB / 1.861GiB 0.13% 2.1kB / 0B 10.8MB / 0B a6059f35f030 cadvisor 18.40% 67.84MiB / 1.861GiB 3.56% 1.4MB / 63.8MB 22MB / 0B 671da3a620d3 alertmanager 0.05% 16.56MiB / 1.861GiB 0.87% 270kB / 103kB 19.4MB / 24.6kB ea0d74500b38 grafana 0.01% 28.07MiB / 1.861GiB 1.47% 145kB / 39.1kB 38.5MB / 242kB 5b951fe4f274 nodeexporter 0.00% 13.75MiB / 1.861GiB 0.72% 582kB / 11.3MB 11.1MB / 0B 78a69302bb2c prometheus 2.17% 85.43MiB / 1.861GiB 4.48% 76.1MB / 2.31MB 223MB / 48.7MB 9591d2576885 pushgateway 0.00% 12.3MiB / 1.861GiB 0.65% 217kB / 978kB 12MB / 0B
Wsparcie dla docker-compose
Najnowsza wersja (1.26.0-rc2
) docker-compose otrzymała wsparcie dla Docker Contexts. Dzięki temu możemy zdalnie uruchamiać polecenia specyficzne dla docker-compose na wielu maszynach.
Najnowszą wersję możesz pobrać TUTAJ. Wystarczy podmienić aktualny plik wykonywalny, na ten, który pobierzemy.
Przykładowo, na Windowsie plik wykonywalny docker-compose.exe
znajduje się w C:\Program Files\Docker\Docker\resources\bin
Wystarczy zatem pobrać i podmienić plik .exe 🙂
Przykład użycia
Do celów testowych wykorzystamy WordPressa i MySQL. Stwórz lokalnie plik docker-compose.yml
na podstawie tego linku.
Wykonaj lokalnie poniższe polecenie.
$ docker context use dev-context dev-context Current context is now "dev-context" $ docker-compose up -d Creating network "wp_default" with the default driver Creating volume "wp_db_data" with default driver Creating wp_db_1 ... done Creating wp_wordpress_1 ... Done
Tym sposobem wdrożyliśmy Wordpressa na zdalnym hoście, wykorzystując Docker Contexts oraz docker-compose.
$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------- wp_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp wp_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8000->80/tcp
Możemy to powtórzyć na innych środowiskach. Wystarczy zdefiniować nowy context, następnie ustawić go jako domyślny i wykonać polecenie docker-compose up -d