Модул 9 · 9.2
Инсталиране на 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:
- Източникът на пакети на самия Docker (
download.docker.com). Винаги най-новата версия, включително приставкатаdocker compose, която ще използвате в урок 9.3. Това е описаното в документацията на Docker и това използва този курс. - Пакетът
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 prunedocker 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)
Задача
Задача O9.2: Вашият първи контейнер. Инсталирайте Docker Engine на своя сървър според урока (или на тестова машина). Стартирайте контейнер с nginx, който слуша само на 127.0.0.1:8080, проверете с docker ps, curl -I и ss -tlnp, прегледайте логовете и след това го почистете. Отговорете на въпросите: от кой източник инсталирахте Docker, какво показа ss за порт 8080 и добавихте ли себе си към групата docker (защо да или защо не)?
Задача O9.2: Вашият първи контейнер
Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.
Когато Docker е инсталиран от източника на Docker, unattended-upgrades по подразбиране не го актуализира; docker.io от дистрибуцията се актуализира. ss трябва да показва 127.0.0.1:8080, а не 0.0.0.0:8080. Групата docker дава root права; със sudo docker всяка команда остава в sudo лога.
Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.
Още за четене
- Документация на Docker, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Документация на Docker, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Документация на Docker, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Документация на Docker, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Документация на Docker, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Документация на Docker, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
- VPS: от първото влизане до сигурен сървър 6.1: Инсталиране на Docker от официалния източник
