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

#### 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

## 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

[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