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.

  1. 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
    
  2. 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
    
  3. Nadaj prawa do wykonywania skryptu poleceniem chmod +x nazwa_skryptu

  4. Przeładuj pliki usług, aby uwzględnić nową usługę:

    sudo systemctl daemon-reload
  5. 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')
        time.sleep(1)

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.

  1. Usunięcie starszych wersji Dockera:

    sudo apt remove docker docker-engine docker.io containerd runc
  2. Zaktualizuj i zainstaluj wymagane pakiety:

    sudo apt update
    
    sudo apt install ca-certificates curl gnupg lsb-release
  3. 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
  4. 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.

Uruchom aplikację i sprawdź logi. Spróbuj włączyć autostart z uruchomieniem systemu dla swojego kontenera.


Źródła