# Docker

# Docker Befehle

Docker Befehle

<div class="page-content" id="bkmrk-befehl-beschreibung-"><div dir="auto"><table id="bkmrk-befehl-beschreibung--1"><thead><tr><th>Befehl</th><th>Beschreibung</th></tr></thead><tbody><tr><td>docker start $container</td><td>startet den jeweiligen Container</td></tr><tr><td>docker container ls</td><td>running containers</td></tr><tr><td>docker container ls -a</td><td>all containers</td></tr></tbody></table>

</div></div>

# Docker Einführung

<div class="js-gist-file-update-container js-task-list-container" id="bkmrk-docker-installieren%3A"><div class="file my-2"><div class="Box-body readme blob js-code-block-container p-5 p-xl-6 gist-border-0"><article class="markdown-body entry-content container-lg">## Docker installieren:

```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh

```

Falls kein curl installiert: `apt install curl`

Wenn man nicht mit dem Nutzer Root arbeitet, sollte man den aktuellen Benutzer berechtigen:

```
sudo usermod -aG docker $USER

```

## Mit Docker arbeiten

- Laufende Container auflisten: `docker ps`
- Alle Container auflisten (auch gestoppte): `docker ps -a`
- Einen Container anhalten: `docker stop <Containername>` (den Namen findet man mit `docker ps heraus`)
- Einen gestoppten Container endgültig löschen: `docker rm <Containername>`

## Einen simplen Webserver starten

Der Container aus dem Image nginx fährt mit folgendem Befehl hoch:

```
docker run -p 80:80 nginx

```

Die eigene IP-Adresse erhält man mit `ip a`

## Arbeiten mit Docker-Compose

Legt euch am besten einen eigenen Ordner für das Docker-Projekt an, um Ordnung zu halten. Die Datei docker-compose.yml enthält die Definition der Container.

Bearbeitet wird die Datei mit:

```
nano docker-compose.yml

```

Die Inhalte findet ihr unten in diesem GitHub-Gist. Den Texteditor Nano beendet man mit: `Strg+X`, dann `Y`

Die Compose-Zusammenstellung hochfahren:

```
docker-compose up -d

```

Will man die Container updaten, lädt man die neuen Images mit

```
docker-compose pull

```

## Eine oder mehrere Docker-Compose-Dateien?

Das ist definitiv Geschmachssache und hängt von der Umgebung ab. Wenn man mehr als ein Projekt (zum Beispiel einen Blog und ein Pihole) auf einem Server betreibt, sollte man für jedes einen Ordner anlegen und darin eine Docker-Compose-Datei ablegen. Die nützlichen Helfer wie Portainer und Watchtower kommen zusammen in eine weitere Datei. Dann kann man mit `docker compose down`gezielt Teile der Umgebung herunterfahren.

</article></div></div></div>```yaml
# Die Docker-Compose-Zusammenstellung für Pihole (https://hub.docker.com/r/pihole/pihole)
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "67:67/udp"
      - "80:80/tcp"
    environment:
      TZ: 'Europe/Berlin'
      # WEBPASSWORD: 'set a secure password here or it will be random'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    cap_add:
      - NET_ADMIN
    restart: unless-stopped
```

<div class="js-gist-file-update-container js-task-list-container" id="bkmrk--1"><div class="file my-2" id="bkmrk--2"><div class="Box-body readme blob js-code-block-container p-5 p-xl-6 gist-border-0" id="bkmrk--3"></div></div></div><div class="js-gist-file-update-container js-task-list-container" id="bkmrk--4"><div class="file my-2" id="bkmrk--5"><div class="file-header d-flex flex-md-items-center flex-items-start"></div></div></div>```yaml
# Docker-Compose-Datei für Portainer (https://hub.docker.com/r/portainer/portainer-ce). Antwortet auf Port 9000 des Servers
services:
  portainer: 
    image: portainer/portainer-ce 
    ports: 
     - 9000:9000 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - ./portainer_data:/data 
    restart: always 
```

```yaml

# Docker-Compose-Datei für Watchtower (https://hub.docker.com/r/containrrr/watchtower)
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock
```

# Docker, Docker-Compose und Portainer installieren

<p class="callout info">Weitere Infos zu Docker: [Docker Einführung](https://wiki.hhml.selfhost.co/books/linux/page/docker-einfuhrung "Docker Einführung")</p>

```
sudo apt update && sudo apt upgrade -y
```

## Docker Installation auf Ubuntu

Führe folgende Befehle als root bzw. mit sudo aus:

1. Alle alten Docker-Pakete entfernen (optional, falls vorher installiert):
    
    
    1. ```
        sudo apt-get remove docker docker-engine docker.io containerd runc
        ```
2. Installationsskript herunterladen und ausführbar machen:
    
    <div class="w-full md:max-w-[90vw]"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end md:sticky md:top-[100px]">  
    </div><div class="-mt-xl"><div>`curl -fsSL https://get.docker.com -o get-docker.shchmod +x get-docker.sh`</div></div></div></div>
3. Docker installieren:
    
    <div class="w-full md:max-w-[90vw]"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end md:sticky md:top-[100px]"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base">  
    </div></div><div class="-mt-xl"><div>`sudo sh ./get-docker.sh`</div></div></div></div>
4. Docker-Status prüfen:
    
    <div class="w-full md:max-w-[90vw]"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end md:sticky md:top-[100px]"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base">  
    </div></div><div class="-mt-xl"><div>`sudo systemctl status docker`</div></div></div></div>

Du kannst die Gruppenrechte für deinen User noch anpassen, um Docker ohne sudo verwenden zu können:

<div class="w-full md:max-w-[90vw]" id="bkmrk-sudo-usermod--ag-doc"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end md:sticky md:top-[100px]"><div class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base">  
</div></div><div class="-mt-xl"><div>`sudo usermod -aG docker $USER`</div></div></div></div>Danach ab- und neu anmelden.

## <s>Docker Compose Installation</s>

Empfohlen wird das aktuelle Compose-Plugin via apt oder als Binary:

**Variante 1: Über das Docker Compose Plugin (apt-basiert):**

1. Repository aktualisieren:
    
    <div class="w-full md:max-w-[90vw]"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"><div class="-mt-xl"><div>`sudo apt-get updatesudo apt-get install docker-compose-plugin`</div></div></div></div>
2. Installation prüfen:
    
    <div class="w-full md:max-w-[90vw]"><div class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"><div class="-mt-xl"><div>`docker compose version`</div></div></div></div>

## 4. Portainer installieren

```
docker volume create portainer_data
```

```
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
```

Fertig!

<div class="page-content" id="bkmrk-version-%237-erstellt%3A"><div dir="auto">  
</div>---

<div class="text-muted text-small"><div class="entity-meta"><svg class="svg-icon" data-icon="history" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </svg>Version #7   
<svg class="svg-icon" data-icon="star" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </svg>Erstellt: 19 October 2022 08:30:05 von hermann   
<svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </svg>Zuletzt aktualisiert: 2 November 2022 10:08:43 von hermann</div></div></div>

# Watchtower

<p class="callout info">Watchtower aktuallisiert auch regelmäßig die Docker Container</p>

#### [Einmal ausführen](#bkmrk-einmal-ausf%C3%BChren)

```bash
docker run --rm \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=email \
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=hermann.pelzer@mail.de \
-e WATCHTOWER_NOTIFICATION_EMAIL_TO=hp1984@posteo.de \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.mail.de \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=hermann.pelzer \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=************ \
-e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 \
containrrr/watchtower \
--run-once \
--cleanup \
--include-restarting \
--rolling-restart \
--include-stopped
```

#### Regelmäßig ausführen

```bash
docker run -it -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=email \
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=hermann.pelzer@mail.de \
-e WATCHTOWER_NOTIFICATION_EMAIL_TO=hp1984@posteo.de \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.mail.de \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=hermann.pelzer \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=************* \
-e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 \
containrrr/watchtower:latest \
--cleanup \
--include-restarting \
--rolling-restart \
--include-stopped \
--interval 43200
```

<div class="page-content" id="bkmrk-version-%239-erstellt%3A"><div dir="auto">  
</div>---

<div class="text-muted text-small"><div class="entity-meta"><svg class="svg-icon" data-icon="history" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </svg>Version #9   
<svg class="svg-icon" data-icon="star" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </svg>Erstellt: 19 October 2022 10:58:22 von Herr_admin   
<svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> </svg>Zuletzt aktualisiert: 25 October 2022 17:30:18 von hermann</div></div></div>