Pisząc oprogramowanie w .NET Core, które z założenia ma być uruchamiane w chmurze, na pewno będzie podlegało konteneryzacji. Niniejszy wpis nie będzie o tym jak tworzyć kontenery, lecz o tym jak szybko je budować oraz uruchamiać, a w razie konieczności wyłączać i czyścić.
Budowanie obrazu
Do szybkiego budowania obrazu posługuję się następującym skryptem (plikiem wsadowym bat).
@ECHO OFF SET configurationsApiRootFolder=C:\GIT\happycode.configurations.api cd %configurationsApiRootFolder% git checkout develop git pull docker build -f src/happycode.Configurations.Api/Dockerfile -t configurations-api:dev .
Powyższy skrypt w pierwszej kolejności tworzy zmienną ze ścieżką bezwzględną do folderu z repozytorium (2). Następnie przechodzi do tego folderu (4). Potem pobiera najnowsze kody źródłowe z repozytorium (6 i 7). Na koniec uruchamia komendę docker build
z odpowiednimi parametrami w celu zbudowania obrazu aplikacji (9). Pierwszy parametr --file, -f
to ścieżka do pliku z instrukcjami, tzw. dockerfile
. Kolejny parametr --tag, -t
to nazwa i tag obrazu pod którą będzie można zidentyfikować obraz w repozytorium obrazów. Ostatni parametr .
(kropka) definiuje kontekst – obecny folder ze wszystkimi plikami zostanie wysłany do procesu tworzenia obrazu.
Po wykonaniu powyższego skryptu konsola wyświetli komunikat z informacje iż obraz został zbudowany i oznaczony.
Uruchamianie kontenera
Poniższy skrypt uruchamia ówcześnie zbudowany obraz.
@ECHO OFF SET configurationsApiRootFolder=C:\GIT\happycode.configurations.api cd %configurationsApiRootFolder% docker run -d -e AWS_ACCESS_KEY_ID=ABC123 -e AWS_SECRET_ACCESS_KEY=abcde12345 -e AWS_DEFAULT_REGION=us-east-1 -p 5001:80 configurations-api:dev
Tutaj ponownie skrypt ustawia ścieżkę bezwzględną repozytorium (2) oraz przechodzi do tej lokalizacji (4). Ostatnia komenda docker run
uruchomienia kontener (6). Pierwszy parametr --detach, -d
uruchamia kontener w tle i zwraca jego ID. Drugi parametr --env, -e
ustawia zmienne środowiskowe, w moim przypadku są to klucze dostępu do chmury AWS. Trzeci parametr --publish, -p
odpowiedzialny jest za zmapowanie portów aplikacji w kontenerze z portami naszego systemu. Na końcu komendy znajduje się nazwa i tag obrazu który chcemy uruchomić.
Po wykonaniu powyższego skryptu, zgodnie z parametrem -d
, otrzymamy ID kontenera. Wykonując komendę docker container ls
możemy wylistować uruchomione kontenery i potwierdzić, że nasz kontener „wstał i ma się dobrze”.
Czasami zdarzy się, że kontener nie chce się uruchomić. W takich sytuacjach należy czytać komunikaty zwracane przez proces docker
, są w nich wypisane przyczyny. W niektórych przypadkach pomaga wyczyścić repozytorium i zbudować obraz na nowo, w innych lekarstwem okazuje się ponowne uruchomienie komputera.
Czyszczenie kontenerów
Ostatni, krótki skrypt robi dwie proste rzeczy – zatrzymuje uruchomione kontenery, a następnie czyści repozytorium.
powershell docker container stop $(docker container ls -a -q) powershell docker container rm $(docker container ls -a -q)
Skrypt uruchamia proces powershell
w którym przy pomocy przetwarzania potokowego wykonuje komendę docker container ls
z parametrem --all, -a
odpowiedzialnym za wylistowanie wszystkich kontenerów oraz parametrem --quiet, -q
który mówi procesowi docker
iż lista ma zawierać tylko i wyłącznie ID kontenerów. Dla każdego zwróconego ID kontenera uruchamiana jest w pierwszej kolejności komenda docker container stop
do zatrzymania kontenera, a następnie komenda docker container rm
odpowiedzialna za usunięcie kontenera z repozytorium.
Po wykonaniu powyższego skryptu dostajemy listę zatrzymanych, a następnie usuniętych kontenerów.
TIP
Powyższe skrypty trzymam w lokalizacji c:\docker\
. Skrypty nazywają się odpowiednio !build_configurations_api.bat
, !run_configurations_api.bat
oraz !clean_containers.bat
(tak, nazwa każdego z plików rozpoczyna się wykrzyknikiem). Ścieżkę c:\docker\
dodaną mam do zmiennej środowiskowej Path
. Dzięki temu w dowolnej lokalizacji wpisuję wykrzyknik, klikam TAB na klawiaturze i w szybki sposób mogę przeiterować po wszystkich skryptach, a następnie uruchomić jeden z nich.
A Wy macie jakieś przydatne porady, skrypty? Podzielcie się proszę w komentarzu, chętnie wypróbuję i zaadaptuję.
Do czyszczenia uruchomionych kontenerów używam docker rm $(docker ps – q).
Tip z wykrzyknikiem super coś podobnego zrobię dla linuxa jak się da :)
Łukasz,
Twoje i moje komendy są tożsame, dadzą ten sam wynik. Różnica jest taka, że Twoje wykorzystują starą nomenklaturę.
Ja ogólnie używam wtyczki Docker w IntelliJ.
Dodatkowo w kazdym repozytorium mam konfiguracje w formacie yaml do kubernetesa, którą Gitlab CI używa i robi deploy po zbudowaniu obrazu.
Grzegorz,
Lubię wszelkiego rodzaju wtyczki i pluginy, natomiast powyższe skrypty pozwalają mi być niezależnym od IDE.
Kubernetes to coś poza mną na dzień dzisiejszy, niemniej jednak dziękuję za podpowiedź.
Proponuję również zobaczyć Portainer. :)