Poradniki, przykłady i narzędzia związane z pracą w powłoce systemowej od prostych poleceń po bardziej zaawansowane skrypty automatyzujące zadania. Zarówno dla użytkowników Windows (PowerShell, CMD), jak i Linux/macOS (Bash, terminal).
Docker to popularne narzędzie do uruchamiania aplikacji w izolowanych kontenerach. W przeciwieństwie do Dockera w systemie Windows, który wymaga dodatkowej warstwy wirtualizacji, na Linuksie działa bezpośrednio w systemie, co jest szybsze i stabilniejsze. Jeśli dotąd korzystałeś z Dockera w Windows, rozważ przesiadkę na Linux – praca z kontenerami będzie prostsza i bardziej efektywna. A oto krótki przewodnik po przydatnych poleceniach, które umożliwią zainstalowanie oraz sprawdzenie Dockera w Fedora Linux.
Instalacja Dockera i Docker Compose
Zainstaluj Dockera i narzędzia dodatkowe:
sudo dnf install moby-engine docker-compose
Uruchom i włącz usługę Dockera:
sudo systemctl enable --now docker
Powyższe polecenie spowoduje, że Docker zostanie uruchomiony już w bieżącej sesji, a także będzie uruchamiany automatycznie przy każdym starcie systemu.
Krótkie podsumowanie zainstalowanych pakietów:
moby-engine to open-source’owy silnik Dockera, rozwijany w ramach projektu Moby. W praktyce pakiet ten dostarcza ten sam silnik, na którym oparty jest Docker CE (Community Edition). Jest to główne narzędzie do uruchamiania, zatrzymywania i zarządzania kontenerami. Pozwala tworzyć środowiska uruchomieniowe dla aplikacji w odizolowanych kontenerach.
docker-compose jest dodatkowym narzędziem umożliwiającym definiowanie i uruchamianie wielu kontenerów jednocześnie, za pomocą jednego pliku docker-compose.yml. Ułatwia budowanie i uruchamianie złożonych aplikacji, które składają się z kilku współpracujących usług (np. serwer aplikacji, baza danych, cache).
Dodanie użytkownika do grupy docker
Aby używać Dockera bez sudo, należy dodać swojego użytkownika do grupy docker:
sudo usermod -aG docker $USER
Wyloguj się i zaloguj ponownie lub uruchom w terminalu:
newgrp docker
⚙️ Jak działa Linux? Usługa Dockera tworzy gniazdo /var/run/docker.sock, które należy do grupy docker. To gniazdo to interfejs komunikacyjny między klientem Docker a demonem dockerd. Dzięki temu tylko użytkownicy należący do grupy docker mają uprawnienia do zarządzania kontenerami bez sudo.
Test działania Dockera
Uruchom przykładowy kontener testowy:
docker run hello-world
Jeśli wszystko działa, zobaczysz komunikat zaczynający się od:
Hello from Docker! This message shows that your installation appears to be working correctly.
Zarządzanie kontenerami
Wyświetlenie listy działających kontenerów:
docker ps
Wyświetlenie listy wszystkich kontenerów (w tym zatrzymanych):
docker ps -a
Usunięcie zatrzymanych kontenerów:
docker container prune
Powyżej przedstawiliśmy podstawowe polecenia do wyświetlania i usuwania kontenerów. W kolejnym artykule opublikuję szczegółową tabelę z przykładami dodatkowych komend, takich jak zatrzymywanie i usuwanie kontenerów, wyświetlanie listy obrazów Dockera, przeglądanie logów oraz usuwanie niepotrzebnych obrazów. Te polecenia pozwolą Ci w pełni kontrolować i porządkować środowisko Dockera.
W tym artykule opisuję nietypowy, lecz wcale nie rzadki przypadek, z którym może zmierzyć się każdy twórca aplikacji webowych. Port 8080 domyślnie wykorzystywany przez wiele aplikacji Spring Boot był zajęty przez nieznaną usługę systemową. Źródłem problemu okazało się dodatkowe oprogramowanie zainstalowane „przy okazji” razem z narzędziem do zarządzania partycjami dysku.
Na konkretnym przykładzie pokażę, jak krok po kroku zdiagnozować takie sytuacje za pomocą wbudowanych narzędzi systemowych i PowerShella.
Choć opis dotyczy aplikacji Spring Boot uruchamianej w środowisku Eclipse, to również programiści korzystający z innych języków i frameworków takich jak Node.js, .NET czy Python znajdą tu uniwersalne wskazówki, pomocne w rozwiązywaniu problemów z konfliktem portów.
Przypadek został przeanalizowany na systemie Windows z pełnymi uprawnieniami administratora. Opisywane metody nie były testowane w systemach Linux ani macOS, w których mogą występować inne narzędzia oraz odmienna procedura rozwiązywania podobnych problemów.
Objawy
Po uruchomieniu aplikacji Spring Boot pojawił się błąd:
APPLICATION FAILED TO START Web server failed to start. Port 8080 was already in use.
To jasna wskazówka, że ktoś już korzysta z portu 8080. Wymagana była diagnoza, kto to robi i dlaczego.
Narzędzia diagnostyczne i komendy
Poniżej zestaw narzędzi systemowych i komend PowerShell/CMD użytych do analizy sytuacji.
1. Sprawdzenie, co nasłuchuje na porcie 8080
W terminalu wpisz następujące polecenie.
netstat -ano | findstr :8080
Ta komenda pozwala zidentyfikować, czy port jest aktualnie w użyciu i przez jaki proces (PID). W moim przypadku w konsoli wyświetliła się linia. Ostatnia wartość to identyfikator procesu.
TCP 0.0.0.0:8080 LISTENING 5184
2. Kto używa PID 5184?
Aby dowiedzieć się, jaki program odpowiada za dany PID, używamy komendy tasklist.
tasklist /FI "PID eq 5184"
Dla mojego przypadku wynik wskazywał na AgentService.exe, ale brak było dodatkowych informacji.
3. Identyfikacja lokalizacji procesu (z uprawnieniami administratora)
Wykonanie tej komendy pozwala sprawdzić dokładną ścieżkę do pliku wykonywalnego procesu.
Name : MTAgentService DisplayName : MTAgentService PathName : "C:\Program F...\MiniTool ShadowMaker\AgentService.exe" State : Running StartMode : Auto
Ustalenia
Usługa MTAgentService, zainstalowana wraz z MiniTool ShadowMaker PW Edition, blokowała port 8080. Co ciekawe, narzędzie to było zainstalowane tego samego dnia co MiniTool Partition Wizard, najprawdopodobniej jako komponent dodatkowy.
Sprawdzenie daty instalacji aplikacji
Aby ustalić, które programy zostały zainstalowane danego dnia (np. 23 lutego 2025 roku), można wykorzystać rejestr systemu Windows. Informacje o zainstalowanych aplikacjach przechowywane są w kluczach rejestru, z których możemy odczytać m.in. nazwę aplikacji (DisplayName) oraz datę instalacji (InstallDate).
Poniższe polecenie PowerShell pozwala przeszukać rejestr systemowy i wyświetlić aplikacje zainstalowane danego dnia:
W systemach 64-bitowych programy 32-bitowe instalowane są w osobnym obszarze rejestru (Wow6432Node). Jeśli chcesz mieć pełny obraz (aplikacje 64- i 32-bitowe), skorzystaj z poniższego skryptu:
Unikaj domyślnego portu 8080 w aplikacjach deweloperskich
Port 8080 to jeden z najczęściej wykorzystywanych portów przez aplikacje webowe i narzędzia firm trzecich (takie jak MiniTool ShadowMaker, IIS, serwery BI czy inne lokalne usługi). Jeśli tworzysz aplikację w Spring Boot, Node.js, React czy innym frameworku rozważ ustawienie alternatywnego portu, np. 8081, 5173, 3000 albo wybranego zgodnie z wewnętrznym standardem zespołu.
Standaryzacja i dokumentacja portów
W projektach zespołowych warto ustalić stałe porty dla różnych środowisk (np. 8081 dla developmentu, 8082 dla testów), by uniknąć konfliktów i ułatwić automatyzację. Przydatne jest także dodanie do repozytorium pliku .env.example lub dokumentacji z opisem portów i zmiennych środowiskowych używanych przez aplikację. W przypadku Spring Boot można odczytywać takie zmienne w application.properties, np. przez ${SPRING_PORT:8080}.
Jeśli chcesz zagłębić się w temat używania plików .env w aplikacjach Spring Boot, sprawdź ten przystępny artykuł:
Jeśli chcesz, aby Spring Boot dynamicznie dobrał wolny port, ustaw w application.properties:
server.port=0
Port zostanie wyświetlony w logu przy starcie aplikacji.
Sprawdzenie aktywnych portów po każdej instalacji oprogramowania
Po instalacji nowego programu sprawdź, które porty są aktualnie nasłuchiwane. Możesz użyć polecenia:
Get-NetTCPConnection -State Listen |
Group-Object LocalPort |
Sort-Object Name
Korzystaj z TCPView do szybkiej analizy portów
Graficzne narzędzie TCPView od Sysinternals to niezastąpione wsparcie w wykrywaniu konfliktów portów. Pozwala błyskawicznie zidentyfikować proces, usługę i lokalizację aplikacji nasłuchującej na danym porcie.
Jeśli preferujesz graficzne narzędzia diagnostyczne, użyj TCPView (arch. własne)
Ostrożność przy instalacji oprogramowania narzędziowego
Instalując narzędzia typu „partition manager”, „backup software” czy „BI agent”, wybieraj tryb instalacji niestandardowej (custom), aby wykluczyć dodatkowe komponenty. Wielu producentów instaluje przy okazji własne usługi systemowe, które mogą działać w tle i blokować kluczowe porty.
Przypadek korporacyjny
Ten przypadek dotyczył stacji roboczej z pełnymi prawami administratora. W środowisku korporacyjnym sytuacja jest trudniejsza:
Brak dostępu do zaawansowanych komend
Brak uprawnień do zatrzymywania usług
Konieczność zgłoszenia do helpdesku
W następnym wpisie zaproponuję podejście do tworzenia zgłoszenia serwisowego oraz przygotowania pakietu diagnostycznego do analizy problemów z portami, uruchamianiem aplikacji oraz konfliktem usług w firmowym systemie Windows.
Podsumowanie
To studium przypadku pokazuje, jak niepozorne narzędzie może skutecznie zablokować pracę nad aplikacją. Diagnoza i znajomość narzędzi systemowych (takich jak PowerShell, TCPView, netstat) są nieocenione w codziennej pracy deweloperskiej. Ten przypadek zostanie rozszerzony o scenariusz korporacyjny, by pomóc innym programistom i administratorom szybciej reagować na podobne problemy.
FAQ
Czy InstallDate zależy od języka i lokalizacji systemu?
to liczba całkowita reprezentująca datę w formacie YYYYMMDD (czyli RRRRMMDD, np. 20250223 oznacza 23 lutego 2025). Jest to techniczna wartość typu DWORD, a nie tekstowa reprezentacja daty, więc nie podlega lokalizacji, ustawieniom regionalnym ani formatom wyświetlania.
Dlaczego PowerShell może błędnie wkleić polecenie?
Kiedy kopiujesz dłuższy blok kodu do konsoli PowerShell bezpośrednio z przeglądarki, upewnij się, że całość wkleiła się poprawnie. Zdarza się, że kolejność linii może się odwrócić lub złamać (szczególnie w pętli foreach), co prowadzi do błędów takich jak:
Rozwiązanie: Wklej cały blok kodu najpierw do edytora tekstu (np. Notepad++ lub VS Code), a dopiero potem do PowerShella. Alternatywnie użyj terminala PowerShell ISE lub Windows Terminal, które lepiej radzą sobie z wieloliniowym kodem.
Masz podobny przypadek? Podziel się w komentarzu lub napisz do mnie na LinkedIn.