--- tags: IT-Themen --- # Docker auf dem Raspberry Pi (LF 5) ## Vorbereitung Video - [Installation PI-Image für den Workshop](https://peertube.su/w/uWixqpctfFor6AiYZeKZnC) PI-Image: https://cloud.edutrans21.org/s/4RG99DW3LH3p9Lq ## Szenario - "Laborumgebung" für die Docker Installation ![](https://hackmd.io/_uploads/HkFGI3ALo.png) #### Technische Daten PI-Image: **Version 2.6:** pi_os_64bit_172.16.5.15_v_2_6 <br> **IP-Adresse:** 172.16.5.15/24<br> **User:** itechpi <br> **Password:** itech2022 **VNC-Server:**<br> Start des VNC-Servers -> ```shell itechpi@raspberrypi:~ $ ./vncserverstart.sh ``` VNC-Client öffnen z.B. UltraVNC <br> **Adresse VNC:** 172.16.5.15:5901 <br> **Password:** itech202 ### Netzwerkzugang (ITECH-Schulnetz only) Für den Zugang zum Schulnetz benötigen sie entweder einen via MAC-Adresse registrierten Raspberry PI oder sie bekommen ein Voucher das für die Zeit des Workshops gültig ist. Sollten Sie die Verbindung über ein Voucher herstellen dann müssen sie entweder über ein Netzwerkkabel eine Verbindung zum Gast LAN aufbauen oder sie verbinden sich via WLAN mit dem "BS14-Guest" W-Lan. Um volle Berechtigung zu bekommen können Sie rufen sie die folgende Adresse auf und melden sie sich dann mit den Voucher-Credentials ein. Nur für den Workshop relevant: ```bash 192.168.100.1:8002/index.php?zone=guest ``` <br> # Phase 0 ## Docker vs. Virtual Machines ![](https://writemd.rz.tuhh.de/uploads/892fba9c-6e82-4490-b385-46bc4281c150.png) ## Option 1 ## Docker Installation auf Raspberry Pi ### Upgrade des Systems #### SetDate ```bash sudo date --set="20221108 14:30" ``` #### Update System ``` sudo apt-get update && sudo apt-get upgrade ``` ### Docker mit Hilfe des Installationsscripts installieren **Ordner anlegen um das Script zu speichern** ``` mkdir dockerprj # Im Home Directory z.B. /home/username/dockerprj ``` ``` cd dockerprj ``` **Script download** ``` curl -fsSL https://get.docker.com -o get-docker.sh ``` **Script ausführen** ``` sudo sh get-docker.sh ``` ``` chmod +x get-docker.sh # Sollte sich das script nicht ausführen # lassen dann die Berechtigung x für execute # hinzufügen und den Befehl nochmal ausführen ``` **Sollte bei der Installation ein Fehler auftreten dann bitte folgende Schritte durchführen** Fehlermeldung: E: Sub-process /usr/bin/dpkg returned an error code (1) Step 1: Neustart - ```bash sudo reboot ``` Step 2: Nach dem Login folgende Befehl ausführen ```bash sudo apt-get install --fix-broken ``` --- ## Konfiguration: Ausführen von Docker auch für Non root User ``` sudo usermod -aG docker [user_name] ``` ``` sudo usermod -aG docker itechpi # Username itechpi ``` ```bash sudo reboot #optional ``` ## Erste Schritte in Docker **Anzeige der Docker Version + weitere Information zur Docker-Installtion** ``` docker version # Docker Version anzeigen docker info # Docker Info anzeigen ``` ## Erstes Docker Script ausführen "Hello World" ``` docker run hello-world ``` ## Enable Docker um Docker beim Systemstart auszuführen ``` sudo systemctl enable docker ``` --- ## Option 2 ## Install Docker Desktop all OS mit UX (inkl. Docker-Compose) https://docs.docker.com/compose/install/ ==keine weitere Konfiguration notwendig== --- ## Docker HUB für ARM Architecturen wie dem Rasperry PI [Docker-Hub](https://registry.hub.docker.com/search?q=&type=image&architecture=arm%2Carm64) --- # Phase 1 ## Erstes Anwendungsbeispiel 1. Pfad für Docker Entrypoint festlegen ```bash= mkdir ./sql ``` 1. Datei mit Namen **Dockerfile** erstellen ```bash nano Dockerfile ``` 2. Folgenden Inhalt dort einfügen ```yml= FROM mariadb:latest ADD ./sql/ /docker-entrypoint-initdb.d ENV MYSQL_ROOT_PASSWORD test123 ENV MYSQL_DATABASE testDB ENV MYSQL_USER toto ENV MYSQL_PASSWORD test123 RUN apt-get update && apt-get -y install nano RUN apt-get update && apt-get -y install vim EXPOSE 3306 CMD ["mysqld"] ``` 3. Docker-Image bauen ```bash docker build -t marialf5 . ``` 4. Docker-Container starten ```bash docker run marialf5 & ``` --- 5. Beispiel Container mit mariadb und Volumes - Persistenz ```yml= FROM mariadb:latest ADD ./sql/ /docker-entrypoint-initdb.d ENV MYSQL_ROOT_PASSWORD test123 ENV MYSQL_DATABASE testDB ENV MYSQL_USER toto ENV MYSQL_PASSWORD test123 volume config/initdb:/docker-entrypoint-initdb.d volume data/mysql:/var/lib/mysql volume logs/mysql:/var/log/mysql RUN apt-get update && apt-get -y install nano RUN apt-get update && apt-get -y install vim EXPOSE 3306 CMD ["mysqld"] ``` --- # Phase 2 ## Installieren von Docker-Compose ```bash sudo apt-get install libffi-dev libssl-dev sudo apt install python3-dev sudo apt-get install -y python3 python3-pip ``` ```shell pip install docker-compose ``` ### PATH Variable setzen Damit docker-compose von "überall" ausgeführt werden kann ```shell= export PATH=$PATH:/home/itechpi/.local/bin ``` ==! **Docker-Compose** ist bereits in **Docker Desktop** inkludiert !== --- ## Installieren einer Entwicklungs-Umgebung mit mysql (mariadb) und phpmyadmin via Docker-Compose ![](https://writemd.rz.tuhh.de/uploads/c8261c04-aea3-43af-9fde-913237bef0cf.png) [Docker-Hub phpmyAdmin + MariaDb](https://hub.docker.com/_/phpmyadmin) 1. Datei mit Namen **docker-compose.yml** erstellen ```bash nano docker-compose.yml ``` 2. Folgenden Inhalt dort einfügen ```yml= version: '3.1' services: db: image: mariadb:10.6 restart: always environment: MYSQL_ROOT_PASSWORD: notSecureChangeMe phpmyadmin: image: phpmyadmin restart: always ports: - 8080:80 environment: - PMA_ARBITRARY=1 ``` 4. Docker-Container starten ```bash docker-compose up ``` **Terminal-Zugriff auf einen Docker Container** ``` docker exec -i -t <Container-ID> /bin/bash ``` --- ### phpmyAdmin + MariaDb mit Volumes 1. Datei mit Namen **docker-compose.yml** erstellen ```bash nano docker-compose.yml ``` 2. Folgenden Inhalt dort einfügen ```yml= version: '3.7' services: db: image: mariadb container_name: workshop-mariadb restart: 'always' environment: MYSQL_ROOT_PASSWORD: itechdb MYSQL_DATABASE: ITECH MYSQL_USER: michael MYSQL_PASSWORD: itech2022m MYSQL_USER: stephan MYSQL_PASSWORT: itech2022s volumes: - ./config/initdb:/docker-entrypoint-initdb.d - ./data/mysql:/var/lib/mysql - ./logs/mysql:/var/log/mysql phpmyadmin: image: phpmyadmin container_name: workshop-phpmyadmin restart: 'always' environment: PMA_ARBITRARY: 1 PMA_USER: root PMA_PASSWORD: itechdb ports: - 8080:80 depends_on: - db ``` 4. Docker-Container starten ```bash docker-compose up ``` ### Auszug Docker Befehls-Referenz #### Login Docker Container ```bash docker exec -it <ID> /bin/bash ``` Docker info ```bash docker info ``` ```bash docker --version ``` ```bash docker run -it <Image Name oder Container ID> ``` ```bash docker ps ``` ```bash docker ps -a ``` ```bash docker exec -it <ID> bash ``` ```bash docker rm <ID> ``` ```bash docker ps -a docker rmi ``` ```bash docker restart <ID> ``` ```bash docker stop <ID> ``` ```bash docker start <ID> ``` ```bash sudo docker cp b80:/My_RECH_DB_dump.sql /home/itechpi/My_RECH_DB_dump.sql ``` [Befehlsreferenz](https://geekflare.com/de/docker-commands/) ### Beispiel SQL Dump ```-- MariaDB dump 10.19 Distrib 10.10.2-MariaDB, for debian-linux-gnu (aarch64) -- -- Host: localhost Database: RECH_DB -- ------------------------------------------------------ -- Server version 10.10.2-MariaDB-1:10.10.2+maria~ubu2204 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `Artikel` -- DROP TABLE IF EXISTS `Artikel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Artikel` ( `ArtNr` int(10) NOT NULL AUTO_INCREMENT, `ArtName` varchar(120) NOT NULL, `ArtPreis` double NOT NULL, PRIMARY KEY (`ArtNr`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `Artikel` -- LOCK TABLES `Artikel` WRITE; /*!40000 ALTER TABLE `Artikel` DISABLE KEYS */; /*!40000 ALTER TABLE `Artikel` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `Artikelbestellung` -- DROP TABLE IF EXISTS `Artikelbestellung`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Artikelbestellung` ( `RechNr` int(11) NOT NULL, `ArtikelNr` int(11) NOT NULL, `Menge` int(11) NOT NULL, PRIMARY KEY (`ArtikelNr`,`RechNr`), KEY `RechNr` (`RechNr`), CONSTRAINT `Artikelbestellung_ibfk_1` FOREIGN KEY (`RechNr`) REFERENCES `Rechnung` (`RechNr`), CONSTRAINT `Artikelbestellung_ibfk_2` FOREIGN KEY (`ArtikelNr`) REFERENCES `Artikel` (`ArtNr`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `Artikelbestellung` -- LOCK TABLES `Artikelbestellung` WRITE; /*!40000 ALTER TABLE `Artikelbestellung` DISABLE KEYS */; /*!40000 ALTER TABLE `Artikelbestellung` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `Kunde` -- DROP TABLE IF EXISTS `Kunde`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Kunde` ( `KdNr` int(10) NOT NULL AUTO_INCREMENT, `KdName` varchar(120) NOT NULL, `KdStrasse` varchar(120) NOT NULL, `PLZ` varchar(5) NOT NULL, `Ort` varchar(120) NOT NULL, PRIMARY KEY (`KdNr`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `Kunde` -- LOCK TABLES `Kunde` WRITE; /*!40000 ALTER TABLE `Kunde` DISABLE KEYS */; /*!40000 ALTER TABLE `Kunde` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `Rechnung` -- DROP TABLE IF EXISTS `Rechnung`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Rechnung` ( `RechNr` int(10) NOT NULL AUTO_INCREMENT, `RechDat` date NOT NULL, `KdNr` int(11) NOT NULL, PRIMARY KEY (`RechNr`), KEY `KdNr` (`KdNr`), CONSTRAINT `Rechnung_ibfk_1` FOREIGN KEY (`KdNr`) REFERENCES `Kunde` (`KdNr`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `Rechnung` -- LOCK TABLES `Rechnung` WRITE; /*!40000 ALTER TABLE `Rechnung` DISABLE KEYS */; /*!40000 ALTER TABLE `Rechnung` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2022-11-21 9:24:34 ``` version: '3.7' services: db: image: mariadb container_name: workshop-mariadb restart: 'always' environment: MYSQL_ROOT_PASSWORD: itechdb MYSQL_DATABASE: ITECH MYSQL_USER: itechpi MYSQL_PASSWORD: itech2022pi MYSQL_USER: itechmy MYSQL_PASSWORT: itech2022my volumes: - ./config/initdb:/docker-entrypoint-initdb.d - ./data/mysql:/var/lib/mysql - ./logs/mysql:/var/log/mysql phpmyadmin: image: phpmyadmin container_name: workshop-phpmyadmin restart: 'always' environment: PMA_ARBITRARY: 1 PMA_USER: root PMA_PASSWORD: itechdb ports: - 8080:80 depends_on: - db