[[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)