[[oktatas:linux:virtualizálás|< Virtualizálás]] ====== Docker ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2023, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A Docker-ről ===== A Docker egy konténer szintű virtualizációs eszköz. Nem virtualizál teljes gépet, csak operációs rendszert. A használata során szükség van egy lemezképre (image), amiből konténereket készítünk. A konténereket futtatjuk a lemezképből. A konténerek lehetnek ideiglenesek, amelyek addig léteznek, amíg futnak, vagy tartósak, leállítás után is megmaradnak. ===== Telepítés ===== Windowsra, Linuxra: * https://docs.docker.com/engine/install/debian/ Linuxra is ajánlott a legújabb telepítése. Telepítés saját csomagból Debian GNU/Linuxon: apt install docker.io apt install docker-compose Ha webhelyről telepítjük a Docker-t, a docker-compose parancs nem telepszik. Helyette egy a compose bővítményként (plugin) lesz jelen. Ezért így indítjuk: docker compose up -d Vegyük észre, hogy nincs kötőjel (-) a docker és a compose szó között. ===== Képfájlok ===== Elérhető Képfájlok keresése: * https://hub.docker.com/ Elérhető képfájlok keresése a docker paranccsal: docker search valami Nézzük meg milyen képfájl van a gépünkön: docker images Kezdetben nincs képfájl. A következő parancs letölt egy képfájlt: docker pull debian:latest Nézzük meg újra a képfájlokat: docker images Egy Ubuntu töltése: docker pull ubuntu:14.04 Képfájl törlése: docker rmi ubuntu:14.04 SQL szerver: docker pull mcr.microsoft.com/mssql/server:2019-latest * https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash ===== Konténer indítása ===== ==== Ideiglenes ==== A konténerek alapértelmezetten megmaradnak. Ha szeretnénk kilépés után törölni, használjuk a --rm parancsot. docker run --rm -i -t debian:buster /bin/bash docker run --rm -i -t debian:bullseye /bin/bash docker run --rm -i -t debian:latest /bin/bash ==== Tartós ==== Összes konténer megjelenítése: docker ps -a Futó konténerek megjelenítése: docker ps Létező konténer indítása docker start kontenernev Leállítás: docker stop kontenernev Letöltés és futtatás: docker run -i -t debian:latest /bin/bash * -t terminált kérünk * -i interaktív mód Elnevezéssel: docker run --name valami -i -t debian:latest /bin/bash Konténer törlése: docker rm 6b358caaab4d ==== Gépnév ==== Új konténer létrehozásakor: docker run -it --rm -h gep1 debian ==== Hálózat ==== docker run --net net1 -h gépnév --ip 172.18.0.24 -it debian bash * --net kapcsolódás hálózathoz * --ip IPv4 cím megadása * -h, --hostname gépnév megadása * --add-host gép hozzáadása ehhez: /etc/hosts ==== Külön hálózat ==== Külön hálózat létrehozása: docker network create --subnet=192.168.10.0/24 net2 Indítunk egy konténert a hálózatban: docker run --net net2 -h gep1 --ip 192.168.10.11 -it debian bash ==== Csatlakozás egy géphez ==== docker attach gépnév docker attach azonosító Amit az egyik ír az egyik felületen az a másikon is látszik. Ha az egyik kilép az exit paranccsal a másik is kilépett. === Kilépés leállás nélkül === Ha csatlakoztunk egy ideiglenesen indított konténerhez --rm kapcsolóval, és munkánk befejeztével szeretnénk úgy kilépni, hogy ne álljon le a konténer, akkor használjuk a következő billentyűkombinációt: Ctrl+p, Ctrl+q === Ajánlott indítás === Ajánott a --name használata. docker run -it --rm -h gep1 --name gep1 debian A --name kapcsolóval megadott névhez kell kapcsolódni az attach paranccsal. ===== Debian vendéggép ===== ==== Automatikusan indítás ==== A docker által indított Debianban nem indul init folyamat. Helyette, elsőként a bash indul és más nem. Ezért az automatizálást is a bash-re kell bízni. Például ssh automatikus indításához, a vendég Debianon belül: nano /root/.bashrc A nano szerkesztőt telepíteni kell. ... service ssh start vagy: ... /etc/init.d/ssh start ==== Hálózat ==== Csak akkor állítható a hálózat, ha az új konténert így indítjuk: docker run -it --cap-add=NET_ADMIN --name a3 debian Nincs /etc/network/interfaces, ezért telepítjük az ifupdown csomagot. apt install ifupdown auto lo iface lo inet loopback allow-hotplug eth0 iface eth0 inet dhcp ==== Folyamatok ==== apt install procps Ezek után használható ps parancs: # ps ax PID TTY STAT TIME COMMAND 1 pts/0 Ss 0:00 bash 573 pts/0 R+ 0:00 ps ax ==== Gépnév ==== A gépnév beállítható: docker run --rm -it --cap-add SYS_ADMIN debian sh Alapértelmezetten tiltott, mivel **engedélyezése veszélyes**, esetleg kitörhetnek a konténerből. ==== Pure-ftpd ==== Tünet: # /etc/init.d/pure-ftpd start Starting ftp server: Running: /usr/sbin/pure-ftpd -l pam -8 UTF-8 -J HIGH -u 1000 -E -O clf:/var/log/pure-ftpd/transfer.log -B 421 Unable to switch capabilities : Operation not permitted * Újra kell fordítani a pure-ftpd-t, vagy másik kernel. ==== Virtuális merevlemez ==== Virtuális eszköz: dd if=/dev/zero of=/root/egy.img bs=512 count=1 mknod /dev/sdz b 7 200 losetup /dev/sdz /root/egy.img docker run --rm -it --device=/dev/sdz debian:buster /bin/bash A /dev/sdz létrejön. Partíciónálható. Lecsatolás: losetup -d /dev/sdz ==== Konténer azonosító ==== A konténer azonosító lekérdezése a konténerből: grep docker /proc/self/cgroup | cut -d/ -f3 | head -1 ==== Nyelv ==== A környezet nyelvi beállításához, telepítsük a locales csomagot: apt install locales Állítsuk be a kódolást: export LANG=hu_HU.UTF-8 Generáljuk le a megadott környezetet. dpkg-reconfigure locales Ezek után, minden újonnan indított programban, parancsértelmezőben a beállított nyelv lesz érvényes. A magyar nyelvet állítsuk be, belépéskor, automatikusan: echo "export LANG=hu_HU.UTF-8" >> ~/.bashrc Forrás: * https://wiki.debian.org/ChangeLanguage ==== Mariadb ==== apt update apt install mariadb-server service mariadb start Utána klienssel kapcsolódás rendszergazdaként: mariadb vagy mysql ===== Felhasználók a gazdagépen ===== Rendszergazdaként: gpasswd -a "${USER}" docker vagy: adduser janos docker Vegyük fel janos felhasználóként az új csoportot: exec su -l $USER Ez nem lép ki a terminálból. Másik két lehetőség, de itt új shell jön létre. newgrp docker Vagy: su - $USER ===== Nginx és PHP kompozerrel ===== Hozzuk létre egy html könyvtárat, ahol tároljuk a PHP fájlokat. mkdir html Legyen egy alapvető tartalom: echo " html/index.php echo "echo 'hello';" >> html/index.php Szervernek Nginx-t fogunk használni. Készítsünk a gyökér könyvtárban egy beállítófájlt az Nginx számára. events { } http { server { listen 80; server_name localhost; root /var/www/html; index index.php index.html index.htm; location ~ \.php$ { include fastcgi_params; fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } } Írjuk le a konténerben mit szeretnénk futtatni: version: '3.8' services: web: image: nginx:latest container_name: nginx ports: - "3000:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./html:/var/www/html - ./logs:/var/log/nginx restart: always depends_on: - php php: image: php:8.2-fpm volumes: - ./html:/var/www/html restart: always Indítás: docker compose up ===== Nginx, PHP, shellinabox ===== events { } http { server { listen 80; server_name localhost; root /var/www/html; index index.php index.html index.htm; location ~ \.php$ { include fastcgi_params; fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } } version: '3.8' services: web: image: nginx:latest container_name: nginx ports: - "3000:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./html:/var/www/html - ./logs:/var/log/nginx restart: always depends_on: - php php: image: php:8.2-fpm volumes: - ./html:/var/www/html restart: always shellinabox: image: fhuegli/shellinabox:latest environment: - SIAB_USER=janos - SIAB_PASSWORD=titok - SIAB_SSL=false - SIAB_PKGS= - SIAB_SERVICE=/:LOGIN ports: - 4200:4200 ===== Dockerfile ===== Dockerfile a PHP telepítéssel: FROM php:7.0-fpm RUN docker-php-ext-install mysqli pdo pdo_mysql RUN docker-php-ext-enable mysqli Apache számára konfiguráció: FROM php:7.4-apache COPY 000-default.conf /etc/apache2/sites-available/000-default.conf RUN a2enmod rewrite CMD ["start-apache"] Parancs futtatása: RUN apt-get update && \ apt-get install nodejs Környezeti változók beállítása docker fájlban: ENV MYSQL_ROOT_PASSWORD=root ENV MYSQL_ROOT_USER=root Image készítése: $ docker build . ===== Linkek ===== MsSQL szerver: * https://hub.docker.com/_/microsoft-mssql-server (2021) Docker démon beállításai: * https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file (2024) Oracle képfájlok: * [[https://container-registry.oracle.com/ords/f?p=113:10::::::]] (2024) * https://collabnix.com/how-to-run-oracle-database-in-a-docker-container-using-docker-compose/ Laravel példa: * https://medium.com/@shahroznawaz/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-in-2024-cc8a453e5cda (2024)