[[oktatas:operációs_rendszerek:virtualizálás|< Virtualizálás]]
====== Docker ======
* **Szerző:** Sallai András
* Copyright (c) 2015, Sallai András
* * Szerkesztve: 2015, 2017, 2019, 2020, 2023, 2024
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== A Dockerről =====
A Docker egy adott operációs rendszert virtualizál számunkra, mindenféle
virtuális gép, virtuális merevlemez létrehozása nélkül. Operációs renszer
szintű, vagy **konténeres virtualizáció**nak is hívják. Ilyen célokra Linuxon
csak az LXC állt rendelkezésünkre. Kezdetben maga a docker is ezt használta.
A docker célja volt az LXC használatának egyszerűsítése. Ma a Dockernek saját
konténerrendszere van. Használatával leegyszerűsíthető új programjaink
tesztelése elszeparált környezetben. Nem szükséges külön kernelt indítani.
Mivel jobb ez, mint egy virtuális gép? Kevesebb helyet foglal egy virtuális
vendégrendszer, gyors létrehozás, gyors működés, kevesebb helyfoglalás --
szemben a teljes virtuális megoldásokkal.
A docker használatához szükség van egy lemezképre (image) az adott operációs
rendszerből. Ez tulajdonképpen egy előtelepített rendszer. Ezek elkészíthetők
vagy letölthetők a docker úgynevezett [[https://registry.hub.docker.com/|registry webhelyéről]].
A tárolóban általában 64 bites rendszereket tárolnak. Ha 64 bites rendszeren
szeretnéd futtatni az adott rendszert, akkor ez nem gond. Egyébként keresned kell
32 bites képfájlokat.
===== Docker beszerzése =====
Telepítés Windowson:
choco install docker-cli
Esetleg:
choco install docker-desktop
choco install docker-compose
Telepítés Debian GNU/Linuxon
apt install docker.io
apt install docker-compose
Több információ:
* https://docs.docker.com/engine/installation/linux/debian/
===== Képfájl beszerzése =====
Keresés:
* https://hub.docker.com/
docker search valmai
Jelenleg egyetlen képfájlunk sincs. Ezt ellenőrizhetjük az images
alparanccsal:
docker images
Lássuk a képfájlok beszerzését, amelyekből ezt követően rendszert
indíthatunk. Elsőként 64 bites Debianos képfájl beszerzését nézzük meg.
Ha 32 bites a rendszerünk akkor keressük meg lejjebb a 32 bites képfájl
beszerzését.
Ha 64 bites rendszerünk van, akkor csak írjuk be:
docker run debian:buster /bin/echo 'Hello Vilag'
A parancs letölti a debian képfájlt, majd futtatja rajta a megadott parancsot, majd kilép.
A letöltött képfájlokat a következő paranccsal nézhetjük meg:
docker images
Egy képfájl törlése:
docker rmi tarolonev:tag
Például:
docker rmi debian:buster
Képfájlokról információ:
* https://hub.docker.com/ (2023)
==== 32 bites képfájl ====
Figyelem! A Docker saját tárolóiban 64 bites képfájlok vannak.
32-bites képfájlokat nekünk kell készíteni. Ehhez is van segítség:
* https://github.com/docker-32bit
Töltsük le a megfelelő scriptet és futtassuk. Például Debian Jessie:
git clone https://github.com/docker-32bit/debian.git
debian/build-image.sh
A kimeneten figyeljük a "docker import" sort, mert itt látjuk,
milyen néven tudunk majd rá hivatkozni. Például:
+ docker import - 32bit/debian:jessie
Indítsuk el a docker démont Linux Mint rendszeren:
service docker.io start
Debian rendszeren eleve fut a démon, nem szükséges indítani.
Teszt:
docker run 32bit/debian:jessie /bin/echo 'Hello Vilag'
32 bites fedora:
* https://registry.hub.docker.com/u/marina/fedora21-i386/
docker run --rm -t -i marina/fedora21-i386 /bin/bash
Itt kereshetünk további képfájlokat:
https://registry.hub.docker.com/
===== Használat =====
Ha már töltöttünk le képfájlt, akkor indíthatunk belőle
rendszert. Az elindított rendszert konténernek nevezzük.
Egy konténert két módon indíthatunk:
* futtatás után törlődik
* futtatás után megmarad (változások maradnak)
A konténerek alapértelmezésként megmaradnak, tehát mentésre
kerülnek. A konténerben futó operációs rendszeren minden
munkánk megmarad. Ha az első módon, csak ideiglenesen szeretnénk
egy új rendszer indítani, akkor szükségünk lesz a --rm
kapcsolóra.
A következő példában egy szimpla Debiant indítunk, amely leállítás után
is megmarad.
Debian indítás példa:
docker run -it debian
Vagy:
docker run -t -i 32bit/debian:jessie /bin/bash
A run alparancs, egy új konténert hoz létre.
A -t azt jelenti kértünk egy terminált, a -i pedig interaktív módban indítottuk a
dockert. A "32bit/debian:jessie" rész mondja meg, hogy mit szeretnénk
indítani. A "/bin/bash" mondja meg, hogy az elindított Debian operációs
rendszeren induljon egy Bash parancsértelmező.
Ha elindult a konténer a fenti paranccsal, akkor megkapjuk a Bash várakozásijelét.
Egy ps ax paranccsal ellenőrizzük, hogy valóban egy önálló konténerben
fut-e a bash:
ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /bin/bash
8 ? R+ 0:00 ps ax
Ha a /bin/bash PID száma 1-es akkor működik.
Debian 9 esetén a procps nincs telepítve, ezért a ps parancs nem működik.
Telepítsük:
apt install procps
A run alparanccsal mindig egy új konténert hozunk létre.
A gazda gépen a ps alparanccsal lekérdezhetők a **futó konténerek**:
docker ps
A kimenet ehhez hasonló:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a57ca04a052 32bit/debian:jessie /bin/bash 8 seconds ago Up 8 seconds kamilla
Ha kilépünk a konténerben futó Debianból az "exit" paranccsal, akkor a konténer
leáll. A **futó konténereket** a következő paranccsal tekinthetjük meg:
docker ps
Az **összes konténer** megjelenítése:
docker ps -a
Egy létező konténer indítása:
docker start kontenernev
Egy konténer leállítása:
docker stop kontenernev
A konténer neve helyett, megadható a konténer azonosítója is.
Az induló rendszer elnevezése és gépnév:
docker run --hostname {hostname} --name {name} {image}
===== Konténerek törlése =====
Ha kiléptünk a konténerben futó Linuxból az exit paranccsal, a konténer
megmarad, ha indításkor nem használtuk a --rm kapcsolót.
A konténer törlése az azonosítója alapján történhet.
Ha nem tudjuk az azonosítót, lekérdezhetjük az összeset a
következő paranccsal:
docker ps -a
Ezek után törlés, például:
docker rm 6b2687bbab4d
Ha konténer létrehozásakor elvolt nevezve, akkor a név alapján is
törölhetem. Ha a konténer neve például "csirke" volt:
docker rm csirke
Minden leállított konténer törlése:
docker rm $(docker ps -a -q)
===== Konténer átnevezése =====
docker rename CONTAINER NEW_NAME
A CONTAINER lehet azonosító is.
===== Képfájlok átnevezése =====
docker tag szerver:latest sajatnev/szerver:latest
vagy
docker tag 53fa3634ea35 sajatnev/szerver:latest
Névtelen képfájl törlése:
docker rmi $(docker images | grep "^" | awk '{print $3}')
Valójában az azonosító alapján töröljük.
===== Képfájlok keresése =====
Keressünk CentOS konténereket a központi tárolóban:
docker search centos
===== Dockerfile =====
A Dockerfile hasonló a Makefile-hoz. Leírunk vele egy képfájlt.
A képfájlt már egy létező képfájlból szoktunk létrehozni.
A Dockerfile tehát arra jó, hogy leírhatunk vele egy új képfájlt.
Lássunk egy nagyon egyszerű képfájlt:
FROM 32bit/debian:jessie
RUN apt-get -y install mc
Az első sor jelzi, hogy melyik már létező képfájl alapján szeretnék létrehozni.
Esetünkben ez egy debian. A második és egyben utolsó sor jelzi, hogy
futtatni kell a képfájl létrehozása során az "apt-get -y install mc" parancsot.
Megadható a karbantartó és az utolsó frissítés:
FROM 32bit/debian:jessie
MAINTAINER Nagy József "nagyjozsef@valahol.and"
ENV REFRESHED_AT 2015-07-21
RUN apt-get -y install mc
A RUN kulcsszó után a megadott parancs lehet akár többsoros is.
Több soros parancsra példa:
RUN mkdir -p /valahol && \
cd /valahol && \
touch egy.txt
Az aktuális könyvtárból saját fájlokat adhatunk a képfájlhoz.
Ilyenek lehetnek a konfigurációs fájlok.
Fájlok hozzáadása a képfájlhoz:
ADD fajlok/apache/apache2.conf /etc/apache2.conf
Előtte persze illik menteni:
RUN mv /etc/apache2/apache2.conf /etc/apache2.conf.eredeti
ADD fajlok/apache/apache2.conf /etc/apache2.conf
Ha szeretnénk egy szolgáltatást adott porton elérni a futó
konténeren, akkor az EXPOSE direktívával után meg kell adni
a portot.
A 80-as port exportálása:
EXPOSE 80
Ha elindítanak a képfájllal egy konténert, akkor még ez a parancs fusson le:
CMD '/usr/local/bin/init.sh
A parancs a konténeren belül fut. Ide elhelyezhetünk indító utasításokat,
mint az apache, mysql, stb. Hiszen a konténerben nincs init rendszer.
A képfájl elkészítése:
docker build -t ujlemekepnev .
A "." azt jelenti, hogy az aktuális könyvtárból adunk hozzá, állományt ha van ilyen.
Ha 32 bites rendszeren dolgozunk, itt megint gond lehet, ha le van töltve 64 bites
képfájl, mert az esetleges telepítéseket (apt-get install nano), ebből a képfájlból
próbálja meg a rendszer. Ezért töröljük a 64 bites képfájlokat. Például:
docker rmi debian:jessie
Ha elkészült teszteljük. Hogy minek kell indulnia a /usr/local/bin/init.sh scritben
meg lett adva, ezért indításkor nem kell megadni:
docker run -i -t ujlemezkepnev
Ha volt port is kihelyeve, akkor indítsuk így:
docker run -p 1111:80 -i -t ujlemezkepnev
Ha nem adjuk meg a 1111 portot akkor létrehoz egyet automatikusan.
==== NodeJS alkalmazás futtatás ====
# kezdő képfájl
FROM node:18
# munkakönyvtár:
WORKDIR /app
# Felmásoljuk az index.js
COPY index.js .
# Felmásoljuk a package.js fájlt
COPY package.json .
# Telepítsük a függőségeket:
RUN npm install
# Indítjuk az index.js-t:
ENTRYPOINT [ "node", "index.js" ]
==== Script futtatása induláskor ====
...
COPY start.sh /
ENTRYPOINT ["/start.sh"]
#!/bin/bash
service ssh start
ip address show eth0 | grep "inet "
Adjunk futtatási jogot a start.sh scriptre:
chmod +x start.sh
===== Dokcer felhasználóként =====
Létre kell hozni egy docker csoportot ha az nem létezik:
$ sudo groupadd docker
Hozzá kell adnunk a kívánt felhasználót:
$ sudo gpasswd -a ${USER} docker
A ${USER) részt cseréljük ki a felhasználónévre.
Jelentkezzünk ki és vissza, felhasználóként.
Indítsuk újra a dokcer démont:
$ sudo service docker restart
A felhasználó konténeri közös helyen található fizikailag:
/var/lib/docker/containers
===== Minta =====
Ha már van egy 32-bit debian jessie, és szeretnénk valamit
kipróbálni akkor:
docker run --rm -t -i 32bit/debian:jessie /bin/bash
Ha elindult a rendszer, mehet a próba.
Ha kiléptünk a rendszerből, a rendszer nincs többé.
===== Segítség =====
Linux Mint rendszeren a docke.io kéziköny van segítségünkre:
man docker.io
Az egyes alparancsokat lekérdezhetjük:
docker
A docker kapcsolóit a következő módon kérdezhetjük le:
docker --help
Az alparancsokhoz újabb kapcsolók tartozhatnak. A "run" alparancs
kapcsolóit például így kérdezzük le:
docker run --help
===== Segítség a hibafelderítéshez =====
A hiba tünete:
System error: exec format error
Ok: 64 bites rendszert próbáltál meg indítani 32 bites rendszeren.
===== docker-compose =====
Újabb Docker változatoknál a docker-compose egy bővítménye a docker parancsnak, ezért így használjuk:
docker compose
Debian GNU/Linuxon például, ha a legújabb Dockert tettük fel a Docker webhelyéről:
sudo apt install docker-compose-plugin
* https://docs.docker.com/engine/install/debian/ (2024)
A docker-compose parancs lehetővé teszi, hogy kapcsolók helyett egy yaml fájlba írjuk le, mi kell történjen induláskor.
version: '3.8'
services:
mariadb01:
image: mariadb
container_name: mariadb01
environment:
- MARIADB_ROOT_PASSWORD=titok
ports:
- 3307:3306
volumes:
- ./valami:/var/lib/mysql
Indítás ideiglenesen:
docker-compose up
Vagy:
docker-compose up -d
Vagy ha compose-t bővítményként használjuk:
docker compose up -d
Indulás utána a MariaDB szerver elérhető a **3307**-s porton.
A virtuális géphez kapcsolódás:
docker exec -it mariadb01 bash
==== Kezelés ====
docker compose stop
docker compose start
docker compose down
A down hatására is megmaradnak az adatok.
===== Függelék =====
==== Rebuild ====
#!/bin/bash
imageName=debian
containerName=kontenerNev
docker build -t $imageName -f Dockerfile .
echo Régi konténer törlése...
docker rm -f $containerName
echo Új konténer futtatása...
docker run -d -p 5000:5000 --name $containerName $imageName
Forrás:
* [[https://stackoverflow.com/questions/41322541/rebuild-docker-container-on-file-changes|https://stackoverflow.com/]]
==== Rendszerjogok ====
Biztonsági okokból egy elindított rendszeren nem lehet néhány dolgot megtenni.
Ilyen a gépnév megadása. Erre adhatunk jogot a --cap-add SYS_ADMIN
kapcsolóval. Bánjunk ezzel óvatosan, mert így esetleg ki lehet törni a virtuális
rendszerből.
docker run --rm -it --cap-add SYS_ADMIN debian
További információk a CAPABILITIES-ről:
* http://man7.org/linux/man-pages/man7/capabilities.7.html
A konténer újraindítása után a gépnév így sem marad meg. A gépnevet
az első futtatáskor megadhatjuk a már fentebb említettek szerint:
docker run -it --hostname bar --name bar debian
==== Locale ====
apt-get install locales
export LANG=hu_HU.UTF-8
dpkg-reconfigure locales
echo "export LANG=hu_HU.UTF-8" >> ~/.bashrc
Forrás:
* https://wiki.debian.org/ChangeLanguage
==== Hálózat ====
A Debian rendszeren telepítve van az iproute2 csomag, amely tartalmazza az ip parancsot.
Az Ubuntu rendszeren viszont nincs. Debian rendszeren az iproute2 csomag előtt a net-tools
csomag volt használatos, amelyben megtalálható a ifconfig parancs is.
A Debian GNU/Linux 12 rendszeren a docker saját routing bejegyzést ad a routingtáblához,
ami sorrendben előrébb lesz mint a gazdagép beállításai.
ip route del default
Ha esetleg be kell állítani, mert az eredeti elveszett:
ip route add default via 192.168.50.1
==== Kapcsolódás háttérben futó konténerhez ====
docker attach [OPTIONS] CONTAINER
===== Linkek =====
* http://docs.docker.com/
* http://docs.docker.com/installation/ubuntulinux/
* https://docs.docker.com/installation/debian/
* http://docs.docker.com/windows/step_one/ (Winre)
* https://registry.hub.docker.com/
* https://registry.hub.docker.com/_/centos/
* http://jmkeyes.github.io/post/creating-centos-6-docker-image/
* https://docs.docker.com/desktop/install/debian/ (Debian: legújabb telepítése)