---
# System prepended metadata

title: Docker auf dem Raspberry Pi (LF 5)
tags: [IT-Themen]

---

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



