--- author: Matija Burić --- ### Mrežni i mobilni operacijski sustavi 2025/26 # Kontejnerizacija: Docker osnove U ovoj vježbi učimo što su kontejneri, slike i registri te prolazimo kroz osnovne Docker naredbe. --- :::success Na slijedećem linku se nalazi uputa za korištenje Play With Docker online lab-om: [Kako se spojiti na https://labs.play-with-docker.com/ preko SSH](https://hackmd.io/@MatijaBuric/TT_1) ::: --- ## Kontejnerizacija Kontejnerizacija je tehnologija koja ide korak dalje od virtualizacije. Umjesto da koristi cijeli virtualni stroj, kontejneri dijele jezgru operacijskog sustava s domaćinom, što ih čini lakšim i bržim za pokretanje. --- ## Docker arhitektura Docker se sastoji od nekoliko ključnih komponenata: ### Kontejneri (Containers) - Izolirano okruženje u kojem se izvršavaju aplikacije i njihove ovisnosti. - Pokreću se iz Docker slika i imaju vlastiti filesystem, procese i mrežu. - Dijele kernel hosta, ali ostaju izolirani. - Lako se pokreću i zaustavljaju → omogućuju brzu skalabilnost. ### Slike (Images) - Predlošci za kontejnere. - Sadrže sve potrebne datoteke, konfiguraciju i ovisnosti. - **Immutable** – ne mijenjaju se nakon izgradnje. - Dijele se putem registara (Docker Hub, privatni registri). ### Docker Registar (Docker Registry) - Centralno mjesto za pohranu i distribuciju slika. - **Javni**: Docker Hub, Quay.io - **Privatni**: Harbor, GitHub Container Registry, GitLab, AWS ECR… - Omogućuje verzioniranje, dijeljenje i jednostavno povlačenje slika. --- ## Osnovne Docker naredbe ### Docker: `pull` $ docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 719385e32844: Pull complete Digest: sha256:4f53e2564790c8e7856ec08e384732aa38dc43c52f0... Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest - `docker pull` preuzima sliku iz registra. --- ### Docker: `run` $ docker run hello-world 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. ... - `docker run` pokreće kontejner iz slike. --- ### Docker: `ps` i `images` $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS 2520017c86ec hello-world "/hello" 4 min ago Exit 4 minutes ago $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 9c7a54a9a43c 5 months ago 13.3kB - `docker ps` → prikaz aktivnih kontejnera. - `docker ps -a` → svi kontejneri. - `docker images` → sve lokalne slike. --- ### Docker: `start` i `logs` $ docker start 2520017c86ec 2520017c86ec $ docker logs 2520017c86ec Hello from Docker! This message shows that your installation appears to be working correctly. ... - `docker start` pokreće prethodno zaustavljeni kontejner. - `docker logs` prikazuje izlaz iz kontejnera. --- ### Docker: `stop` $ docker run jpetazzo/clock Unable to find image 'jpetazzo/clock:latest' locally latest: Pulling from jpetazzo/clock ... Wed Oct 4 12:12:33 UTC 2023 Wed Oct 4 12:12:34 UTC 2023 Otvorite novi terminal i zaustavite ga: $ docker stop 9a9dcb9d2a65 9a9dcb9d2a65 - `docker stop` čeka 10 sekundi prije prisilnog gašenja. --- ### Docker: `kill` $ docker start 9a9dcb9d2a65 9a9dcb9d2a65 $ docker ps CONTAINER ID IMAGE COMMAND STATUS 9a9dcb9d2a65 jpetazzo/clock "/bin/sh ..." Up 4 seconds $ docker kill 9a9dcb9d2a65 9a9dcb9d2a65 - `docker kill` odmah zaustavlja kontejner. --- ### Docker: run zastavice Pokretanje u pozadini: $ docker run -d jpetazzo/clock b578448ae13cad8b1155871478e242ec63a03f2526dd44ae964fdc7f4a5990af Povezivanje na kontejner: $ docker attach b578448ae13c Wed Oct 4 12:51:32 UTC 2023 Wed Oct 4 12:51:33 UTC 2023 Interaktivni način: $ docker run -it alpine / # ls bin dev etc home lib media mnt opt ... - `-d` → detached (pozadina) - `-it` → interaktivni terminal Izlazak: - `Ctrl+P` `Ctrl+Q` → detach - `Ctrl+D` → izlaz i gašenje Pokretanje naredbi u aktivnom kontejneru: $ docker exec -it 93fe145f7e8b ash / # - `docker exec` izvršava naredbe unutar kontejnera. --- ### Docker: brisanje Pokušaj brisanja slike u uporabi: $ docker rmi alpine Error response from daemon: conflict: unable to remove repository reference "alpine" (must force) - container 03c94db6d0e5 is using its referenced image 8ca4688f4f35 Rješenje → prvo ukloniti kontejner: $ docker kill 03c94db6d0e5 $ docker rm 03c94db6d0e5 Zatim izbrisati sliku: $ docker rmi alpine Untagged: alpine:latest Deleted: sha256:871a9153c1842e3b480cb1be691c64151bc96a... --- ### Docker: višestruko brisanje $ docker container prune $ docker container prune -f $ docker image prune $ docker image prune -a - `docker container prune` briše sve zaustavljene kontejnere. - `docker container prune -f` briše sve zaustavljene kontejnere bez potvrde. - `docker image prune` briše sve nepotrebne (nedostupne) image-e. - `docker image prune` briše sve image-e, uključujući i one koji se koriste. --- ### Docker: čišćenje svih resursa $ docker stop $(docker ps -aq) $ docker rm $(docker ps -aq) $ docker rmi $(docker images -q) - kompletno čišćenje kontejnera i slika. --- ## Javne slike za vježbu | Slika | Poveznica | Opis | |-----------------------|---------------------------------------------------------------------------|--------------------------------------| | **2048-cli** | [defnotgustavom/2048-cli](https://hub.docker.com/r/defnotgustavom/2048-cli) | Igra 2048 u terminalu | | **ascii-art** | [msoap/ascii-art](https://hub.docker.com/r/msoap/ascii-art) | ASCII umjetničke igre | | **a_calc** | [defnotgustavom/a_calc](https://hub.docker.com/r/defnotgustavom/a_calc) | Kalkulator u terminalu | | **minesweeper-cli** | [minesweeper](https://hub.docker.com/r/defnotgustavom/minesweeper) | Igra Minesweeper u terminalu | | **tetris** | [tetris](https://hub.docker.com/r/defnotgustavom/tetris) | Klasični Tetris | ---