Lab 05 - Usługi w Linuksie, Docker
Usługi w Linuksie, Docker
Wprowadzenie do zarządzania usługami w systemie Linux
W tle Linuksa stale działa wiele usług, takich jak usługi sieciowe i systemowe. Usługi działające w systemie Linux są również znane jako daemony.
systemd
jest pakietem narzędzi wykorzystywanych przez większość współczesnych dystrybucji Linuksa. Wszystkie zadania systemowe mogą być kontrolowane poprzez systemd
. Proces może być uruchomiony lub zakończony za pomocą tego narzędzia. Można również za jego pomocą wyświetlić wszystkie włączone i wyłączone usługi wraz z informacjami o nich.
Listowanie usług za pomocą systemctl
Najprostszym sposobem na wylistowanie usług w Linuksie, gdy system wykorzystuje systemd
, jest użycie polecenia systemctl
, po którym następuje komenda list-units
. Można dodać opcję --type=service
w celu ograniczenia wyników tylko do usług.
systemctl list-units --type=service
Aby wyświetlić listę wszystkich usług, zarówno aktywnych jak i nieaktywnych, należy użyć polecenia systemctl list-units
, a następnie opcji --all
:
systemctl list-units --type=service --all
Uruchamianie usług
systemctl start [service_name]
Zatrzymywanie usług
systemctl stop [service_name]
Włączenie uruchamiania usługi podczas startu systemu
systemctl enable [service_name]
Wyłączenie uruchamiania usługi podczas startu systemu
systemctl disable [service_name]
Sprawdzanie statusu usługi
systemctl status [service_name]
Przeglądanie logów produkowanych przez usługi
Logi produkowane przez różne usługi są zapisywane przez systemd
poprzez daemona journald
. Aby zobaczyć logi, które zebrał daemon journald
, użyj polecenia journalctl
.
Kiedy komenda jest użyta samodzielnie, każdy wpis w dzienniku będzie wyświetlony w pagerze (zazwyczaj mniejszym) do przeglądania. Najstarsze wpisy będą na górze:
journalctl
Prawdopodobnie w dzienniku znajduje się spora liczba komunikatów (dziesiątki lub setki tysięcy linii). To pokazuje jak wiele logów znajduje się w bazie.
Wyświetlanie logów z bieżącego startu
Dodanie flagi -b
do journalctl
spowoduje filtrowanie logów, pokazując tylko dane zalogowane od ostatniego restartu systemu:
journalctl -b
Przeglądanie logów produkowanych przez konkretną usługę
journalctl -u [nazwa_usługi]
Tworzenie własnych usług w Linuksie
Czasami chcemy, żeby napisana aplikacja była kontrolowana przez systemd
. W niektórych przypadkach warto, aby skrypt był uruchamiany ponownie, gdy zostanie zabity z jakiegoś powodu. W takich przypadkach systemd
jest dobrym rozwiązaniem.
Utwórz plik o nazwie
[nazwa_usługi].service
w/etc/systemd/system
używając następującego szablonu:[Unit] Description=Opis uslugi [Service] User=nazwa_uzytkownika (np. root) ExecStart=bezwzgledna_sciezka_do_skryptu (np. /home/student/Desktop/script.sh) Restart=always [Install] WantedBy=multi-user.target
Dla projektów języka Python, które wykorzystują środowisko wirtualne:
[Unit] Description=Opis uslugi [Service] User=nazwa_uzytkownika (np. root) ExecStart=/home/user/virtualenv/bin/python main.py Restart=always # zastąp /home/user/virtualenv/bin/python swoim virtualenv i main.py swoim skryptem [Install] WantedBy=multi-user.target
Nadaj prawa do wykonywania skryptu poleceniem
chmod +x nazwa_skryptu
Przeładuj pliki usług, aby uwzględnić nową usługę:
sudo systemctl daemon-reload
Uruchom swoją usługę:
sudo systemctl start your-service.service
Przykładowy serwis i skrypt:
my_service.service:
[Unit]
Description=Opis uslugi
[Service]
User=jakub
ExecStart=/home/jakub/Desktop/print_messages.py
Restart=always
[Install]
WantedBy=multi-user.target
print_messages.py:
#!/usr/bin/env python3
import time
if __name__ == '__main__':
while True:
print('Hello world')
1) time.sleep(
lub dla basha:
#!/bin/bash
while $(sleep 1);
do
echo "hello world"
done
Tworząc własny skrypt, upewnij się, że umieściłeś w nim shebang line (pierwszą linijkę w powyższych przykładach).
🛠🔥 Zadanie 1 🛠🔥
Napisz aplikację w języku Python, która korzysta z biblioteki click. CLI (command line interface) aplikacji powinien przyjąć ścieżkę do jakiegoś pliku i czas w sekundach (tutaj nazwijmy go n
). Aplikacja powinna zapisywać losową liczbę wraz z aktualnym czasem do podanego pliku co n
sekund.
Napisz plik usługi, który będzie uruchamiał Twoją aplikację. Spróbuj dodać kilka instrukcji print
w swoim kodzie, abyś mógł sprawdzić czy logi są zbierane poprawnie. Włącz (enable) i uruchom (start) swoją nową usługę. Sprawdź status i logi. Spróbuj zrestartować swój system. Usługa powinna uruchomić się automatycznie.
Możesz chcieć stworzyć wirtualne środowisko (venv
) i zainstalować w nim bibliotekę click
.
Zakończ zadanie zatrzymując i wyłączając usługę. Usuń plik usługi z /etc/systemd/system
.
Docker
Instalacja
Może nie być wymagana w laboratorium.
Usunięcie starszych wersji Dockera:
sudo apt remove docker docker-engine docker.io containerd runc
Zaktualizuj i zainstaluj wymagane pakiety:
sudo apt update sudo apt install ca-certificates curl gnupg lsb-release
Dodaj oficjalny klucz GPG Dockera:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Skonfiguruj stabilne repozytorium Dockera:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Powyższe kroki i dalsza dokumentacja jest dostępna również tutaj.
Polecenia Dockera
Wylistowanie obrazów Dockera
docker images
Wylistowanie wszystkich kontenerów Dockera
docker ps -a
Uruchomienie kontenera
docker start <nazwa_kontenera>
Uruchomienie interaktywnej powłoki bash
w kontenerze
docker exec -it <nazwa_kontenera> bash
Skopiowanie pliku z hosta do kontenera
docker cp path/to/file/on/host <nazwa_kontenera>:path/to/file/in/container
Skopiowanie pliku z kontenera na hosta
docker cp <nazwa_kontenera>:path/to/file/in/container path/to/file/on/host
🛠🔥 Zadanie 2 🛠🔥
Przeczytaj Docker's get started (w sumie 10 części). Dokonaj konteneryzacji aplikacji z poprzedniego zadania. Aplikacja powinna używać bind mounts do zapisu do pliku znajdującego się w systemie plików hosta.
- Wskazówka 1: Możesz użyć Python image jako bazy dla obrazu aplikacji.
- Wskazówka 2: Możesz zainstalować wymagane pakiety (w tym przypadku
click
) globalnie, używającpip
podczas procesu budowania obrazu.
Uruchom aplikację i sprawdź logi. Spróbuj włączyć autostart z uruchomieniem systemu dla swojego kontenera.