fbpx
Trwają zapisy do Szkolenia Automation Maestro ». Obszerne szkolenie DevSecOps. Oferta obowiązuje tylko do 23 lipca do 21:00.
Kubernetes Maestro → sprawdź najnowsze szkolenie »»

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:

  1. Loguję się za pomocą SSH do serwera docelowego
  2. Sprawdzam stan kontenerów / stan zużycia zasobów
  3. Wykonuję jakieś akcje
  4. 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.

Docker Contexts - deploy na zdalnych hostach
Obrazowe przedstawienie Docker Contexts.

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


.

Damian Naprawa

Software Architect, Docker Certified Associate, praktykujący entuzjasta konteneryzacji. Lubi dzielić się wiedzą na swoim blogu https://szkoladockera.pl oraz w podkaście "Więcej Niż Konteneryzacja". Uczestnik globalnego programu partnerskiego Docker Enablement. Od kilku lat używa kontenerów na produkcji oraz mówi w języku #docker & #kubernetes. Fan automatyzacji oraz podejścia "As a Code"

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *