Docker е някакво общо понятие включващо в себе си Docker, Docker Image, Docker Container, Dockerfile и примерно още DockerHub. Ще се постарая да поясня всяко едно какво означава. Няма да ползвам някакви научни термини, а ще се пробвам да създам аналогии за най-непознатия потребител. Docker - това е технология наподобяваща виртуализация от рода на VMware или VirtualBox но в много опростен и минималистичен вариант. Docker Container - това е някаква мини виртуална машина създадена в Docker. Да си направите аналогия примерно създали сте едно ISO което го стартирате в Docker виртуалния хипервизор. Контейнера е затворена среда и няма нищо общо със операционната система на която е инсталиран Docker. Docker Image - ако ползваме горната аналогия примерно това нещо от типа на ISO файл който ползваме във виртуалната машина. Тук имаме зададени твърди параметри за виртуалната машина, не е както в контейнера където може да има промени. Dockerfile - Ако искате да не ползвате готови Docker Image а искате да си направите собствени ще се наложи да ползвате Dockerfile. В него ще се опише какво ще съдържа вашия контейнер и каква работа ще върши. В крайна сметка ще получите собствен Docker Image за работа. DockerHub - Това е хранилище на много Docker Image. От там можете да вземете готови решения като WEB сървър, SQL сървър и т.н. Всичко това което обясних е много повърхностно, но се придобива някаква първоначална представа. С течение на работата ще разберете всяко едно нещо за какво служи. Между другото можете да срещнете понятие като Docker Engine. Това е Docker инсталиран на вашия сървър примерно или на работна станция. Сега да видим как работи всичко това. • Първо инсталираме Docker Engine или просто казано Docker, • След това с текстов редактор правим малък Dockerfile и го съхраняваме в работната папка. • Стартираме BUILD и създаваме Docker Image • Docker Image може да го стартираме чрез RUN • След като сме стартирали Docker Image се създава и стартира Docker Container (мини виртуална машина) която ще изпълни някакво действие.
За всяка операционна система инсталацията е различна. Даже за всяка дистрибуция на Linux е различна инсталацията. В случая ще демонстрираме как се инсталира върху Debian. В този случай наново имаме различни варианти. Примерно може да се инсталира от официалните репозитори на Docker, може да се инсталира от репозиторите на Debian, може да се инсталира от deb пакети, а също така може да се инсталира и чрез скрипт. Най-простия начин е да се ползват репозиторите на Debian. И тук има два вариканта. Ще инсталираме чрез root или чрез потребител член на групата sudo. Ще ползваме втория вариант. Примерно потребителя с който ще работим е tachko. Да създадем потребител различен от root
useradd -m tachko passwd tachko
Да инсталираме пакета sudo.
apt install sudo -y
Да добавим tachko в групата sudo.
usermod -aG sudo tachko
Да се прехвърлим за работа с потребителя tachko.
su tachko chsh -s /bin/bash bash
Да се пробваме да обновим репозиторите и системата.
sudo apt update && sudo apt upgrade -y
Инсталираме Docker.
sudo apt install docker.io -y
Добавяме потребител имащ права за работа с Docker.
sudo usermod -aG docker $USER groups tachko tachko : tachko sudo docker
Първо да проверим версията на Docker.
docker --version Docker version 26.1.5+dfsg1, build a72d7cd
Може да добием по-подробна информация за компилацията, за видим кои компоненти се изпълняват.
docker version Client: Version: 26.1.5+dfsg1 API version: 1.45 Go version: go1.24.4 Git commit: a72d7cd Built: Fri Jan 2 14:41:00 2026 OS/Arch: linux/amd64 Context: default permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/version": dial unix /var/run/docker.sock: connect: permission denied
Имаме permission denied независимо, че добавихме потребителя tachko в групата docker. Така е, защото командата не е влязла в сила. Трябва да се излезе от потребителя tachko и наново да се логнем.
exit
След като сме се логнали наново да проверим версията на Docker Compose.
docker-compose version bash: docker-compose: command not found
Това е така защото няма инсталиран docker-compose. Ако се нуждаете от docker-compose може да се инсталира чрез:
sudo apt install docker-compose -y
И наново да проверим версията на docker-compose.
docker-compose version Docker Compose version 2.26.1-4
Docker е инсталиран и работи. Проблема идва след рестарт на системата. Docker няма да е активен. Първо да проверим услугата Docker.
sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Tue 2026-02-03 05:33:11 EST; 12min ago Invocation: b6d95f92f598409cb31d8432f536a7cc TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 2097 (dockerd) Tasks: 10 Memory: 32.7M (peak: 34.7M) CPU: 320ms CGroup: /system.slice/docker.service └─2097 /usr/sbin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock Feb 03 05:33:11 debian systemd[1]: Starting docker.service - Docker Application Container Engine... Feb 03 05:33:11 debian (dockerd)[2097]: docker.service: Referenced but unset environment variable evaluates to an empty string: DOCKER_OPTS Feb 03 05:33:11 debian dockerd[2097]: time="2026-02-03T05:33:11.114717526-05:00" level=info msg="Starting up" Feb 03 05:33:11 debian dockerd[2097]: time="2026-02-03T05:33:11.149581182-05:00" level=info msg="Loading containers: start." Feb 03 05:33:11 debian dockerd[2097]: time="2026-02-03T05:33:11.348992143-05:00" level=info msg="Loading containers: done." Feb 03 05:33:11 debian dockerd[2097]: time="2026-02-03T05:33:11.355178977-05:00" level=info msg="Docker daemon" commit=411e817 containerd-snapshotter=false storage-driver=overlay2 version=26.1.5+dfsg1 Feb 03 05:33:11 debian dockerd[2097]: time="2026-02-03T05:33:11.355232272-05:00" level=info msg="Daemon has completed initialization" Feb 03 05:33:11 debian dockerd[2097]: time="2026-02-03T05:33:11.369990744-05:00" level=info msg="API listen on /run/docker.sock" Feb 03 05:33:11 debian systemd[1]: Started docker.service - Docker Application Container Engine.
Сървиса може да спре и пак да се стартира чрез:
sudo systemctl stop docker sudo systemctl start docker
Може да се ползва и само една команда.
sudo systemctl restart docker
За да се стартира услугата автоматично след рестарта ще е нужно:
sudo systemctl enable docker
За проблеми може да се провери с:
sudo journalctl -u docker.service
Ако влезем на https://hub.docker.com/ ще видим множество готови решения. Да стартираме едно такова.
docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 17eec7bbc9d7: Pull complete Digest: sha256:05813aedc15fb7b4d732e1be879d3252c1c9c25d885824f6295cab4538cb85cd Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
Нямахме имидж hello-world на компютъра който работим, затова първо го изтеглихме през Интернет и след това го стартирахме.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 1b44b5a3e06a 5 months ago 10.1kB
Имаме наличен само този който преди малко го изтеглихме и стартирахме.
Тази задача може да се изпълни до два начина. Да проверим в Docker HUB https://www.docker.com/products/docker-hub/ какви налични има или чрез команда.
docker search tomcat NAME DESCRIPTION STARS OFFICIAL tomcat Apache Tomcat is an open source implementati… 3765 [OK] bitnami/tomcat Bitnami Secure Image for tomcat 53 bitnamicharts/tomcat Bitnami Helm chart for Apache Tomcat 0 rootpublic/tomcat 0 chainguard/tomcat Build, ship and run secure software with Cha… 0 islandora/tomcat Base tomcat image used for java services. 0 vulhub/tomcat 0 samply/tomcat 0 openeuler/tomcat 0 tomcat/tomcat01 0
docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat a3629ac5b9f4: Pull complete bd41d65c3828: Pull complete 8be760c2a9a8: Pull complete 4f4fb700ef54: Pull complete d0702afe109d: Pull complete d99c7608407b: Pull complete 2ca1458a9031: Pull complete Digest: sha256:6af1184ab272d631d62a712260ac858010a898b835c088cbe447653cdc1d3d97 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest
Имаме изтеглен имидж tomcat Да проверим:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest fe1a24e4a16c 7 days ago 412MB hello-world latest 1b44b5a3e06a 5 months ago 10.1kB
docker run -it -p 1234:8080 tomcat
-it : стартираме инерактивно (гледаме в реално време какво се случва в конзолата). -p : пренасочваме портове от локалната машина към контейнера. Tomcat в контейнера работи на порт 8080, а ние искаме да работи в сървъра на порт 1234 В конзолата ще се види в реално време какво стартира и какви резултати се постигат. Може през браузъра да проверим: http://192.168.11.86:1234. Ще върне отговор, че няма страница която да отвори, но самия tomcat работи. За да прекъснем процеса, защото конзолата вече е заета, натискаме бутоните Cttl+c
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Нямаме стартирали контейнери.
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e6c356151d12 tomcat "catalina.sh run" 11 minutes ago Exited (130) 3 minutes ago funny_hugle 1db394ad6927 hello-world "/hello" 48 minutes ago Exited (0) 48 minutes ago heuristic_borg
Имали сме два контейнера стартирали и завършили работата си. Съответно завършили преди 3 и 48 минути.
docker run -d -p 1235:8080 tomcat c1f58000f351c16f99b1103ef78f30c40c98f5e87b7db2debca9ae7d53b7462e
Контейнера стартира и му бе предаден идентификационен номер. Проверяваме за активен контейнер.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1f58000f351 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:1235->8080/tcp, :::1235->8080/tcp thirsty_antonelli
И ако проверим на http://192.168.11.86:1235, ще имаме отговор от tomcat, при това конзолата ще е свободна за работа.
Първо проверяваме за наличие на имидж.
docker search nginx
И да стартираме контейнер с Nginx. Едновременно с това ще се смъкне и имиджа на nginx.
docker run -d -p 1357:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 0c8d55a45c0d: Pull complete 173e7a5d3717: Pull complete 2711d25abbb0: Pull complete 359cde133485: Pull complete acc398fdf80e: Pull complete bc4d011570c3: Pull complete 1eb69ddd819c: Pull complete Digest: sha256:6c9ab46b34b89274be77bf50253f97bf8f16eb11b98128d5694a8ae9b3efa2ed Status: Downloaded newer image for nginx:latest fed010e6e04086c5db332922e4bcc45a6904fbd29f1824673f428c56defdb8ef docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fed010e6e040 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:1357->80/tcp, :::1357->80/tcp friendly_chaum c1f58000f351 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:1235->8080/tcp, :::1235->8080/tcp thirsty_antonelli
И ако проверим на: http://192.168.11.86:1357/ ще се отвори страницата която посреща инсталиран nginx. Значи сме смъкнали имиджа за nginx, стартирали сме контейнера като демон и той чака заявки на порт 1357.
Първо да проверим какви имиджи имаме.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 248d2326f351 11 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB hello-world latest 1b44b5a3e06a 5 months ago 10.1kB
Да се пробваме да изтрием hello-world.
docker rmi hello-world Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 1db394ad6927 is using its referenced image 1b44b5a3e06a
Не може да се изтрие имиджа, защото участва в контейнер с номер 1b44b5a3e06a. Независимо, че контейнера не е активен имиджа не може да се изтрие, защото има зависимост с контейнера. Първо трябва да изтрием контейнера . Проверяваме контейнерите.
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fed010e6e040 nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 0.0.0.0:1357->80/tcp, :::1357->80/tcp friendly_chaum c1f58000f351 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:1235->8080/tcp, :::1235->8080/tcp thirsty_antonelli e6c356151d12 tomcat "catalina.sh run" 2 hours ago Exited (130) 2 hours ago funny_hugle 1db394ad6927 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago heuristic_borg
Трием контейнера.
docker rm 1db394ad6927 1db394ad6927
Да изтрием имиджа.
docker rmi 1b44b5a3e06a Untagged: hello-world:latest Untagged: hello-world@sha256:05813aedc15fb7b4d732e1be879d3252c1c9c25d885824f6295cab4538cb85cd Deleted: sha256:1b44b5a3e06a9aae883e7bf25e45c100be0bb81a0e01b32de604f3ac44711634 Deleted: sha256:53d204b3dc5ddbc129df4ce71996b8168711e211274c785de5e0d4eb68ec3851
Този път изтрихме имиджа не по име, а по ID, за да се види, че може и по този начин. Да проверим дали имиджа се е изтрил.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 248d2326f351 11 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB
Имиджа hello-world е изтрит.
mkdir mydocker cd mydocker nano Dockerfile #--------------------------------------------------------------------------- # Dockefile to build Docker Image of Apache WebServer running on Ubuntu # # Made by Denis Astahov ADV-IT 13-March-2019 #--------------------------------------------------------------------------- FROM ubuntu:16.04 RUN apt-get -y update RUN apt-get -y install apache2 RUN echo 'Hello World from Docker!' > /var/www/html/index.html CMD ["/usr/sbin/apache2ctl", "-D","FOREGROUND"] EXPOSE 80
docker build -t myimage:v01 .
Създадохме собствен имидж с име myimage -t - наличие на таг (етикет) v01 - това е TAG на имиджа. В случая е версия 01 . - означава, че имиджа ще се създаде в текущата директория.
Да проверим какви имиджи има.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimage v01 00a4a1e5a0fc 34 minutes ago 261MB nginx latest 248d2326f351 12 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB
Имаме създаден наш имиджм който се нарича myimage и тага му е v01 Да стартираме нашия контейнер.
docker run -d -p 7777:80 myimage:v01 a3583a808fd1bfe2a4ff4e7eca97d704eaa95d691ba3fde313c260f7b68dde2e docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3583a808fd1 myimage:v01 "/usr/sbin/apache2ct…" 50 seconds ago Up 49 seconds 0.0.0.0:7777->80/tcp, :::7777->80/tcp peaceful_gauss fed010e6e040 nginx "/docker-entrypoint.…" 3 hours ago Up 3 hours 0.0.0.0:1357->80/tcp, :::1357->80/tcp friendly_chaum c1f58000f351 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:1235->8080/tcp, :::1235->8080/tcp thirsty_antonelli
Да проверим: http://192.168.11.86:7777. Връща се отговор "Hello World from Docker!"
docker tag myimage:v01 myimage:copy docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimage copy 00a4a1e5a0fc 3 hours ago 261MB myimage v01 00a4a1e5a0fc 3 hours ago 261MB nginx latest 248d2326f351 15 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB
Забележете направихме копие на оригиналния имидж, но той не изчезна, просто се създаде втори такъв имидж.
Първо да определим в кой контейнер ще влезем.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3583a808fd1 myimage:v01 "/usr/sbin/apache2ct…" 13 minutes ago Up 13 minutes 0.0.0.0:7777->80/tcp, :::7777->80/tcp peaceful_gauss fed010e6e040 nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:1357->80/tcp, :::1357->80/tcp friendly_chaum c1f58000f351 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:1235->8080/tcp, :::1235->8080/tcp thirsty_antonelli
А сега да влезем в контейнера.
docker exec -it myimage:v01 /bin/bash Error response from daemon: No such container: myimage:v01 docker exec -it a3583a808fd1 /bin/bash root@a3583a808fd1:/#
exec - влизаме в контейнера -it - интерактивно (можем да работим вътре през конзолата) /bin/bash - ползваме за шел bash Няколко забележки! Когато се влиза в контейнера се влиза по ID а не по име. Когато влезете в контейнера се променя шела, на номера на контейнера. Грубо казано сме се логнали във виртуалната машина наречена контейнер. Вътре в контейнера можем да правим всичко както в стандартната машина.
root@a3583a808fd1:/# cd /var/www/html/ root@a3583a808fd1:/var/www/html# ls index.html
Ако примерно се помъчим да редактираме файла index.html ще видим, че за това е нужен текстов редактор. Контейнера е толкова орязан, че няма даже редактор. За целта първо да инсталираме такъв в самия контейнер. След това да редактираме index.html
root@a3583a808fd1:/var/www/html# apt install nano -y root@a3583a808fd1:/var/www/html# nano index.html Hello World from Docker! Version 2
Да проверим на: http://192.168.11.86:7777. Връща се отговор "Hello World from Docker! Version 2". За да излезем от контейнера пишем:
exit exit tachko@debian:~/mydocker$
Първо да проверим контейнера върху който ще работим.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3583a808fd1 myimage:v01 "/usr/sbin/apache2ct…" 30 minutes ago Up 30 minutes 0.0.0.0:7777->80/tcp, :::7777->80/tcp peaceful_gauss fed010e6e040 nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:1357->80/tcp, :::1357->80/tcp friendly_chaum c1f58000f351 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:1235->8080/tcp, :::1235->8080/tcp thirsty_antonelli
Проверяваме имиджите които имаме.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimage copy 00a4a1e5a0fc 3 hours ago 261MB myimage v01 00a4a1e5a0fc 3 hours ago 261MB nginx latest 248d2326f351 15 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB
Ще работим с имидж myimage:v01, който участва в стартирал контейнер a3583a808fd1.
docker commit a3583a808fd1 myimage:v02 sha256:48fde485abf813d9365f1c7f99ea5f91a28d2cf19388e3f2f28a82ed95c47b2e
И да проверим.
docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimage v02 48fde485abf8 57 seconds ago 263MB myimage copy 00a4a1e5a0fc 3 hours ago 261MB myimage v01 00a4a1e5a0fc 3 hours ago 261MB nginx latest 248d2326f351 15 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB
Вече можете да боравите с новия имидж както с предните.
След рестарт на сървъра ще видите следното:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimage v02 48fde485abf8 8 minutes ago 263MB myimage copy 00a4a1e5a0fc 4 hours ago 261MB myimage v01 00a4a1e5a0fc 4 hours ago 261MB nginx latest 248d2326f351 15 hours ago 161MB tomcat latest fe1a24e4a16c 7 days ago 412MB docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3583a808fd1 myimage:v01 "/usr/sbin/apache2ct…" 45 minutes ago Exited (137) 3 minutes ago peaceful_gauss fed010e6e040 nginx "/docker-entrypoint.…" 4 hours ago Exited (0) 3 minutes ago friendly_chaum c1f58000f351 tomcat "catalina.sh run" 5 hours ago Exited (143) 3 minutes ago thirsty_antonelli e6c356151d12 tomcat "catalina.sh run" 6 hours ago Exited (130) 6 hours ago funny_hugle
Имаме налични имиджи. Нямаме стартирали контейнери. Имаме налични контейнери които са били стартирали и са завършили работата си. Извод! Слред рестарт контейнерите не се вдигат автоматично, ако преди това не е зададена такава опция.