Към съдържанието

Настройки за бисквитки

Изберете кои видове бисквитки разрешавате. Можете да промените избора си по всяко време чрез „Настройки за бисквитки“ в долната част на всяка страница. Декларация за поверителност

Необходими

Винаги включени

Нужни са за вход, за запазване на количката и на Вашите избори. Те са винаги включени.

Кои бисквитки?
  • weboke_sessie, weboke_klant, weboke_remember: Вашата сесия и оставането в акаунта
  • weboke_basket: Вашата количка
  • wkBtwIncl: показване на цените с или без ДДС
  • wok_cookies: Вашият избор за бисквитките, 12 месеца

Измерват коя реклама води до посещение или поръчка, за да не плащаме за реклами без резултат.

Кои бисквитки?
  • Google Ads чрез Google Tag Manager (_gcl_au, _gcl_aw), до 90 дни
  • OpenAI Ads, реклами в ChatGPT
  • wok_aff: кой партньор Ви е препратил към нас (партньорска програма), 60 дни

4,6

Държава и език

Всяка държава има собствен сайт, с цените и ДДС на тази държава.

Преглед

Инсталиране на Docker и Вашият първи контейнер

Модул 9: Docker и docker compose · Време за четене: 11 минути

Цел на урока: След този урок ще можете да инсталирате Docker Engine от официалния източник на пакети, да стартирате, преглеждате, разглеждате отвътре и почиствате контейнери, и ще знаете защо групата docker е равностойна на root.

Основни понятия: Docker Engine, Docker Desktop, официален apt източник, docker.io от Debian, група docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df

Кой Docker?

На сървър инсталирате Docker Engine: фоновата услуга (dockerd) плюс командата docker. Docker Desktop е нещо друго: програма с прозорци за Windows, macOS и Linux десктопи. Тя не е предназначена за сървър.

Има два надеждни източника за Docker Engine:

  1. Източникът на пакети на самия Docker (download.docker.com). Винаги най-новата версия, включително приставката docker compose, която ще използвате в урок 9.3. Това е описаното в документацията на Docker и това използва този курс.
  2. Пакетът docker.io от Debian или Ubuntu. По-стар, но се обновява от дистрибуцията чрез обичайните Ви актуализации за сигурност (урок 4.2). Подходящ е, ако предпочитате да нямате нищо извън дистрибуцията; в такъв случай проверете дали docker compose (с интервал) е наличен.

Изберете един от тях. Смесеното инсталиране води до конфликти; затова документацията на Docker препоръчва първо да премахнете неофициални пакети като docker.io, docker-compose и podman-docker.

Инсталиране от източника на пакети на Docker

Това са стъпките от документацията на Docker за Debian, с отделен ключ и собствен Signed-By (урок 4.1). Ако желаете, първо направете snapshot.

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

След това файлът на източника /etc/apt/sources.list.d/docker.sources (във формат deb822):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

При Suites се поставя кодовото име на Вашата версия (cat /etc/os-release, урок 4.3), а при Architectures изходът на dpkg --print-architecture. В Ubuntu URL адресът е https://download.docker.com/linux/ubuntu, а suite например е noble.

След това инсталирайте:

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.

В Debian и Ubuntu Docker се стартира автоматично след инсталирането, както и след всяко рестартиране (systemctl status docker, урок 6.1).

Внимание: unattended-upgrades (урок 4.2) по подразбиране не обновява автоматично пакетите от този източник. Включете sudo apt update && sudo apt upgrade за Docker в своя ритъм на поддръжка (урок 10.4) или съзнателно добавете източника към автоматичните си актуализации.

Групата docker е root

Навсякъде в интернет пише, че трябва да добавите себе си към групата docker, за да не се налага повече да пишете sudo:

anna@web1:~$ sudo usermod -aG docker anna

Направете го само ако разбирате какво означава това. Документацията на Docker е категорична: групата docker дава права на ниво root. Който може да управлява услугата Docker, може да стартира контейнер с монтиран в него целия диск на хоста:

docker run -it -v /:/host debian chroot /host

и така става root на Вашия сървър, без парола и без запис в sudo лога. Документацията на Docker го казва така: само доверени потребители трябва да имат право да управляват услугата Docker.

За сървър, който администрирате само Вие, това е въпрос на избор: удобство срещу допълнителен път към root. По-безопасно е просто да продължите да пишете sudo docker ...; тогава всяка команда се записва в sudo лога (урок 3.2). Във всеки случай никога не добавяйте към групата потребител, който не бива да бъде root, например служебен потребител за уебсайт.

Rootless mode

Docker може да работи и без root: тогава услугата и контейнерите работят под обикновен потребител, със собствен user namespace. Инсталирате го като този потребител с dockerd-rootless-setuptool.sh install (от пакета docker-ce-rootless-extras; предварително е необходим пакетът uidmap). Тогава пробив в контейнер не дава root достъп до хоста. Има ограничения и настройването е по-сложно; в този курс използваме обикновената инсталация и я поддържаме безопасна с правилата от този модул.

Първи истински контейнер

Стартираме уеб сървър nginx в контейнер, достъпен само от самия сървър:

anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...

Частите:

ЧастЗначение
-dРабота във фонов режим (detached)
--name proefИме, за да не се налага да работите с дълги ID
-p 127.0.0.1:8080:80Порт 80 в контейнера става порт 8080 на хоста, само на loopback
nginx:stableОфициалният образ на nginx, tag stable

Проверка:

anna@web1:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  STATUS         PORTS                    NAMES
3f1c9e0d7a2b   nginx:stable   "/docker-entrypoint.…"   Up 5 seconds   127.0.0.1:8080->80/tcp   proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))

ss (урок 5.1) потвърждава: само на 127.0.0.1. Ако бяхте написали -p 8080:80, щеше да се покаже 0.0.0.0:8080 и [::]:8080 и контейнерът Ви щеше да е достъпен от интернет, дори ако ufw не разрешава порт 8080 (урок 9.3). Версията в header Server при Вас може да е различна.

Разглеждане и намеса

anna@web1:~$ sudo docker logs proef            # какво е изписала програмата (stdout и stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # последните 20 реда и продължаване на следенето
anna@web1:~$ sudo docker exec -it proef sh     # shell в работещия контейнер
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef           # спиране и премахване

docker logs е първото място, където да погледнете, когато контейнер не се държи според очакванията, точно както journalctl при обикновените услуги (урок 6.2). С docker exec поглеждате вътре, но е по-добре да не променяте нищо там: промените в контейнера изчезват при следващото обновяване (урок 9.1).

Почистване

Образите и спрените контейнери остават, докато не ги почистите. На VPS с малък диск това се натрупва незабелязано.

anna@web1:~$ sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         3         1.9GB     1.2GB (63%)
Containers      3         3         12MB      0B (0%)
Local Volumes   2         2         180MB     0B (0%)
Build Cache     0         0         0B        0B
anna@web1:~$ sudo docker image prune

docker image prune премахва образи без име, които вече не принадлежат на нищо; с -a и всички образи, които не се използват от нито един контейнер. Бъдете внимателни с docker system prune --volumes: тази команда премахва и анонимни volumes (без име), които в момента не принадлежат на контейнер, а docker volume prune -a дори volumes с име. В тях може да са Вашите данни. Затова винаги давайте име на volumes или използвайте bind mount (урок 9.1) и първо проверете с docker volume ls.

Логовете на контейнерите също могат да растат. По подразбиране Docker ги съхранява в JSON файлове без ограничение на размера. Ограничение задавате в /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

След това sudo systemctl restart docker; настройката важи само за новосъздадени контейнери, а съществуващите контейнери създайте наново.

На практика

Docker работи на VPS при WebOké по същия начин, както при всеки друг доставчик: това е софтуер във Вашия собствен сървър, който сами инсталирате и обновявате. При малък VPS редовно проверявайте дисковото пространство с docker system df и df -h (урок 1.4).

Обобщение

  • Инсталирайте Docker Engine от източника на пакети на Docker (със собствен ключ и Signed-By) или docker.io от дистрибуцията, но не и двете.
  • Групата docker е равностойна на root; sudo docker оставя следа в sudo лога. Rootless mode е по-безопасна, но по-ограничена алтернатива.
  • docker run -d --name ... -p 127.0.0.1:host:container image:tag стартира контейнер, достъпен само локално; проверете с ss.
  • docker ps, logs, exec, stop, rm са Вашите ежедневни инструменти.
  • Почиствайте образите с docker image prune, ограничете логовете на контейнерите (по подразбиране без ограничение) и бъдете пестеливи с --volumes.

Тест (quiz)

1. Защо членството в групата docker на практика дава права на root?



2. След docker run -d -p 8080:80 nginx командата ss -tlnp показва реда 0.0.0.0:8080. Какво трябваше да напишете, за да публикувате порта само локално?



3. Контейнерът се стартира, но уебсайтът в него не работи. Какво проверявате първо?



4. Защо избирате един източник за Docker и не инсталирате docker.io и docker-ce едновременно?



5. Какво прави docker system prune --volumes, което трябва добре да знаете?



Задача

Задача O9.2: Вашият първи контейнер. Инсталирайте Docker Engine на своя сървър според урока (или на тестова машина). Стартирайте контейнер с nginx, който слуша само на 127.0.0.1:8080, проверете с docker ps, curl -I и ss -tlnp, прегледайте логовете и след това го почистете. Отговорете на въпросите: от кой източник инсталирахте Docker, какво показа ss за порт 8080 и добавихте ли себе си към групата docker (защо да или защо не)?

Задача O9.2: Вашият първи контейнер

Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.




Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.

Още за четене

Моля, изчакайте…

Настройте домейните си

За всеки домейн настройте сървърите за имена, връзката с хостинга и кой ще бъде собственикът.

Домейните Ви се зареждат…