diff --git a/chapters/task-admin/img/containers-vs-vms.svg b/chapters/task-admin/img/containers-vs-vms.svg new file mode 100644 index 0000000..01b9e3f --- /dev/null +++ b/chapters/task-admin/img/containers-vs-vms.svg @@ -0,0 +1,4 @@ + + + +
Hardware
Hardware
Hardware
Hardware
Linux Kernel
Linux Kernel
Linux Kernel
Linux Kernel
Aplicație
Aplicație
Linux Kernel
Linux Kernel
Aplicație
Aplicație
Container
Container
Mașină Virtuală
Mașină Virtuală
Text is not SVG - cannot display
\ No newline at end of file diff --git a/chapters/task-admin/img/services-dashboards.png b/chapters/task-admin/img/services-dashboards.png new file mode 100644 index 0000000..fa55dd3 Binary files /dev/null and b/chapters/task-admin/img/services-dashboards.png differ diff --git a/chapters/task-admin/img/services-node-exporter.png b/chapters/task-admin/img/services-node-exporter.png new file mode 100644 index 0000000..4aa83a0 Binary files /dev/null and b/chapters/task-admin/img/services-node-exporter.png differ diff --git a/chapters/task-admin/services-config.rst b/chapters/task-admin/services-config.rst index 2e5b73c..d31da7e 100644 --- a/chapters/task-admin/services-config.rst +++ b/chapters/task-admin/services-config.rst @@ -1,47 +1,396 @@ +.. _task_admin_services_config: + Configurarea și administrarea serviciilor ========================================= -Scopul serviciilor este să ruleze în continuu și să primească cereri de la aplicații client, cum ar fi un client `ssh` și să răspundă la aceste cereri. -Serviciile sunt aplicații care rulează în continuu pe stație, spre deosebire de comenzi, cum ar fi `find` sau `ls` care rulează cât timp se execută comanda. -Deoarece ne dorim să avem majoritatea timpului conectivitate la mașină, sau ne dorim să avem acces la paginile web folosite, serverele care execută comenzi primite de la clienți rulează fără să se oprească. +Scopul serviciilor este să ruleze în continuu și să primească cereri de la aplicații client, cum ar fi un client SSH, și să răspundă la aceste cereri. +Serviciile sunt aplicații care rulează în continuu pe stație, spre deosebire de comenzi, cum ar fi ``find`` sau ``ls``, care rulează cât timp se execută comanda. +Serviciile mai sunt numite și aplicații server (server web, server SSH); +a nu se confunda cu servere ca echipamente fizice; +în această secțiune, noțiunea de "server" se va referi la aplicații server. +Deoarece ne dorim să avem majoritatea timpului conectivitate la sistem, sau ne dorim să avem acces la paginile web folosite, serverele rulează fără oprire și servesc cereri venite de la clienți. +Un server este oprit explicit de utilizator prin comenzi specifice sau este oprit la oprirea sistemului. +Fără o intervenție explicită și fără oprirea sistemului, un server va rula nedefinit. -Vrem să pornim diversele servicii din sistem care sunt instalate pe propria stație pentru a ne conecta la sistem, pentru a găzdui site-uri web și altele. -Avem nevoie de o interfață unică, cu o sintaxă minimală, care ne poate permite să gestionăm serviciile pe sistem, cum le pornim, oprim și cum putem să generăm noi propriile servicii. +Vrem să pornim și să configurăm servicii instalate în sistem, precum: -Comanda folosită pentru gestionarea serviciilor este `systemctl`. -Aceasta se regăsește pe majoritatea distribuțiilor moderne de Linux. +* un server web; + +* un server SSH, pentru a ne conecta la stație; + +* un serviciu care ține un tunel SSH deschis către stație. + +Avem nevoie de o interfață unică, cu o sintaxă minimală, care ne permite să gestionăm serviciile pe sistem, și care ne permite sa generăm noi propriile servicii. + +.. _task_admin_services_config_usage: Lucrul cu serviciile în Linux ----------------------------- -Inițial ne vom uita la servicii predefinite în Linux. -Vom preciza cum se instalează serviciile predefinite. +Comanda folosită pentru gestionarea serviciilor este ``systemctl``. +Aceasta se regăsește pe majoritatea distribuțiilor moderne de Linux. -Vom verifica starea de funcționare a serviciului SSH, deoarece știu și au auzit deja de el. +.. _task_admin_services_config_usage_status: Verificarea stării unui serviciu ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Atunci când instalăm o aplicație care rulează sub forma unui serviciu, vom putea să îi verificăm starea folosind comanda ``systemctl status``: + +.. code-block:: + + student@uso:~$ systemctl status ssh + ● ssh.service - OpenBSD Secure Shell server + Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) + Active: active (running) since Sat 2021-01-09 04:22:11 EET; 1min 17s ago + Docs: man:sshd(8) + man:sshd_config(5) + Process: 639 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) + Main PID: 657 (sshd) + Tasks: 1 (limit: 4656) + Memory: 4.8M + CGroup: /system.slice/ssh.service + └─657 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups + + ian 09 04:22:11 uso systemd[1]: Starting OpenBSD Secure Shell server... + ian 09 04:22:11 uso sshd[657]: Server listening on 0.0.0.0 port 22. + ian 09 04:22:11 uso sshd[657]: Server listening on :: port 22. + ian 09 04:22:11 uso systemd[1]: Started OpenBSD Secure Shell server. + ian 09 04:23:25 uso sshd[1821]: Accepted password for student from 192.168.56.1 port 33714 ssh2 + ian 09 04:23:25 uso sshd[1821]: pam_unix(sshd:session): session opened for user student by (uid=0) + +Mai sus am afișat starea serviciului SSH. +Observăm că acesta este activ și putem urmări ce procese a generat și ce mesaje de diagnosticare afișează. + +Programul ``systemd`` se ocupă de pornirea, oprirea și gestionarea serviciilor folosite în sistem pe baza unor fișiere numite fișiere unitate. +Fișierul care gestionează serviciul SSH este ``/lib/systemd/system/ssh.service``. +Îl putem identifica din rezultatul comenzii ``systemctl status``. + +Atunci când un serviciu este instalat, acesta vine la pachet cu fișierul cu extensia ``.service`` cu care acesta va fi gestionat de ``systemd``, după cum putem vedea în rezultatul comenzii de mai jos [#ntp]_: + +.. code-block:: + + student@uso:~$ sudo apt install ntp + [...] + Setting up ntp (1:4.2.8p12+dfsg-3ubuntu4) ... + Created symlink /etc/systemd/system/network-pre.target.wants/ntp-systemd-netif.path → /lib/systemd/system/ntp-systemd-netif.path. + Created symlink /etc/systemd/system/multi-user.target.wants/ntp.service → /lib/systemd/system/ntp.service. + ntp-systemd-netif.service is a disabled or a static unit, not starting it. + [...] + +.. _task_admin_services_config_usage_status_ex: + +Exercițiu: Afișarea stării serviciilor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Afișați starea serviciului ``thermald``, care gestionează senzorii de temperatură ai sistemului. + +.. _task_admin_services_config_usage_stop: + Oprirea unui serviciu ^^^^^^^^^^^^^^^^^^^^^ -Îi punem să oprească serviciul SSH și testează dacă mai merge SSH-ul +Pentru a opri un serviciu vom folosi comanda ``systemctl stop``: + +.. code-block:: + + student@uso:~$ sudo netstat -tlpn + [sudo] password for student: + Active Internet connections (only servers) + Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 501/systemd-resolve + tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4425/sshd: /usr/sbi + tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 541/cupsd + tcp6 0 0 :::22 :::* LISTEN 4425/sshd: /usr/sbi + tcp6 0 0 ::1:631 :::* LISTEN 541/cupsd + student@uso:~$ sudo systemctl stop ssh + [sudo] password for student: + student@uso:~$ sudo systemctl status ssh + ● ssh.service - OpenBSD Secure Shell server + Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: e> + Active: inactive (dead) since Sat 2021-01-09 04:58:28 EET; 9s ago + Docs: man:sshd(8) + man:sshd_config(5) + Process: 640 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) + Process: 660 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/> + Main PID: 660 (code=exited, status=0/SUCCESS) + + ian 09 04:57:29 uso systemd[1]: Starting OpenBSD Secure Shell server... + ian 09 04:57:29 uso sshd[660]: Server listening on 0.0.0.0 port 22. + ian 09 04:57:29 uso sshd[660]: Server listening on :: port 22. + ian 09 04:57:29 uso systemd[1]: Started OpenBSD Secure Shell server. + ian 09 04:58:28 uso sshd[660]: Received signal 15; terminating. + ian 09 04:58:28 uso systemd[1]: Stopping OpenBSD Secure Shell server... + ian 09 04:58:28 uso systemd[1]: ssh.service: Succeeded. + ian 09 04:58:28 uso systemd[1]: Stopped OpenBSD Secure Shell server. + +Pentru a verifica dacă mai funcționează serviciul SSH, vom folosi comanda ``netstat``: + +.. code-block:: + + student@uso:~$ sudo netstat -tlpn + Active Internet connections (only servers) + Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 501/systemd-resolve + tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 541/cupsd + tcp6 0 0 ::1:631 :::* LISTEN 541/cupsd + +Opțiunea ``-tlpn`` (de la *TCP connections*, *listening applications* - servicii, *program name*, *numeric values*) ne afișează serviciile de rețea TCP active. +De avut în vedere că nu toate serviciile sunt servicii de rețea, deci ``netstat`` nu va afișa informații despre toate serviciile. +Observăm că nu ascultă niciun program pe portul ``22``. + +Recapitulare: Afișarea stării serviciilor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Afișați starea serviciului ``ssh``. + +.. _task_admin_services_config_usage_start: Pornirea unui serviciu ^^^^^^^^^^^^^^^^^^^^^^ -Îi punem să pornească serviciul SSH și testează dacă merge SSH-ul. +Pornirea unui serviciu se face folosind comanda ``systemctl start`` în felul următor: + +.. code-block:: + + student@uso:~$ systemctl start ssh + student@uso:~$ systemctl status ssh + ● ssh.service - OpenBSD Secure Shell server + Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) + Active: active (running) since Sat 2021-01-09 05:05:30 EET; 2min 30s ago + Docs: man:sshd(8) + man:sshd_config(5) + Process: 4408 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) + Main PID: 4425 (sshd) + Tasks: 1 (limit: 4656) + Memory: 3.4M + CGroup: /system.slice/ssh.service + └─4425 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups + + ian 09 05:05:30 uso systemd[1]: Starting OpenBSD Secure Shell server... + ian 09 05:05:30 uso sshd[4425]: Server listening on 0.0.0.0 port 22. + ian 09 05:05:30 uso sshd[4425]: Server listening on :: port 22. + ian 09 05:05:30 uso systemd[1]: Started OpenBSD Secure Shell server. + ian 09 05:05:54 uso sshd[4477]: Accepted password for student from 192.168.56.1 port 34852 ssh2 + ian 09 05:05:54 uso sshd[4477]: pam_unix(sshd:session): session opened for user student by (uid=0) + +Dacă serviciul nu pornește cu succes, aceasta va afișa un mesaj de avertizare. + +.. _task_admin_services_config_usage_restart: Repornirea unui serviciu ^^^^^^^^^^^^^^^^^^^^^^^^ -Îi pune să schimbe `PermitRootLogin` din fișierul de configurare și îi punem să oprească și să îl repornească, pentru a vedea că opțiunea și-a făcut efectul +Pe parcursul rulării serviciilor pe un sistem, vom dori să schimbăm configurația unui serviciu sau să adăugăm parametri de rulare în plus. +Majoritatea aplicațiilor citesc fișierele de configurare o singură dată, atunci când sunt pornite, deci orice modificare ulterioară a fișierelor de configurare nu va fi sesizată de serviciu. +Din acest motiv, avem nevoie să repornim servicii care să își modifice comportamentul în funcție de actualizările fișierelor de configurare. + +De exemplu, vrem să permitem utilizatorilor să se autentifice ca utilizatorul ``root`` pe sistemul nostru. +Din motive de securitate acest lucru este dezactivat în mod predefinit în configurația serviciului SSH. + +.. code-block:: + + student@uso:~$ ssh root@localhost + root@localhost's password: + Permission denied, please try again. + [...] + +Observăm că inițial nu puteam să ne conectăm la mașina locală ca utilizatorul ``root``, cu toate că introduceam parola corectă. + +.. code-block:: + + student@uso:~$ sudo su -c 'echo "PermitRootLogin yes" >> /etc/ssh/sshd_config' + student@uso:~$ systemctl restart ssh + student@uso:~$ ssh root@localhost + root@localhost's password: + [...] + root@uso:~# + +Pentru a face acest lucru, avem nevoie să reconfigurăm și să repornim serviciul SSH. +Odată ce am adăugat opțiunea ``PermitRootLogin yes`` în fișierul de configurare al serviciului și am repornit serviciului, am reușit să ne autentificăm ca utilizatorul ``root``. + +.. _task_admin_services_config_usage_enable: + +Pornirea unui serviciu la startup +""""""""""""""""""""""""""""""""" + +Atunci când configurăm un sistem și vrem să definim servicii care rulează pe acesta, ne dorim ca serviciile să fie ``setup and forget``, să nu fie necesar să le supraveghem prea mult. +Un mod de a ne ușura lucrul cu serverul este pornirea serviciilor la startup, ca să nu fie nevoie sa intervenim noi după secvența de pornire a sistemului, ca să le pornim de mână, folosind comanda ``systemctl start`` + +RD: Poate ar merge mai sus o referință analogie cu montarea automată SSHFS prin configurarea /etc/fstab. + +Putem să vedem dacă un sistem pornește automat la startup urmărind rezultatul comenzii ``systemctl status``; +În rezultatul comenzii urmărim linia care începe cu ``Loaded:``. +Dacă rezultatul conține șirul de caractere ``enabled``, atunci serviciul pornește la startup. +Dacă aceasta conține șirul ``disabled``, atunci serviciul nu va porni la startup. + +Pentru a dezactiva un serviciu la startup vom folosi comanda ``systemctl disable``: + +.. code-block:: + + student@uso:~$ sudo systemctl disable ntp + Synchronizing state of ntp.service with SysV service script with /lib/systemd/systemd-sysv-install. + Executing: /lib/systemd/systemd-sysv-install disable ntp + Removed /etc/systemd/system/multi-user.target.wants/ntp.service. + student@uso:~$ sudo systemctl status ntp + ● ntp.service - Network Time Service + Loaded: loaded (/lib/systemd/system/ntp.service; disabled; vendor preset: enabled) + Active: active (running) since Sat 2021-01-09 05:18:49 EET; 27min ago + Docs: man:ntpd(8) + Main PID: 9756 (ntpd) + Tasks: 2 (limit: 4656) + Memory: 1.3M + CGroup: /system.slice/ntp.service + └─9756 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 127:134 + + ian 09 05:18:55 uso ntpd[9756]: Soliciting pool server 185.173.16.132 + ian 09 05:24:31 uso ntpd[9756]: kernel reports TIME_ERROR: 0x2041: Clock Unsynchronized + ian 09 05:28:41 uso ntpd[9756]: 91.189.91.157 local addr 10.0.2.15 -> + ian 09 05:29:00 uso ntpd[9756]: 85.204.240.2 local addr 10.0.2.15 -> + ian 09 05:29:04 uso ntpd[9756]: 188.213.49.35 local addr 10.0.2.15 -> + ian 09 05:29:05 uso ntpd[9756]: 86.124.75.41 local addr 10.0.2.15 -> + ian 09 05:29:08 uso ntpd[9756]: 85.204.240.1 local addr 10.0.2.15 -> + ian 09 05:29:09 uso ntpd[9756]: 195.135.194.3 local addr 10.0.2.15 -> + ian 09 05:29:52 uso ntpd[9756]: 91.189.89.198 local addr 10.0.2.15 -> + ian 09 05:38:03 uso ntpd[9756]: 93.190.144.28 local addr 10.0.2.15 -> + +Observăm că pe linia care conține șirul de caractere ``Loaded``, mesajul este ``disabled``, dar serviciul funcționează în continuare. + +Pentru a activa un serviciu la startup vom folosi comanda ``systemctl enable``: + +.. code-block:: + + student@uso:~$ sudo systemctl enable ntp + Synchronizing state of ntp.service with SysV service script with /lib/systemd/systemd-sysv-install. + Executing: /lib/systemd/systemd-sysv-install enable ntp + Created symlink /etc/systemd/system/multi-user.target.wants/ntp.service → /lib/systemd/system/ntp.service. + student@uso:~$ sudo systemctl status ntp + ● ntp.service - Network Time Service + Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled) + Active: active (running) since Sat 2021-01-09 05:18:49 EET; 30min ago + Docs: man:ntpd(8) + Main PID: 9756 (ntpd) + Tasks: 2 (limit: 4656) + Memory: 1.3M + CGroup: /system.slice/ntp.service + └─9756 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 127:134 + + ian 09 05:18:55 uso ntpd[9756]: Soliciting pool server 185.173.16.132 + ian 09 05:24:31 uso ntpd[9756]: kernel reports TIME_ERROR: 0x2041: Clock Unsynchronized + ian 09 05:28:41 uso ntpd[9756]: 91.189.91.157 local addr 10.0.2.15 -> + ian 09 05:29:00 uso ntpd[9756]: 85.204.240.2 local addr 10.0.2.15 -> + ian 09 05:29:04 uso ntpd[9756]: 188.213.49.35 local addr 10.0.2.15 -> + ian 09 05:29:05 uso ntpd[9756]: 86.124.75.41 local addr 10.0.2.15 -> + ian 09 05:29:08 uso ntpd[9756]: 85.204.240.1 local addr 10.0.2.15 -> + ian 09 05:29:09 uso ntpd[9756]: 195.135.194.3 local addr 10.0.2.15 -> + ian 09 05:29:52 uso ntpd[9756]: 91.189.89.198 local addr 10.0.2.15 -> + ian 09 05:38:03 uso ntpd[9756]: 93.190.144.28 local addr 10.0.2.15 -> + +Observăm că pe linia care conține șirul de caractere ``Loaded``, mesajul s-a schimbat în ``enabled``. + +.. _task_admin_services_config_config: Configurarea unui serviciu ^^^^^^^^^^^^^^^^^^^^^^^^^^ +În majoritatea cazurilor, serviciile sunt configurate prin fișiere de configurare. +Acestea se pot găsi în diferite locuri în sistemul de fișiere, depinzând de serviciu, sistem de operare, distribuție. +Locuri uzuale pentru fișiere de configurare sunt: + +* ``/etc/default/``, unde sunt fișiere care permit modificarea opțiunilor de rulare a unei comenzi. + Aceste fișiere sunt citite de ``systemd``, înainte să pornească serviciul; +* directorul ``/etc/nume_serviciu/`` , unde se află fișierele de configurare sau direct fișierul ``/etc/nume_serviciu``. + Aceste fișiere sunt citite și interpretate de servici. + De exemplu, pentru configurarea serviciului NTP, există fișierul ``/etc/ntp.conf``, iar pentru configurarea serviciului SSH folosim fișierele din directorul ``/etc/ssh/``. + +.. _task_admin_services_config_ex: + +Exerciții: Gestiunea serviciilor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. Configurați serviciul SSH pentru a permite autentificarea ca utilizatorul ``root`` folosind numai autentificare bazată pe chei. + +#. Instalați serviciul ``vsftpd``, un serviciu de transfer de fișiere. + + #. Realizați modificările necesare astfel încât acest serviciu să **NU** pornească la startup. + + #. Dezactivați funcționalitatea bazată pe IPv6 a serviciului. + **Hint**: ``listen_ipv6``, ``listen``. + + #. Asigurați-vă că serviciul rulează. + În implicit, serviciul ascultă conexiuni de rețea pe portul TCP ``21``. + +.. _task_admin_services_config_custom: + Definirea unui serviciu personalizat ------------------------------------ -Îi vom pune să își facă singuri un serviciu care face proxy ssh într-un container în care rulează o pagină web care ascultă doar pe localhost. -Vor putea să acceseze acest proxy din browser. +Atunci când vrem să ne conectăm la Internet printr-un proxy, avem nevoie ca proxy-ul să fie deschis în permanență și să redeschidă conexiunea în cazul în care aceasta este întreruptă. +Putem să facem acest lucru folosind servicii ``systemd`` pe care să le gestionăm noi folosind suita de comenzi ``systemctl``. + +Ne propunem să găzduim propriul proxy care va trimite mesaje criptate prin SSH către o altă stație, de unde vor fi trimise mesaje în Internet. +Astfel vom putea trece peste anumite filtre care țin cont de poziția geografică. + +Un serviciu în ``systemd`` se definește printr-un fișier de configurare în directorul ``/lib/systemd/system/libvirtd.service``. +Pentru serviciul nostru vom genera fișierul la calea ``/lib/systemd/system/libvirtd.service/auto-proxy.service``. +Acest fișier va avea următorul conținut: + +.. code-block:: + + [Unit] + Description=Keeps a proxy to 'fep.grid.pub.ro' open + After=network-online.target ssh.service + + [Service] + User=student + ExecStart=/usr/bin/ssh -D 1337 -q -C -N @fep.grid.pub.ro + ExecStop=/usr/bin/pkill -f '/usr/bin/ssh -D 1337 -q -C -N' + KillMode=process + Type=simple + Restart=always + RestartSec=10 + + [Install] + WantedBy=multi-user.target + +Acesta este un șablon pe care putem să îl folosim pentru multe tipuri de servicii. Opțiunile relevante pentru înțelegerea formatului sunt: + +* ``ExecStart``, comanda care se va executa pentru a porni serviciul; +* ``ExecStop``, comanda care se va executa pentru a opri serviciul. + +.. admonition:: Atenție + + Pentru ca acest serviciu să funcționeze, este necesar să copiați cheia stației ``uso`` pe mașina ``fep.grid.pub.ro``. + +Putem să verificăm dacă a pornit proxy-ul verificând dacă ascultă vreun serviciu pe mașina locală pe portul ``1337``: + +.. code-block:: + + student@uso:~$ sudo netstat -tlpn + Active Internet connections (only servers) + Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name + tcp 0 0 127.0.0.1:1337 0.0.0.0:* LISTEN 32177/ssh + tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 15794/vsftpd + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 7088/systemd-resolv + tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 10459/sshd: /usr/sb + tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 541/cupsd + tcp6 0 0 ::1:1337 :::* LISTEN 32177/ssh + tcp6 0 0 :::22 :::* LISTEN 10459/sshd: /usr/sb + tcp6 0 0 ::1:631 :::* LISTEN 541/cupsd + +.. _task_admin_services_config_custom_ex: + +Exercițiu: Definirea unui serviciu personalizat +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Realizați configurația necesară astfel încât să creați un tunel deschis permanent de pe stația ``uso``, care primește mesaje din portul ``4242`` al stației de la adresa ``10.10.10.3`` și le trimite către portul ``22`` al mașinii locale. + +RD: Ori suplimentar, ori îl locul acestui exercițiu, le-aș da un link și le-aș spune să configureze ``autossh`` în mod persistent. +Mai ales că e varianta sănătoasă și realistă. + +.. rubric:: Note de subsol + +.. [#ntp] + + Serviciul ``ntp`` este folosit pentru sincronizarea ceasului cu surse precise de timp din Internet. + Acesta este un serviciu important pentru buna funcționare a aplicațiilor în Internet, deoarece o configurare a timpului pentru o stație poate duce la o funcționare incorectă a acesteia în comunicare. diff --git a/chapters/task-admin/services-install.rst b/chapters/task-admin/services-install.rst index e3b32a2..d246941 100644 --- a/chapters/task-admin/services-install.rst +++ b/chapters/task-admin/services-install.rst @@ -1,58 +1,422 @@ Instalarea aplicațiilor (serviciilor) folosind Docker ===================================================== -Scopul acestui capitol este să îi introducem pe studenți în instalarea, folosirea containerelor și în instalarea serviciilor folosind containerele. +Scopul acestui capitol este să vă introducem în instalarea, folosirea containerelor și în instalarea serviciilor folosind containerele. Instalarea serviciilor nu este o operație ușoară. Acestea depind de aplicații și biblioteci care uneori nu sunt disponibile, sau nu există versiunile necesare pentru distribuția noastră. O altă problemă vine de la faptul că serviciile nu sunt de tipul "plug-and-play", adică nu oferă o configurație simplă care să permită rularea serviciului imediat după instalarea aplicației. -Docker vine ca o soluție pentru această problemă, deoarece acesta ne oferă servicii pre-împachetate cu dependențele pe care le are serviciul respectiv și cu configurările necesare pentru rularea serviciului. +`Docker `_ vine ca o soluție pentru această problemă, deoarece acesta ne oferă servicii pre-împachetate cu dependențele pe care le are serviciul respectiv și cu configurările necesare pentru rularea serviciului. Un alt avantaj al folosirii Docker este că mediul oferit de Docker este unul izolat și efemer, adică o aplicație care rulează în Docker nu are acces în mod obișnuit la restul sistemului, iar orice modificare asupra sistemului de fișiere din Docker nu se va reflecta asupra sistemului. +Containerele sunt un mediu în care putem rula aplicații izolate de sistemul gazdă. + +În sistemele de operare bazate pe Linux, containerele sunt rulate ca o aplicație care are acces la resursele stației gazdă, dar care poate interacționa cu procesele din afara mediului izolat. + +Avantajul utilizării unui container pentru rularea aplicațiilor este că poate fi pornit, modificat și oprit cu ușurință. +Astfel, putem instala aplicații într-un container, le putem configura și rula fără a afecta celelalte componente ale sistemului. + Folosirea Docker ---------------- -În această subsecțiune studenții vor învăța cum să folosească Docker ca să pornească un container, cum să descarce un container, cum să se conecteze la un container. -Nu punem accentul pe crearea containerelor ci pe folosirea lor. +Un caz de utilizare în care rulăm containere este atunci când vrem să setăm un server care depinde de versiuni specifice ale anumitor biblioteci. +Nu vrem să rulăm acel server pe sistemul nostru fizic, deoarece pot apărea conflicte cu alte aplicații. +Rulând aplicația într-un container, putem avea o versiune a bibliotecii instalată pe mașina fizică și o altă versiune instalată în container fără conflict între ele. + +Containere versus mașini virtuale +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Atât containerele cât și mașinile virtuale ne permit să rulăm aplicații într-un mediu izolat. +Totuși, există diferențe fundamentale între cele două mecanisme. +Conform schemei de mai jos, un container rulează direct peste nucleul sistemului de operare gazdă. +În schimb, o mașină virtuală execută propriul nucleu care apoi rulează aplicațiile. +Acest nivel în plus de operații executate adaugă overhead rulării aplicațiilor dorite, iar overheadul încetinește viteza de execuție. + +.. figure:: ./img/containers-vs-vms.svg + :scale: 45% + :alt: Containers versus VM overhead + + +Un alt avantaj al containerelor este abilitatea de a le construi iterativ. +Noi putem să descărcăm cu ușurință un container de pe un repository public, să îl modificăm și să îl încărcăm într-un repository public fără să încărcăm întreaga imagine. +Putem face asta, deoarece modificările asupra unui container sunt făcute iterativ, salvând diferențele dintre imaginea inițială și versiunea modificată. + +Există și cazuri în care vrem să rulăm aplicațiile în interiorul unei mașini virtuale. +De exemplu, dacă vrem să rulăm o aplicație compilată pentru un alt sistem de operare în afară de Linux, nu vom putea face asta, deoarece containerele pot executa aplicații care sunt compilate pentru sistemul de operare gazdă. +Mașinile virtuale pot să ruleze și sisteme de operare diferite de sistemul de operare gazdă. Gestionarea containerelor ^^^^^^^^^^^^^^^^^^^^^^^^^ În această sub-subsecțiune vom prezenta cum să descarce și cum să pornească un container care oferă o pagină web simplă, ca apoi să oprească containerul. -Conectarea la un container -^^^^^^^^^^^^^^^^^^^^^^^^^^ +Pentru a porni o aplicație în interiorul unui container Docker folosim următoarea comandă: + +.. code-block:: bash + + student@uso:~$ docker run -it ubuntu:18.04 bash + Unable to find image 'ubuntu:18.04' locally + 18.04: Pulling from library/ubuntu + 92dc2a97ff99: Pull complete + be13a9d27eb8: Pull complete + c8299583700a: Pull complete + Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26 + Status: Downloaded newer image for ubuntu:18.04 + root@86c268b30cd6:/# + +Comanda ``docker`` a fost rulată folosind următorii parametrii: + +* ``run``, pornește un container; +* ``-i``, pornește un container "interactiv", care acceptă input de la tastatură; +* ``-t``, asociază un termina virtual comenzii rulate; +* ``ubuntu:18.04`` este numele imaginii pe care vrem să o folosim. `Dockerhub `_ este un repository public de imagini de unde putem descărca imagini deja construite; +* ``bash``, comanda pe care vrem să o rulăm în cadrul containerului. + +Putem rula și o comandă neinteractivă în container în felul următor: + +.. code-block:: bash + + student@uso:~$ docker run ubuntu:18.04 ps -ef + UID PID PPID C STIME TTY TIME CMD + root 1 0 0 12:01 ? 00:00:00 ps -ef + +* instalarea facilă a unui serviciu +* configurarea unui mediu de dezvoltare izolat +* replicarea unui serviciu din producție local +* configurarea unui mediu replicabil pentru testare + +.. note:: + + Comanda ``ps -ef`` afișează toate procesele active din sistem. + Observăm că în rezultatul de mai sus apare o singură comandă, deoarece rulăm într-un mediu izolat. + + +Cu toate acestea, nu dorim să rulăm întotdeauna containere în prim plan. +Dacă vrem să rulăm un script care nu poate fi rulat în mediul gazdă, iar acest script va rula mult timp, preferăm să rulăm comanda în fundal. -În această sub-subsecțiune vor învăța cum să se conecteze la containerul de la secțiunea anterioară și vor modifica pagina web afișată. +Pentru a rula un script în fundal în cadrul unui container Docker vom folosi opțiunea ``-d`` a comenzii ``docker run`` în felul următor: + +.. code-block:: bash + + student@lab-docker:~$ sudo docker run -d ubuntu:18.04 sleep 10000 + a63ee06826a33c0dfab825a0cb2032eee2459e0721517777ee019f59e69ebc02 + student@lab-docker:~$ sudo docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + a63ee06826a3 ubuntu:18.04 "sleep 10000" 7 seconds ago Up 5 seconds wonderful_lewin + student@lab-docker:~$ sudo docker exec -it a63ee06826a3 /bin/bash + root@a63ee06826a3:/# ps -ef + UID PID PPID C STIME TTY TIME CMD + root 1 0 0 02:19 ? 00:00:00 sleep 10000 + root 7 0 2 02:19 pts/0 00:00:00 /bin/bash + root 19 7 0 02:20 pts/0 00:00:00 ps -ef + root@a63ee06826a3:/# exit + +Putem vedea dacă containerul pornit de noi încă rulează rulând comanda ``docker ps``. +Coloane relevante sunt: + +* ``CONTAINER ID``; +* ``NAMES``. + +Pentru a ne conecta la un container care rulează în fundal, ne folosim de comanda ``docker exec`` împreună cu ID-ul containerului sau numele selectat folosind comanda ``docker ps``: + +.. code-block:: bash + + student@lab-docker:~$ sudo docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + a63ee06826a3 ubuntu:18.04 "sleep 10000" 7 seconds ago Up 5 seconds wonderful_lewin + student@lab-docker:~$ sudo docker exec -it a63ee06826a3 /bin/bash + root@a63ee06826a3:/# ps -ef + UID PID PPID C STIME TTY TIME CMD + root 1 0 0 02:19 ? 00:00:00 sleep 10000 + root 7 0 2 02:19 pts/0 00:00:00 /bin/bash + root 19 7 0 02:20 pts/0 00:00:00 ps -ef + root@a63ee06826a3:/# exit + +Pentru a opri un container care rulează în fundal, utilizați comanda ``docker stop`` împreună cu ID-ul sau numele containerului, în felul următor: + +.. code-block:: bash + + student@lab-docker:~$ sudo docker stop a63ee06826a3 + a63ee06826a3 + student@lab-docker:~$ sudo docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + student@lab-docker:~$ + + +Exerciții: Gestionarea containerelor +"""""""""""""""""""""""""""""""""""" + +* Porniți un nou container în fundal folosind imaginea de bază ``centos:7``; +* Conectați-vă la containerul tocmai pornit și instalați aplicația ``bind-utils`` folosind comanda ``yum install bind-utils``. Pentru a verifica faptu că ați instalat aplicația corect, verificați-vă rulând comanda ``nslookup google.com``; +* Deconectați-vă de la container și opriți-l. Instalarea serviciilor folosind Docker -------------------------------------- Cum am prezentat mai devreme, un avantaj al folosirii containerelor este faptul că putem să descărcăm containere care pot rula servicii. -Aceste servicii nu vor mai fi lansate și gestionate de aplicația systemd care rulează pe stația de lucru, deoarece acestea vor rula în cadrul unui container care va gestiona rularea serviciului. +Aceste servicii nu vor mai fi lansate și gestionate de aplicația ``systemd`` care rulează pe stația de lucru, deoarece acestea vor rula în cadrul unui container care va gestiona rularea serviciului. Noi trebuie doar să ne asigurăm ca rulăm containerul folosind opțiunile potrivite. -Identificarea containerelor pe Dockerhub +Identificarea containerelor pe DockerHub ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Precum aplicațiile obișnuite, și containerele Docker pot fi descărcate dintr-un repository central. -Repository-ul central pentru containere este Dockerhub. -Noi vom folosi site-ul Dockerhub pentru a căuta containere împreună cu instrucțiuni de folosire ale acestora. +Repository-ul central pentru containere pe care îl vom folosi este `DockerHub `_. Acesta nu este singurul repository de containere pe care putem să îl folosim, dar este cel mai vast. +Vom folosi site-ul DockerHub pentru a căuta containere împreună cu instrucțiuni de folosire ale acestora. + +Studiu de caz: Instalarea unui server de Minecraft folosind containere +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +În următoarea secțiune vom prezenta un studiu de caz pentru rularea unui server de Minecraft și monitorizarea lui folosind containere. + +Pentru a descărca imaginea unui container pentru un server de Minecraft, trebuie să identificăm un serviciu deja containerizat pe DockerHub. +Vom face asta folosind funcția de căutare oferită de platformă. + +În alegerea unui container pe care să îl folosim trebuie să avem în vedere următorii factori: + +* numărul de persoane care au descărcat deja containerul; ne dorim să folosim un serviciu are a fost folosit și verificat de cât mai mulți utilizatori; +* data ultimului update; în general cu cât sunt actualizări mai noi, cu atât este mai bun suportul pentru serviciu; +* starea documentației; cu cât instrucțiunile pentru configurare sunt mai complete și concise, cu atât ne putem baza pe faptul că nu vom petrece mult timp în pregătirea mediului de rulare al containerului. + +Conform instrucțiunilor de instalare din pagina containerului, putem porni serviciul folosind comanda următoare: + +.. code-block:: bash + + student@uso:~/.../labs/09-task-admin/lab-container$ sudo docker run -d -p 25565:25565 --name mc itzg/minecraft-server + Unable to find image 'itzg/minecraft-server:latest' locally + latest: Pulling from itzg/minecraft-server + 675920708c8b: Pull complete + 74b551139104: Pull complete + c290a58bcfd7: Pull complete + 4d6bcabdde06: Pull complete + 02ff7afd9866: Pull complete + 58640237d5df: Pull complete + d9165be859a2: Pull complete + 575fb4190f2f: Pull complete + c3c6d5d36ce5: Pull complete + 9f1d7790dab7: Pull complete + a7a32c154b26: Pull complete + e253f974e9a6: Pull complete + d61d99ed5e98: Pull complete + c78f023f58b3: Pull complete + 70401c8e828a: Pull complete + 4f4fb700ef54: Pull complete + 087988aa5331: Pull complete + 13ee4174c665: Pull complete + 9381121a4fe0: Pull complete + 6a8a23430798: Pull complete + b5b33c72ea51: Pull complete + edf873f8c85d: Pull complete + Digest: sha256:0697315bd265c751821d5796662436efd94edea8e77b42a7404dab22586af73f + Status: Downloaded newer image for itzg/minecraft-server:latest + 53a920004fa8316ef87e4776f57f6b826825edf8237d08b9791c1936f40e50e2 + student@uso:~/.../labs/09-task-admin/lab-container$ sudo docker image ls + REPOSITORY TAG IMAGE ID CREATED SIZE + itzg/minecraft-server latest 616bdcb51f15 7 days ago 670MB + student@uso:~/.../labs/09-task-admin/lab-container$ sudo docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 53a920004fa8 itzg/minecraft-server "/start" 5 seconds ago Up 4 seconds (health: starting) 0.0.0.0:25565->25565/tcp, :::25565->25565/tcp, 25575/tcp mc + +Am folosit opțiunea ``--name`` a utilitarului ``docker run`` pentru a specifica un nume ușor de reținut pentru containerul pornit, în cazul acesta numele este ``mc``. Am adăugat opțiunea ``-p`` pentru a deschide portul ``25565`` pe mașină pe care rulează containerul, port pe care se realizează comunicarea cu serverul de Minecraft. + +Observăm că a fost descărcat containerul și a început să ruleze. +Pentru a verifica faptul că am descărcat imaginea containerului, rulăm comanda ``docker image ls``, care listează toate containerele de pe sistem. +Regăsim în lista containerelor imaginea cu numele ``itzg/minecraft-server``. + +Pentru a verifica funcționarea containerului ne vom conecta la serverul de Minecraft folosind portul expus mai sus. + +.. code-block:: bash + + student@uso:~/.../labs/09-task-admin/lab-container$ curl localhost:25565 + {"translate":"disconnect.genericReason","with":["Internal Exception: io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: Index 69 out of bounds for length 1"]} + student@uso:~/.../labs/09-task-admin/lab-container$ + +Observăm că am primit înapoi o eroare de Java, asta înseamnă că serverul de Minecraft, care este bazat pe limbajul de programare Java, este accesibil. +Eroarea apare deoarece încercam să accesăm containerul folosind un client HTTP, în loc de a folosi Java + +Folosirea Docker Compose pentru gestiunea containerelor complexe +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +După cum putem vedea din exemplul de mai sus, putem porni containerele folosind comanda ``docker run``, dar asta înseamnă rularea unei comenzi pentru fiecare container. +Acest lucru este simplu atunci când trebuie să pornim doar două containere, dar dacă vrem să pornim mai mult de două containere, sau dacă vrem să folosim o soluție "one click" și folosim o suită de containere necesare pentru soluția noastră, avem nevoie de o nouă metodă de pornire a containerelor. + +Soluția la această problemă este serviciul Docker Compose. +Acesta permite unui utilizator să scrie o specificație pentru un mediu de lucru, inclusiv opțiuni pentru rularea containerelor, volumele atașate containerelor și rețelele prin care containerele vor comunica. + +Comanda folosită pentru gestionarea containerelor este ``docker-compose``, iar specificația containerelor este scrisă în fișierul ``docker-compose.yml``. + +Formatului fișierului ``docker-compose.yml`` este de forma: + +.. code-block:: bash + + services: + nume_serviciu: + image: + volumes: + + ports: + + environment: + + volumes: + nume_volum: + networks: + nume_rețele: + +Serviciul de vizualizare Grafana este un standard în industrie pentru afișarea graficelor de diverse forme și alertarea bazată pe condiții specificate de utilizator. + +Grafana se folosește de o bază de date și de un agregator de informații. +Un agregator des folosit în Grafana este Prometheus, care poate să se conecteze la clienți externi și să descarce informații de la aplicații care expun informații numite exportere. + +Ambele servicii folosesc fișiere și variabile de configurare complexe pentru specificarea modului de rulare. +Din această cauză, nu este facil să rulăm comenzile de pornire ale lor direct în line de comandă. + +Ne dorim să monitorizăm serverul de Minecraft, pentru a observa cum se schimbă folosirea resurselor. +Vom folosi exporterul ``node-exporter`` pentru colectarea informațiilor despre sistemul pe care rulează serverul. + +Vom scrie în fișierul ``docker-compose.yml`` următoarea rețetă YAML: + +.. code-block:: bash + + version: '2.1' + + volumes: + prometheus_data: + grafana_data: + + services: + + prometheus: + image: prom/prometheus:v2.37.9 + container_name: prometheus + volumes: + - ./prometheus:/etc/prometheus + - prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + - '--web.console.libraries=/etc/prometheus/console_libraries' + - '--web.console.templates=/etc/prometheus/consoles' + - '--storage.tsdb.retention.time=200h' + - '--web.enable-lifecycle' + restart: unless-stopped + ports: + - 9090:9090 + + nodeexporter: + image: prom/node-exporter:v1.6.1 + container_name: nodeexporter + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + command: + - '--path.procfs=/host/proc' + - '--path.rootfs=/rootfs' + - '--path.sysfs=/host/sys' + - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)' + restart: unless-stopped + ports: + - 9100:9100 + + grafana: + image: grafana/grafana:9.1.7 + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/provisioning:/etc/grafana/provisioning + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=usorules + - GF_USERS_ALLOW_SIGN_UP=false + restart: unless-stopped + ports: + - 3000:3000 + +Acest fișier a fost generat pe baza unui `repository `_ open source deja existent, adaptat pentru cazul nostru de folosire. + +Intrările sub tag-ul ``volumes`` reprezintă directoare partajate între container și sistemul fizic. +Volumele containerelor oferă persistență informației înregistrate în container. +În mod predefinit containerele stochează informație în mod efemer, dacă un container a fost șters, a fost ștersă și informația din cadrul acestuia. + +Un director montat este de forma ``:``. +În cazul în care directorul sursă nu este o cale în sistem, acesta este generat un volum în cadrul directorului de lucru al serviciului Docker. + +Serviciile Grafana, Prometheus și ``node_exporter`` sunt accesibile pe rețea dintr-un browser și comunică prin porturi. +Pentru a putea accesa aceste servicii trebuie să expunem porturile. +Expunerea porturilor este realizată sub eticheta ``ports``, fiecare port fiind definind sub forma ``:``. + +Serviciile containerzate sunt configurate folosind eticheta ``environment``. +Parola sistemului Grafana a fost configurată folosind variabilele de mediu ``GF_USERS_ADMIN_USER`` și ``GF_SECURITY_ADMIN_PASSWORD``. + +Ne vom autentifica în mașina virtuală la serviciul de monitorizare în browser la +adresa ``localhost:3000``. +Am setat utilizator administrator ``admin`` și parola ``usorules``. +Vom fi rugați sa modificăm aceste informații. + +Odată autentificați, apăsăm pe butonul dashboards, apoi pe browse și accesăm panoul ``Node Exporter Full`` apăsând pe numele acestuia. + +.. figure:: ./img/services-dashboards.png + :scale: 45% + :alt: Grafana dashboards page + +Afișarea informațiilor în Grafana este realizată folosind dashboarduri (panouri de control). +Acestea pot fi generate de utilizatori în mod dinamic, sau pot să fie descărcate drept fișiere JSON. +În cadrul infrastructurii curente am descărcat dahsboardul ``Node Exporter Full``, unde putem să urmărim detalii despre resurse folosite, cum ar fi traficul pe rețea sau câtă memorie este folosită. + + +.. figure:: ./img/services-node-exporter.png + :scale: 45% + :alt: Grafana Node Exporter + +Atunci când folosim servicii bazate pe ``docker-compose``, nu este suficient să avem un fișier ``docker-compose.yaml``. +Serviciile sunt configurabile și prin fișiere de configurare pe care trebuie să le definim. +În cadrul directorului ``/home/student/uso.git/labs/09-task-admin/lab-container/grafana`` am generat fișierele de configurare pentru serviciile Prometheus și Grafana. +Aceste fișiere configurează Prometheus să se conecteze la ``node_exporter`` și configurează Grafana să se afișeze informațiile stocate în Prometheus. +Aceste fișiere nu sunt relevante pentru un setup simplu, avantajul folosirii serviciilor containerizate este tocmai faptul că nu trebuie să scriem noi toate fișierele de configurare și avem un serviciu deja funcțional configurat. + +Observăm mai jos ierarhia de fișiere completă: + +.. code-block:: bash + + grafana + ├── docker-compose.yml + ├── grafana + │   └── provisioning + │   ├── dashboards + │   │   ├── 1860_rev31.json + │   │   ├── dashboard.yml + │   │   └── monitor_services.json + │   └── datasources + │   └── datasource.yml + └── prometheus + └── prometheus.yml + +Instalarea unui serviciu de media hosting +""""""""""""""""""""""""""""""""""""""""" -Instalarea unui server de minecraft folosind containere -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Un exemplu pentru folosirea containerelor Docker într-un mod facil este pentru găzduirea unui server de media privat. +Serviciul oferit este ca și cum am folosi serviciul Netflix sau Disney+ găzduit pe propriul calculator. +Serviciile de media hosting sunt folosite pentru gestionarea propriei biblioteci +media, organizarea, sortarea și descărcarea metadatelor într-un portal centralizat. +Un alt avantaj al acestor servicii este faptul că ele pot fi vizualizate pe orice dispozitiv are acces la calculatorul care rulează containerul printr-un browser, fie că este televizor, tabletă sau telefon mobil. -Își vor instala un server de Minecraft pe PC, pe care îl vor testa folosind TLauncher (nu știu cât de legal e asta, TBD). +Serviciul Plex este unul dintre cele mai cunoscute servicii de media hosting. +Acesta poate să gestioneze conținut audio, foto și video. +Serviciul poate să fie rulat nativ în cadrul sistemului, sau poate să ruleze în container. +Avantajul folosirii Plex într-un container este ușurința de instalare și gestiune a sistemului. +Este suficient doar să descărcăm containerul și să îl pornim folosind comanda ``docker-compose``. -Instalarea Grafana folosind containere -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Pentru acest exercițiu, este suficient să cautăm o imagine de container pentru serviciul Plex pe platforma `DockerHub `_. -Își vor instala un server de grafana și baza de date pentru acesta. +Observăm că avem două posibilități de containere oficiale, primul este +împachetat și oferit de `linuxserver.io `_, iar al doilea este oferit de `Plex Inc `_. +Vom folosi soluția oferită de linuxserver.io, deoarece aceștia oferă, în general, containere împachetate optim pentru folosirea în containere. -Extra: Instalarea containerelor personalizate -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Exercițiu +""""""""" -Studenții vor descărca un Dockerfile și vor face build acestuia în loc să descarce direct containerul despre net. +Pe baza exemplului de fișier ``docker-compose.yaml`` oferit de linuxserver.io pe pagina de Docker Hub, realizați configurările necesare astfel încât să porniți un server de media Plex care are încărcată biblioteca folosind un volum din directorul ``/home/student/uso.git/labs/09-task-admin/lab-container/plex`` și expune portul de acces 32400 către sistemul gazdă. -Le vom arăta cum să modifice Dockerfile-ul ca să instaleze diverse aplicații. +Verificați că puteți reda melodia încărcată în directorul ``/home/student/uso.git/labs/09-task-admin/lab-container/plex`` folosind Plex.