Hallo, Gast
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.

Benutzername
  

Passwort
  





Durchsuche Foren

(Erweiterte Suche)

Foren-Statistiken
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 521
» Foren-Beiträge: 741

Komplettstatistiken

Benutzer Online
Momentan sind 11 Benutzer online
» 0 Mitglieder
» 6 Gäste
AhrefsBot, Bing, DotBot, Semrush, bot

Aktive Themen
Sunday - 03:00 CDT: Not a...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 12:15
» Antworten: 0
» Ansichten: 16
Saturday - 03:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
05-07-2025, 12:44
» Antworten: 0
» Ansichten: 25
Friday - 15:00 CDT: Not a...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
05-07-2025, 12:44
» Antworten: 0
» Ansichten: 29
Thursday - 03:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
03-07-2025, 11:48
» Antworten: 0
» Ansichten: 35
Wednesday - 06:00 CDT: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
02-07-2025, 03:46
» Antworten: 0
» Ansichten: 37
Tuesday - 14:00 CDT: Not ...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
01-07-2025, 11:46
» Antworten: 0
» Ansichten: 39
Monday - 09:00 CDT: Hazy,...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
30-06-2025, 06:33
» Antworten: 0
» Ansichten: 40
Monday - 05:00 CDT: Not a...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
30-06-2025, 02:34
» Antworten: 0
» Ansichten: 37
Sunday - 16:00 CDT: Not a...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
30-06-2025, 01:44
» Antworten: 0
» Ansichten: 38
Friday - 04:00 CDT: Not a...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
27-06-2025, 01:54
» Antworten: 0
» Ansichten: 45

 
  Docker Infos Heise-Tutorial
Geschrieben von: Joopi - 23-11-2024, 09:50 - Forum: Docker - Keine Antworten

Infos aus dem 6-teiligen Heise-Tutorial

Erstellung eines Volums.

Volums sind dafür da, um eigene Daten aufzunehmen. Damit diese nicht direkt in einen Container erfasst werden, legt man unter /usr/share zum jeweiligen Programm, z.B. nginx, ein Volume an.

Die Syntax wäre in diesem Beispiel wie folgt:

Code:
sudo docker run --name my-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx

some-nginx = Name des Containers
-v = ein Volume anhängen und deklarieren
-d = Dienst läuft im Hintergrund
nginx = Image
ro = read only

Hinweis:
In einem Dockercontainer sind nur die wichtigsten Pakete enthalten. Will man eine Textdatei erstellen, aber ein Editor ist nicht verfügbar, kann man pragmatisch folgendes machen:

Code:
echo "Hallo Docker!" > index.html

Damit erstellt man eine Datei, die dann verwendet werden kann. Will man künftig mehr in dem Container machen, empfiehlt es sich, einen Editor zu installieren (und daraus dann ein eigenes Build zu machen). Das wird so aber nicht empfohlen (?). Insgesamt ist das der denkbar schlechteste Weg.

Fazit:
Mit docker exec in einen Container zu gehen und dort Daten zu bearbeiten ist nicht gut und sollte so nicht gemacht werden.

Die Anwendungsdaten werden im Container nicht gespeichert. Sobald der Container beendet wird, sind die Daten weg. Daher müssen Volumes angelegt werden, die die Anwendungsdaten speichern udn vorhalten.

Um ein Volume zu erzeugen, ist folgender Befehl notwendig:

Code:
sudo docker volume create

Dieser Befehl erzeugt einen langen Name aus Zufallszahlen/-ziffern. Man kann den Volumennamen auch vorgeben:

Code:
sudo docker volume create html

Mit dem ls-Befehl kann ich mir die vorhandenen Volumes anzeigen lassen:

Code:
sudo docker volume ls

Das läuft analog zu den Images und den Containern.

Um nun das erzeugte Volume mit dem Namen html in den nginx-Container zu bringen, wird eine zweite Instanz aufgemacht und ein weiterer Port eröffnet (nicht zwingend erforderlich, nur zur Demonstration):

Code:
sudo docker run --name myvol-nginx -p 8081:80 -v html:/usr/share/nginx/html:ro -d nginx

ro heißt readonly.

Das erzeugte Volume liegt hier:

Zitat:/var/lib/docker/volumes

Dieses Verzeichnis kann ein Normaluser, selbst wenn er in der Gruppe docker ist, nicht sehen (sudo -s)

WICHTIG:
Selbst wenn der Container zerstört wird, bleibt das Volume erhalten. Wichtig ist dann dabei, dass das Verzeichnis /usr/lib/docker gesichert wird, wenn in diesem Verzeichnis Nutzer- und  Anwendungsdaten für die weitere Verarbeitung gespeichert werden, also produktiv genutzt werden.

Die Volumes müssen nicht unbedingt im Docker-Verzeichnis liegen, sondern können an jeder beliebigen Stelle gespeichert werden. Dazu wäre dann z.B. dem Volume HTML das Verzeichnis voranzustellen (Beispiel): /home/django/dockervolume/HTML

Die Prozesse, die innerhalb der Container laufen, müssen allerdings die Berechtigungen auf dieses Verzeichnis haben.


Docker und Netzwerke

Docker erzeugt ein eigenes Netzwerk: docker0

Code:
ifconfig docker0

Docker hat verschiedene Netzwerke, die man sich so anzeigen lassen kann:

Code:
docker network ls

Beispiel, wie zwei Container kommunizieren.

Ein Blogsystem auf Basis WordPress-Blogsystem
  • Container mit Webserver und WordPress
  • Container mit Datenbank MySQL / MariaDB

Container für Datenbank:

Code:
docker run --name test-mysql -e MYSQL_ROOT_PASSWWORD=meinpasswort -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wp -e MYSQL_PASSWORD=meinpasswort -d mysql:5.7

Container für WordPress / Webserver

Code:
docker run --name wordpress --link test-mysql:test-mysql -p 8082:80 -d wordpress

Hinweis:

Zitat:--link anstelle von --name

Dieser Part "test-mysql:test-mysql" bedeutet, dass der Container test-mysql auch als test-mysql angesprochen werden. Soll dieser Name dann anders lauten, müsste er angegeben werden (z.B. test-mysql:test-worpress).

Hinweis:
Docker hat einen eigenen DNS-Server laufen.

Für das obige Beispiel würde im Browser, da wir mit WordPress arbeiten wollen, folgendes einzugebenn sein:

Zitat:localhost:8082

Sodann würde die Installation von WordPress erfolgen.

Die Daten von WordPress werden in der Datenbank abgespeichert. WordPress und die Datenbank sind in zwei Containern aufgeteilt. Um mit den eingegebenen Daten weiter arbeiten zu können, müssten die Daten in ein Volume übertragen werden

Wie das geht, weiß ich noch nicht!

Wenn z.B.  WordPress vom Rest der Welt trennen möchte, dann kann das über ein eigenes Docker-Netzwerk erfolgen. Das sieht dann so aus:

Code:
docker network create --driver bridge test-bridge

Prüfen, ob das Netzwerk angelegt ist bzw. welche vorhanden sind, kann man mit:

Code:
docker network ls

Dieses neue Network kann man an den Run-Befehl für mysql hängen:

Code:
docker run --name test-mysql --network=test-bridge -e MYSQL_ROOT_PASSWWORD=meinpasswort -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wp -e MYSQL_PASSWORD=meinpasswort -d mysql:5.7

Hinweis:

Es gibt den inspect-Befehl. Dieser kann auf das Netzwerk angewandt werden. Um das neue Netzwerk zu inspizieren, ist folgendes notwendig:

Code:
docker network inspect test-bridge

Man kann also in das Netzwerk "hineinschauen".


Wie kann man Docker vereinfachen?

Contaner mit Compose einrichten

Mehrere Container nebeneinander betreiben.

Docker-Compose ist ein Python-Script (offizell von Docke unterstützt), mit dem vereinfacht mehrere Container aufgebaut und miteinander verbunden werden können.

Ein Compose-File ist wie folgt strukturiert (Beispiel MySQL-Container)

Zitat:version: '3'

services:
    db:
        image: mysql:5.7
        volumes:
            - ./data/db/:/var/lib/mysql
        restart: always
        ports:
            - "3306:3306"
        environment:
            MYSQ_ROOT_PASSWORD: secret123root

Die Inhalte sind quasi die gleichen wie in einem run-Befehl.

Die Aussage ist, dass selbst, wenn nur ein Container laufen soll, eine Compose-File nützlich ist.

Der data-Ordner des Volume liegt in dem Ordner, aus dem das Compose-File aufgerufen wird. Der Punkt weist auf die relative Lage hin. Hat mein einen eigenen Bereich auf der lokalen Festplatte eingerichtet, ruft man das File eben von dort aus auf.

Für das Beispiel aus dem Netzwerkabschnitt (WordPress und MySQL) sieht das Compose-File wie folgt aus:

Zitat:version: '3'

services:
    db:
        image: mysql:5.7
        volumes:
            - ./data/db/:/var/lib/mysql
        restart: always
        ports:
            - "3306:3306"
        environment:
            MYSQL_ROOT_PASSWORD: secret123root
            MYSQL_DATABASE: wordpress
            MYSQL_USER: wordpress
            MYSQL_PASSWORD: 12345wordpress54321
           
    wordpress:
        depends_on:
            - db
        image: wordpress:latest
        ports:
            - "80:80"
        restart: always
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: 12345wordpress54321
        working_dir: /var/www/html
        volumes:
            - ./data/wordpress:/var/www/html/wp-content
       
        portainer:
            image: portainer/portainer
            restart: always
            ports:
                mehr sehe ich nicht, scheint ein volume zu sein, ist wohl eine grafische Oberfläche gedacht, also nicht in der Konsole wichtig.

So wird die yml-Datei, in der das Compose-File abgespeichert wurde, ausgeführt:

Code:
docker-compose up
  • up = starten
  • stop = stoppen
  • down = herunterfahren (Container werden dabei sofort gelöscht)

Damit wird wohl alles an Compose-Files gestartet.

Die Ausführung dieses Befehl ist sichtbar, da die Option -d nicht mit angegeben worden ist.

Ansonsten könnte man bei der Sichtbarkeit die einzelnen Aktionen sehen, die ausgeführt würde. Es gibt dann wohl, sobald der Datanbankserver oben ist mit der Installation von Wordpress im Browser.

Hinweis:
In einer yml-Datei ist die Einrückungstiefe immer 2 Leerzeichen. Man kann auch Tabs verwenden, aber zwei Leerzeichen sind wohl Standard.

Um z.B. auf der Shell in die Container mit dem exec-Befehl einzusteigen, kann folgender Befehl genutzt werden:

Code:
docker-compose excec db sh

Damit ist man im Container anstelle des komplexen Befehlaufrufes aus den Anfängen.


Die grafische Oberfläche für Docker

Portainer ist eine bekannte grafische Oberfläche

Sofern im Compose-File der Portainer integriert ist, kann man in der Adressezeile des Browsers über den Port 9000 die Webseite erreichen.

Zitat:localhost:9000

Ich unterstelle derweil, dass das möglich ist, denn in dem Beispiel bei Heise wird mittlerweile eine echte Domain genutzt. Sollte aber auch mit localhost funktionieren.


Zertifikate erstellen

Die Anwendungen, die man in Docker erstellt, kann man sind Internet bringen. Man muss dafür aber vieles beachten, um die Sicherheit zu gewährleisten. Mit Zertifikaten kann man das erreichen.

Eine Grundlage ist z.B. Watchtower (wird niht mehr entwickelt, es gibt was neues) und gehört zu vorherigen Compose-File.

Watchtower ein Image, welches sich um die Aktualisierung von Images kümmert, was durch Docker selber nicht geleistet wird.

Code:
watchtower:
  image: v2tec/watchtower
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  command: --interval 30

Um von außen auf die Anwendung schauen zu können, wird folgendes benötigt (Revers-Server/Proxy oder so ähnlich)

Für das nachfolgende Beispiel muss der WordPress-Container angepasst werden, da diese keine Ports mehr freigeben darf (wird weiter unten mit 80 und 443 gemacht):

Code:
wordpress:
        depends_on:
            - db
        image: wordpress:php7.1
        restart: always
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: 12345wordpress54321
            LETSENCRYPT_HOST: mlsjam.leipsieb.de
            LETSENCRYPT_EMAIL: mls@ct.de
            VIRTUAL_HOST: mlsjam.leipsieb.de
            VIRTUAL_PORT: 80
        working_dir: /var/www/html
        volumes:
            - ./data/wordpress:/var/www/html/wp-content

Ob das auch auf localhost läuft, weiß ich derzeit nicht.

Code:
nginxproxy:
  image: jweilder/nginx-proxy
  restart: unless-stopped
  volumes:
    - ./data/certs:/etc/nginx/certs
    - ./conf:/etc/nginx/conf.d
    - ./dhparam:/etc/nginx/dhparam
    - ./data/vhosts:/etc/nginx/vhost.d
    - ./data/html:/usr/share/nginx.html
    - /var/run/docker.sock:/tmp/docker.sock
  ports:
    - 80:80
    - 443:443
  labels:
    - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
   
nginxproxy_comp:
  image: jrcs/letsencrypt_nginx_proxy_companion
  restart: unless_stopped
  depends_on:
    - nginxproxy
  volumes:
    - ./data/certs:/etc/bginx/certs:rw
    - ./conf:/etc/nginx/conf.d
    - ./dhparam:/etc/nginx/dhparam
    - ./data/vhosts:/etc/nginx/vhost.d
    - ./data/html:/usr/share/nginx.html
    - /var/run/docker.sock:/tmp/docker.sock:ro


In meinen Tests hatte ich mehrere Male die Probleme, dass die Ports z.B. 8080 oder 8081 als belegt gekennzeichnet wurden.

Um herauszufinden, welche Anwendungen die Ports belegen, natürlich können das auch laufende Container sein, ist folgender Befehl hilfereich:

Code:
sudo lsof -i -P -n | grep 8080

Das Ergebnis sieht so aus:

   

Somit ist für mich klar, dass ich den Port 8081 nehme.

Wie ich mit den Ports überhaupt umgehen muss, weiß ich selber noch nicht, wenn es sich um Webanwendungen handelt.

Drucke diesen Beitrag

  Docker installieren
Geschrieben von: Joopi - 23-11-2024, 09:49 - Forum: Docker - Keine Antworten

Docker über Repository installieren für Focal

Auf dieser Webseite habe ich die Installationsanleitung für Docker aus den Repositories für Ubuntu Focal gefunden:

Docker installation on Ubuntu Install via repository

Und hier kommt die Anleitung als Kopie der Webseite.


Docker installation on Ubuntu

Install via repository

Docker installation process on Ubuntu is practically the same as on Debian.

1. Update the distro and install necessary packages:

Code:
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

2. Second step is to add Docker GPG key for Docker

Code:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

3. Verify the key fingerprint:

Code:
$ sudo apt-key fingerprint 0EBFCD88

4. Add the repository:

Code:
$ sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

5. Install Docker:

Code:
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

6. Start and enable the Docker:

Code:
$ sudo systemctl start docker
$ sudo systemctl enable docker

7.  Test Docker also with the hello container

Code:
$ sudo docker run hello-world


Da Docker das IMG nicht findet, kommt erst eine Fehlermeldung, dann aber, wenn der Download erfolgreich war, die Meldung, dass alles gut ist. Sieht dann in der Konsole so aus:

Code:
user@user:/$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:0fe98d7debd9049c50b597ef1f85b7c1e8cc81f59c8d623fcb2250e8bec85b38
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Hello from Docker!** ist die richtige Meldung zum IMG.

Drucke diesen Beitrag

  Docker nutzen
Geschrieben von: Joopi - 23-11-2024, 09:45 - Forum: Docker - Keine Antworten

So wird Docker genutzt

Mal wieder ein guter Link:
Entfernen von Docker-Images, -Containern und -Volumen

oder hier:

Docker run reference

Sobald Docker komplett incl. Engine installiert ist, kann Docker auch genutzt werden. Um Docker zu nutzen, muss man die Image-Namen wissen.  Diese sind z.B. auf dem Docker Hub zu finden.

Docker-Image herunterladen

Code:
sudo docker pull golang

Um zu prüfen, welche Images heruntergeladen worden sind, gilt folgender Befehl:

Code:
sudo docker ps -a
[sudo] Passwort für user:
CONTAINER ID  IMAGE        COMMAND    CREATED        STATUS                    PORTS    NAMES
3b4a2640dd52  golang        "bash"    19 hours ago  Exited (0) 19 hours ago            mystifying_wu
0ee81db39223  ubuntu        "bash"    21 hours ago  Exited (0) 21 hours ago            stupefied_buck
e5afa06d8d02  hello-world  "/hello"  21 hours ago  Exited (0) 21 hours ago            mystifying_bell

Um zu prüfen, welche Container laufen, ist die Option **-a** wegzulassen:

Code:
sudo docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES

Da noch kein Container gestartet wurde, wird auch noch nichts angezeigt, was an Containern läuft.

Mit dem folgenden Befehl wird ein Container aus dem vorher heruntergeladenen Image erstellt und gestartet:

Hier wäre der Dienst im Hintergrund und läuft vor sich hin (detached)

Code:
sudo docker run -d -it --name myneuesdocker golang

oder

Hier wäre der Dienst interaktiv und benutzbar (tached)

Code:
sudo docker run -it --name myneuesdocker golang
0b2cb8ecefe8dbabb95a2078419a8585dc5b224693809a1560fff8321c429f0e

Hinweis

Wenn der run-Befehl ausgeführt wird, dann wird z.B. hinten nach dem Imagenamen ein Befehl angehängt, der dann ausgeführt werden soll. Wenn nichts angegeben wird, wird der Standardprozess gestartet.

Beispiel

Ubuntu - der Aufruf des Images zur Erstellung des Container kann mit ... ubuntu bash ... enden, damit nach dem Start des Containers sofort eine Bash vorhanden ist.

Es wird eine lange ID ausgegeben, wobei die ersten 12 Stellen wohl später die ID für die laufen  Container darstellen.

Um zu prüfen, ob der Container läuft, ist wieder folgender Befehl abzusetzen:

Code:
sudo docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED              STATUS              PORTS    NAMES
0b2cb8ecefe8  golang    "bash"    About a minute ago  Up About a minute            myneuesdocker

Nun wird gezeigt, welche Container laufen. In diesem Falle ist es nur der Golang-Container.

Was der Name myneuesdocker, den ich selber kreiert habe, zu bedeuten hat, weiß ich noch nicht.

Ich weiß auch noch nicht, wo Docker den Pull-Download ablegt und wo der Container wirklich liegt. Denn eigentlich müsste mindestens eine Datei zu finden sein. In Linux wird alles in Dateien erledigt.

Um mit dem Container arbeiten zu können, ist folgender Befehl notwendig:

sudo docker exec -it myneuesdocker bash
root@0b2cb8ecefe8:/go#

In diesem Falle landet man als root in einem Bash-Terminal und kann loslegen.

Um zu prüfen, welche Ordner bzw. Dateien nun zur Verfügung stehen, ist nur der **ls**-Befehl notwendig:

root@0b2cb8ecefe8:/go# ls
bin  src

Die Ausgabe ist sehr minimalistisch, da nur die notwendigen Abhängigkeiten erfüllt werden. Das ist eben der große Vorteil von Docker mit den Containern gegenüber den Virtualisierungstools.

Um den Container zu verlassen, ist nur dies erforderlich:

Code:
root@0b2cb8ecefe8:/go# exit
exit
user@user:~$

Damit ist man wieder auf der eigenen Maschine unterwegs und nicht mehr im Container. Der Container läuft aber noch und ist somit jederzeit wieder zu betreten.

Um einen Container mit dem Host, also dem eigenen Computer zu verbinden, ist beim Aufruf von run der Port mitzugeben:

Code:
sudo docker run -d -t -p 80:80 --name myneuesdocker golang

Dieser Aufruf wurde auf dem Kanal von NetworkChuck in Verbindung mit einem anderen Betriebssystem genutzt. Ob das mit meinem Beispiel auch so geht, weiß ich nicht. Aber man kann Container mit dem eigenen Betriebssystem verbinden.

In dem Beispiel hat er in dem Container seine Trainingswebseite in einem Browser aufgerufen.

Um einen Container zu beenden, ist folgender Befehl notwendig:

Code:
user@user:~$ sudo docker stop myneuesdocker
myneuesdocker

Wenn man prüfen will, ob das Stoppen durchgeführt wurde, hilft wieder:

Code:
user@user:~$ sudo docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES

Sollte man den Container nochmal benutzen müssen, kann man ihn wieder starten:

Code:
user@user:~$ sudo docker start myneuesdocker
myneuesdocker

Die Prüfung zeigt, dass der Container wieder gestartet ist:

Code:
user@user:~$ sudo docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED          STATUS          PORTS    NAMES
0b2cb8ecefe8  golang    "bash"    54 minutes ago  Up 25 seconds            myneuesdocker

Dieses Start und Stop ist nicht mit dem **run**-Befehl zu verwechseln, denn damit wurde das Image gestartet. Der Container wurde dann separat in einem nächsten Schritt gestartet (docker exec ...)

Je nach dem mit welcher Computerausstattung man unterwegs ist, muss man die Ressourcen im Auge behalten. Auch dafür ist gesorgt und mit folgendem Befehl kann man die Speicherauslastung prüfen:

Code:
sudo docker stats

Die Ausgabe dieses Befehls zeigt die Auslastung von CPU, RAM usw.
Da nur ein Container läuft, ist die Ausgabe relativ knapp:

   

Code:
CONTAINER ID  NAME            CPU %    MEM USAGE / LIMIT  MEM %    NET I/O      BLOCK I/O  PIDS
0b2cb8ecefe8  myneuesdocker  0.00%    824KiB / 62.73GiB  0.00%    12.2kB / 0B  0B / 0B    1



Das Management von Images und Containern ist nicht unbedingt einfach. Über folgenden Befehl kann man sich die Hilfe anzeigen lassen:

Code:
docker --help

Will man zu einzelnen Kommandos etwas wissen, muss der Befehl so aussehen:

Code:
docker system --help

Damit werden dann weitere Hilfen angezeigt, was man eben machen kann.

Im Laufe der Zeit werden sich vielleicht einige Images und Container ansammeln, die man nicht mehr haben will oder gebrauchen kann/möchte.

Um herauszufinden, welche Images vorhanden sind, ist dieser Befehl notwendig:

Code:
sudo docker images -a
REPOSITORY    TAG      IMAGE ID      CREATED        SIZE
golang        latest    0821480a2b48  10 days ago    862MB
ubuntu        latest    1318b700e415  2 weeks ago    72.8MB
hello-world  latest    d1165f221234  5 months ago  13.3kB

Dieser Befehl ist nicht mit der ps-Option zu verwechseln, die Container betrifft.

Diese Auflistung kann dazu verwendet werden, dass Images, die nicht mehr gewünscht sind, entfernt werden (es können mehrere Images angegeben werden):

Code:
user@user:~$ sudo docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container e5afa06d8d02 is using its referenced image d1165f221234

Der Löschbefehl wurde nicht akzeptiert. Verstanden habe ich das bislang noch nicht.



Exkurs

Das habe ich hier gefunden Docker error cannot delete docker container, conflict: unable to remove repository reference

Code:
docker container ls -a
docker image ls
docker container rm <container_id>
docker image rm <image_id>

Mit dem ersten Befehl werden alle Container gelistet.
Mit dem zweiten Befehl werden alle Images gelistet.
Diese Befehle sind notwendig, um die ID von Container und Images herauszufinden. Anscheinend müssen erst die Container entsorgt werden, bevor die Images gelöscht werden können.



Nun wird zunächst ein Container (Hello-World aus der Installation) gelöscht:

Code:
user@user:~$ sudo docker container rm e5afa06d8d02
e5afa06d8d02

Hiermit wird dann geprüft, ob der Container weg ist:

Code:
user@user:~$ sudo docker container ls -a
CONTAINER ID  IMAGE    COMMAND  CREATED        STATUS                    PORTS    NAMES
0b2cb8ecefe8  golang    "bash"    2 hours ago    Up 41 minutes                      myneuesdocker
3b4a2640dd52  golang    "bash"    20 hours ago  Exited (0) 20 hours ago            mystifying_wu
0ee81db39223  ubuntu    "bash"    23 hours ago  Exited (0) 23 hours ago            stupefied_buck

Sobald der Container gelöscht ist, kann auch das Images gelöscht werden:

Code:
django@django:~$ sudo docker image rm d1165f221234
Untagged: hello-world:latest
Untagged: hello-world@sha256:0fe98d7debd9049c50b597ef1f85b7c1e8cc81f59c8d623fcb2250e8bec85b38
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd

Und hier die Prüfung der vorhandenen Images:

Code:
user@user:~$ sudo docker image ls
REPOSITORY  TAG      IMAGE ID      CREATED      SIZE
golang      latest    0821480a2b48  10 days ago  862MB
ubuntu      latest    1318b700e415  2 weeks ago  72.8MB

Das Image wurde tatsächlich gelöscht.



Es gibt auch eine radikale Methode, um verwaiste Container zu entsorgen. Da muss man schon ein bisschen aufpassen, um nicht zu viel zu entsorgen:

Code:
docker system prune -a
WARNING! This will remove:

all stopped containers
all networks not used by at least one container
all unused images
all build cache




Aus der Webseite zum Entfernen von Containern

Entfernen von Containern

Entfernen von einem oder mehreren spezifischen Containern

Verwenden Sie den Befehl docker ps mit dem Flag -a, um den Namen oder die ID der Container zu finden, die Sie entfernen möchten.

Auflisten:

Code:
docker ps -a

Entfernen:

Code:
docker rm ID_or_Name ID_or_Name

Entfernen eines Containers beim Beenden

Falls Sie bei der Erstellung eines Containers wissen, dass Sie ihn nicht behalten möchten, wenn Sie damit fertig sind, können Sie `docker run --rm` ausführen, um ihn beim Beenden automatisch zu löschen.

Ausführen und entfernen:

Code:
docker run --rm image_name

Entfernen aller beendeten Container

Sie können Container mit `docker ps -a` finden und anhand ihres Status filtern: erstellt, wird neu gestartet, wird ausgeführt, angehalten oder beendet. Zum Überprüfen der Liste der beendeten Container verwenden Sie das Flag `-f`, um anhand des Status zu filtern. Wenn Sie wissen, dass Sie diese Container entfernen möchten, nutzen Sie `-q`, um die IDs an den Befehl `docker rm` zu übergeben.

Auflisten:

Code:
docker ps -a -f status=exited


Entfernen:

Code:
docker rm $(docker ps -a -f status=exited -q)




Löschen aller unbenutzten oder unreferenzierten Images, Container, Volumen und Netzwerke

Docker bietet einen einzelnen Befehl zur Bereinigung beliebiger Ressourcen – Images, Container, Volumen und Netzwerke –, die unreferenziert (also nicht mit einem Container verknüpft) sind:

Code:
docker system prune

Um auch angehaltene Container und alle nicht verwendeten Images zu entfernen (nicht nur unreferenzierte Images), fügen Sie dem Befehl das Flag `-a` hinzu:

Code:
docker system prune -a

Entfernen von Docker-Images

Entfernen von einem oder mehreren spezifischen Images

Verwenden Sie den Befehl `docker images` mit dem Flag `-a`, um die ID der Images zu finden, die Sie entfernen möchten. Dadurch wird Ihnen jedes Image angezeigt, einschließlich dazwischenliegender Image-Ebenen. Wenn Sie die Images gefunden haben, die Sie löschen möchten, können Sie ihre ID oder ihr Tag `docker rmi` übergeben:

Auflisten:

Code:
docker images -a


Entfernen:

Code:
docker rmi Image Image

Entfernen von unreferenzierten Images

Docker-Images bestehen aus mehreren Ebenen. Unreferenzierte Images sind Ebenen, die keine Beziehung zu getaggten Images haben. Sie dienen keinem Zweck mehr und verbrauchen Festplattenspeicher. Sie lassen sich finden, indem Sie das Filter-Flag (`-f`) mit dem Wert `dangling=true` zum Befehl `docker images` hinzufügen. Wenn Sie sicher sind, dass Sie sie löschen möchten, können Sie den Befehl `docker images purge` verwenden:

Anmerkung:

Wenn Sie ein Image erstellen, ohne es mit einem Tag zu versehen, wird das Image in der Liste der unreferenzierten Images angezeigt, da es keine Zuordnung zu einem getaggten Image aufweist. Sie können diese Situation vermeiden, indem Sie beim Erstellen ein Tag angeben; außerdem können Sie Images mit dem Befehl docker tag im Nachhinein mit einem Tag versehen. 

Auflisten:

Code:
docker images -f dangling=true

Entfernen:

Code:
docker images purge

Entfernen von Images gemäß einem Muster

Sie können alle Images finden, die mit einem Muster übereinstimmen, indem Sie eine Kombination aus docker images und grep nutzen. Wenn Sie damit zufrieden sind, können Sie sie durch awk löschen, um die IDs an `docker rmi` zu übergeben. Beachten Sie, dass diese Dienstprogramme nicht von Docker bereitgestellt werden und nicht unbedingt für alle Systeme verfügbar sind:

Auflisten:

Code:
docker images -a |  grep "pattern"

Entfernen:

Code:
docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi

Alle Images entfernen

Alle Docker-Images in einem System können aufgelistet werden, indem Sie dem Befehl docker images -a hinzufügen. Wenn Sie sicher sind, dass Sie alle löschen möchten, können Sie das Flag -q hinzufügen, um die Image-ID an docker rmi zu übergeben:

Auflisten:

Code:
docker images -a

Entfernen:

Code:
docker rmi $(docker images -a -q)




Noch eine Hilfe, sollte man mehrere Container laufen haben:

If you want to cleanup docker images and containers

CAUTION: this will flush everything

stop all containers

Code:
docker stop $(docker ps -a -q)

remove all containers

Code:
docker rm $(docker ps -a -q)

remove all images

Code:
docker rmi -f $(docker images -a -q)




Wo liegen die Docker-Images?

Mit folgendem Befehl kann man die Docker-Infos ermitteln:

Code:
sudo docker info

Die Ausgabe länger und die Antwort auf die Frage im letzten Teil der Ausgabe zu sehen:


Code:
user@user:~$ sudo docker info
Client:
Context:    default
Debug Mode: false
Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
Images: 0
Server Version: 20.10.8
Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: e25210fe30a0a703442421b0f60afac609f950a3
runc version: v1.0.1-0-g4144b63
init version: de40ad0
Security Options:
  apparmor
  seccomp
  Profile: default
Kernel Version: 5.11.0-25-generic
Operating System: Ubuntu 20.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 16
Total Memory: 62.73GiB
Name: django
ID: RTKL:M23W:E6CV:JO3K:YVNJ:GXXS:I5XO:3UU3:R654:KJQX:AXYO:L43R
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
  127.0.0.0/8
Live Restore Enabled: false

Der docker-root-ordner liegt hier:

Zitat:/var/lib/docker

docker ist ein Ordner, der mit einem Schloss versehen ist:

   

Die Images und Container werden in diesem Pfad abgespeichert, aber nicht namtlich erkennbar, sondern mit SHA256-Codenamen. Somit sind diese Dateien außerhalb der Einflussnahme durch den User, also durch mich. Ich kann nur das Management betreiben. So sieht der Ordner im Midnight-Commander aus:

   

Somit kann ich nun am 16.08.2021 in das echte Handling von Docker einsteigen.

Docker kann nur Serversoftware verarbeiten. Grafische Oberflächen kann Docker nicht darstellen und war auch nicht Sinn und Zweck für die Entwicklung dieses Tools. Die möglichen Betriebssystem, die in Docker laufen, sind also immer nur die Serverversionen, nie die Desktop-Versionen.

Damit der Normaluser mit Docker arbeiten kann, ist er zur Gruppe Docker hinzuzufügen:

Code:
sudo usermod -aG docker django


Nach einer Neuanmeldung ist die Gruppenzuordnung aktiv.

Exkurs

Im Normalfall wird erst der Pull-Befehl und dann der Run-Befehl ausgeführt. Man kann aber auch direkt den Run-Befehl ausführen. Wird das Images nicht gefunden, wird es heruntergeladen. Also wird der Pull-Befeh implizit ausgeführt.



Die Option -d im Run-Befehl sorgt dafür, dass der Container im Hintergrund läuft.

Die Option -p 8080:80 sorgt dafür, dass man innerhalb des Container einen nach außen geöffneten Port zur Verfügung hat. Bei Webserver, die später im Webbrowser ausgeführt werden, oder bei anderen Webanwendungen (z.B. Ghost) ist das notwendig. Im Browser wäre anzugeben: localhost:8080

Die wichtigsten Befehle nochmal zusammengefasst:
  • docker pull imagename
  • docker ps
  • docker ps -a (zeigt auch laufende Container)
  • docker run -d -t --name **platzname** imagename
  • docker exec -it **platzname** bash oder sh (wo der Container laufen soll)
  • exit (aus Container aussteigen)
  • docker stop **platzname** (Container stoppen)
  • docker start **platzname** (Container starten)
  • docker info
  • docker stats
  • docker --help
  • docker command --help
  • docker images -a
  • docker container ls -a
  • docker image ls
  • docker volume ls
  • docker container rm ID-Container oder Name
  • docker image rm ID-Image oder Name
  • docker system prune -a (mit Vorsicht, alles alle Container, die unbenutzt sind.
  • docker run --rm image_name (Vorsicht: beim Beenden wird der Container direkt wieder gelöscht)



Eigene Daten sollte man nicht in den Container kopieren, sondern via Volumes bereitstellen, die dann vom Container genutzt werden. Da ist z.B. für einen Webserver gut, der in einem Container läuft und die HTML-Seiten liegen dann im Volume.



Zwar läuft z.B. ein Webserver in einem Container, aber gleichzeitig wird er auch vom Host, also vom eigenen Computer erkannt. Mit folgendem Befehl kann man prüfen, ob z.B. nginx ausgeführt wird, der in eiinem Container läuft:

Code:
ps axu | grep nginx

Drucke diesen Beitrag

  Das Docker-MOC
Geschrieben von: Joopi - 23-11-2024, 09:43 - Forum: Docker - Keine Antworten

Das MOC für Docker

Meine eigenen Aufzeichnungen zum Handling von Docker. Sehr unvollständig, weil neben dem Erlernen einfach mitgeschrieben.

Hinweis

Am 06.11.2022 habe ich den Ablageort der Docker-Images von **/var/lib/docker** nach **/media/django/virtualbox/dockerworld/docker** verändert.
Der Grund ist und war, dass die separate SSD mehr Platz für solche Dateien hat.

ACHTUNG

Beim Run-Befehl von Docker bedeutet die Option -v nicht die Hinzunahme eines Volumes, sondern eines Bind-Mounts.
Ein Volume wird anders angegeben.
Ein Volume ist auch ein Ordner, aber ein leerer Ordner, der von Docker später verwaltet wird.

Ein Volum wird erstellt mit

Code:
docker volume create my_volume

und kann angeschaut werden mit:

Code:
docker volume ls

Die Volumes liegen dort, wo auch die Images abgelebt werden (/var/lib/docker oder an veränderter Stelle)

Beim Weiterreichen des Volumes ist die gleiche Schreibweise zu nutzen wie vom Bind-Mount, also mit der Option -v.

Scripte und Beschreibungen

Docker nutzen
Docker installieren
Docker Infos Heise-Tutorial
Docker Eigene Daten
Docker img installieren
Docker images Nutzung
Docker handling compose
Docker neues handling 20221105

Drucke diesen Beitrag

  Saturday - 12:00 CST: Not available, 14°C (57°F)
Geschrieben von: Joopi - 23-11-2024, 09:37 - Forum: Wetter in Little Rock - Keine Antworten

Saturday - 12:00 CST: Not available, 14°C (57°F)

Temperature: 14°C (57°F), Wind Direction: South Westerly, Wind Speed: 5mph, Humidity: 49%, Pressure: 1021mb, Falling, Visibility: Good


https://www.bbc.co.uk/weather/

Drucke diesen Beitrag

Information Dockerfile
Geschrieben von: Joopi - 23-11-2024, 09:21 - Forum: Docker - Keine Antworten

Von Zeit zu Zeit befasse ich mich mit Docker, allerdings ohne durchschlagenden Erfolg. Es fehlt mir an Möglichkeiten und auch an Phantasie.

In meinen Dokumentationen habe ich noch eine Notiz gefunden, die sich mit der Erstellung von Dockerfiles befasst. Diese möchte ich nicht verlieren, also archiviere ich das Thema hier.

Da ich mich auch mit DOCKER-SAP befassen will, erscheint mir dieses Forum gut für die Sammlung von Informationen zu sein.

Code:
# Zugrundliegendes Image
# steht so in der requirements.txt
FROM python:3.7-slim

# Mir ist noch nicht klar, ob das in DIR im Container sein wird.
WORKDIR /app

# Kopieren der Requirements - alle Dateien im aktuellen Verzeichnis kopieren (der Punkt ist das aktuelle Verzeichnis
ADD . /app

# Installieren der Requirements
# --trusted-host sollte tunlichst immer dabei sein (muss aber nicht)
RUN pip install --trusted-host pypi.python.org -r requirements.txt

#Port 80 (Webanwendung) veröffentlichen
EXPOSE 80

# app.py ist die erstellte Flask-App
CMD ["pyhton", "app.py"]

Drucke diesen Beitrag

Lightbulb Einigen Code zu MySQL
Geschrieben von: Joopi - 23-11-2024, 09:06 - Forum: Programmieren - Keine Antworten

MySQL - wichtige Stringfunktionen

CHAR_LENGTH(str ): Gibt die Länge eines Strings zurück. Sehr interessant um zu wissen wie lange eine Zeichenkette ist. Diese Funktion zählt die Zeichen, nicht die Bytes.

Code:
SELECT CHAR_LENGTH( "Hallo" );

ergibt also:

Zitat:5

LEFT(str,len): Gibt die ersten len Buchstaben eines Strings der linken Seite zurück.

Code:
SELECT LEFT( "das ist ein Test", 9 );

würde demzufolge "das ist e" zurückgeben.

RIGHT(str,len): Gibt dementsprechend die rechte Seite eines Strings zurück.

Code:
SELECT RIGHT("Das ist ein TEST",10);

ist dann "t ein TEST".

MySQL - verbinden zweiter Tabellen per JOIN

Sehr häufig müssen 2 Tabellen miteinander verbunden werden. Denn oft stehen Tabellen mit einander in Verbindung. Zum Beispiel beinhaltet eine Tabelle mit Kundendaten in einer Spalte das Bundesland in dem der Kunde wohnt. Natürlich könnte man jetzt immer dort "Hessen" eintragen. Geschickter ist es aber in dieser Spalte nur eine Nummer zu hinterlegen, die in der Tabelle "Bundesländer" dann mit der id von Hessen verknüpft ist.

Viele werden jetzt sagen: "Hessen ist doch schnell getrippt, warum Tabellen verbinden". Das schöne ist, man kann komplette Datensätze miteinander verbinden, ohne alle Angaben nochmal eintragen zu müssen. Zum Beispiel braucht man dann in einer Tabelle "Rechnungen" nicht mehr alle Kundeninformationen speichern wie z.B. Name, Strasse, plz, ort. Sondern man speichert nur noch die Zahl oder id des Kunden aus der "Kundentabelle". Man spricht hier von Entitäten.

Eingie Varianten sind LEFT JOIN, RIGHT JOIN, oder INNER JOIN. Hier mal 3 Beispiele:

Code:
SELECT * FROM kunde
INNER JOIN rechnung ON kunde.id=rechnung.rech_id;

Bei einem INNER JOIN werden zum Beispiel nur die Daten angezeigt, die in beiden Tabellen übereinstimmen. Also werden in diesem Fall nur Kunden mit einer Rechnung angezeigt.

Code:
SELECT * FROM kunde
LEFT JOIN rechnung ON kunde.id=rechnung.rech_id;

Bei einem LEFT JOIN werden zum Beispiel alle Daten der Linken Tabelle des Joins angezeigt, und wenn in der Rechten Tabelle keine übereinstimmenden Daten vorhanden sind, bleiben diese Spalten dann eben leer. Also werden in diesem Fall alle Kunden angezeigt, ob Sie eine rechnunge haben oder nicht.

Code:
SELECT * FROM kunde
RIGHT JOIN rechnung ON kunde.id=rechnung.rech_id;

Dieses Beispiel macht eigentlich keinen Sinn. Es besagt, daß alle Rechnungen angezeigt werden sollen, auch wenn es für diese Rechnung in der Tabelle Kunden keinen Kunden gibt. Und Rechnungen ohne Kunden machen nun wirklich keinen Sinn. Aber dennoch braucht man diese Funktion. Stellen Sie sich zum Beispiel den Fall vor, daß ein Kunde aus versehen aus der Kundentabelle gelöscht wurde. Mit dieser Funktion kann man jetzt nach Rechnungen suchen, die keinen Kunden haben.

MySQL - Bei einer MySQL die Standart-Kollation ändern

Da hat man eine neue MySQL Datenbank angelegt, und muss nach dem Einfügen der Tabellen mit entsetzen feststellen, dass alle Text-Spalten mit der Standart Kollation latin1_swedish_ci angelegt werden. Da kann es dann schon mal zu Problemen mit den Umlauten kommen. Wie kann man jetzt den Standart der Kollation auf einen Anderen setzen? Hier ist der SQL-Befehl:

Code:
ALTER DATABASE `db-name`
DEFAULT CHARACTER SET latin1
COLLATE  latin1_german1_ci;

Wenn man, wie es normalerweise der Fall ist, oft mit Umlauten und vielleicht sogar mit der russischen Schrift arbeitet, dann ist es besser folgende Collation zu benutzen.

Code:
ALTER DATABASE `db422430845`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;

MySQL - aktuelle Zeit oder Datum in eine Spalte schreiben

Sehr oft kommt es for daß man das aktuelle Datum in eine Spalte einer Tabelle eintragen will. Sehr häufig benutzt man es für eine Spalte in der der letzte Log-In protokolliert wird. Oder man will festhalten wann ein Datensatz angelegt, oder das letzte Mal geändert wurde. Man kann das in php erledigen, und den wert dann gleich richtig formatiert mitschicken, man könnte das aber sofort und einfacher per MySQL erledigen. Hier wird jetzt das Datum samt Urzeit im richtigen Format für eine MySQL-Tabelle eingetragen: '2012-01-19 10:03:25'

Code:
UPDATE tabelle SET login=NOW()

Wenn Sie nur das Datum eintragen möchten, dann wäre das hier das richtige. Hier wird jetzt nur das Datum im richtigen Format für eine MySQL-Tabelle eingetragen: '2012-01-19'

Code:
UPDATE tabelle SET login=CURDATE()

Wegen der Vollständigkeit hier noch die Zeit. Mit den beiden letzten funktionen könnte man dann die Logindaten in zwei verschiedene Spalten schreiben. Eine für das Datum eine für die Zeit. Hier wird jetzt die Urzeit im richtigen Format für eine MySQL-Tabelle eingetragen: '10:03:25'

Code:
UPDATE tabelle SET login=CURTIME( );

MySQL - Ein Deutsches Datum per SQL in die Datenbank schreiben

Oft steht man vor dem Problem, daß mann ein Deutsches Datum in eine Zelle schreiben muss. Doch dummerweise versteht MySQL das deutsche Datumsformat nicht. Oft wird dann mit php oder anderen Scripten das Datum in kleine Teilstrings zerstückelt. Doch hier gibt es einen kleinen netten SQL-Befhel, der das alles wie von selbst macht. Hier ist der SQL-Befehl:

Code:
INSERT INTO `tabelle` (`id` ,`datum`) VALUES ('', STR_TO_DATE('14.04.2006', '%d.%m.%Y'));

MySQL - Ein Datum aus der MySQL-Datenbank im Deutschen Format anzeigen

Wir wissen jetzt, wie man ein Deutsches Datum in die Datenbank bekommt. Doch wie bekommt man es jetzt von dort wieder im Deutschen Format raus ??? Hierfür gibt es jetzt noch ein MySQL-Befehl, und der sieht so aus:

Code:
SELECT DATE_FORMAT(datum, '%d.%m.%Y') AS MeinDatum FROM tabelle;

MySQL - Mit IN Array eine MySQL-Datenbank durchsuchen

Manchmal kommt es vor, daß man eine Datenbank nach mehreren Begriffen durchsuchen muss. Man könnte jetzt natürlich die Begriffe aneinanderreihen nach dem Motto: "WHERE test LIKE 'A' OR test LIKE 'B' OR test LIKE 'C' ". Aber das macht den MySQL Code sehr unübersichtlich, wenn man mal gerne 20 oder mehr Begriffe abfragen möchte. Hier gitb es eine tolle Hilfe. Den Befehl IN ('A', 'B', 'C').

So würde das Ganze dann aussehen:

Code:
SELECT *
FROM tabelle
WHERE test IN ('A', 'B', 'C');

Wenn das Array schon in php in einer Variable vorliegt, könnte man das Ganze noch besser machen. Und zwar so:

Code:
$array = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I');
$SQLarray = "'" . implode("','", $array) . "'";

$MySQL = "SELECT * FROM tabelle WHERE test IN ($SQLarray);";
echo $MySQL;

MySQL - Datensätze aus zwei Spalten in einer Spalte zusammenfassen

Ab und zu kommt es auch vor, daß man die Werte zweier Spalten in einer Spalte zusammenfassen möchte. Auch hierfür gibt es einen bestimmten SQL-Befehl. In meinem Beispiel werden die beiden Werte mit einem Komma getrennt in die 3. Spalte geschrieben. Hier ist der SQL-Code:

Code:
UPDATE INTO tabelle1 
SET Spalte3 = CONCAT( Spalte1, ', ', Spalte2 )
WHERE bedingung = 1


MySQL - Mit IF eine MySQL-Datenbank abfragen

Heute ist es mir mal wieder passiert, dass ich in einer Datenbank eine Abfrage machen wollte mit der man auf einen bestimmten Umstand anders reagieren könnte. Und dabei ist mir mal wieder nicht die richtige Syntax eingefallen. Ich wollte den Inhalt einer Spalte abfragen, und wenn diese nicht vorhanden ist, soll der Wert einer anderen Spalte genommen werden.

Der Grund dafür könnte sein, dass eine Tabelle verschiedene Sprachversionen in den einzelnen Spalten ist, und wenn jetzt z.B. Spanisch noch nicht übersetzt ist, soll er eben die Übersetzung aus der Englischen Spalte nehmen.

So würde das Ganze dann aussehen:

Code:
SELECT IF(spanisch LIKE '',englisch,spanisch) AS MeinText
FROM tabelle
WHERE id = 1;


Das schöne daran ist, ich kann jetzt in meinem php Code einfach echo $row['MeinText']; einbauen und muss mich dann hier nicht mit einer php IF-Then-Else Geschichte rumplagen, da es in MySQL doch einfacher zu handhaben ist.

Vielleicht hilft Euch das ja weiter. Mir hat es zumindest geholfen. :-)

MySQL - Datensätze suchen, die nicht einer Anforderung entsprechen

Heute stand ich vor dem Problem Datensätze zu suchen, die einem Kriterium nicht entsprechne dürfen. Da ich dies schon öfter benutzt habe und heute danach gefragt wurde, möchte ich dies jetzt hier für die Nachwelt festhalten. Hier ist der relativ simple SQL-Code für My SQL

Code:
SELECT * FROM teballe
WHERE spalte NOT LIKE 'SuchBegriff';

MySQL - Bei einer WHERE Abfrage nach einem Teilstring suchen

Wie macht man es, wenn man nur nach einem Teilstring in MySQL suchen möchte? Das ist sehr ähnlich wie bei MS Access. Einfach mit left und right scuhen, wenn sich der Teilstring am Ende oder am Anfang befindet.

Code:
SELECT * FROM tabelle
WHERE left(spalte, 5) LIKE '12345';

Eine andere Möglichkeit wäre natürlich mit dem Platzhaltersymbol '%' zu suchen. Dann findet er diesen Teilstring egal wo sich dieser in der Spalte befindet.

Code:
SELECT * FROM tabelle
WHERE spalte LIKE '%12345%';

In diesem Zusammenhang sei noch erwänt, daß man auch nach einem String suchen kann, bei dem man einen oder mehrere Buchstaben durch einen Platzhalter oder Joker ersetzt. In dem unten gezeigten Beispiel findet er 12345 oder auch 10345. Das ist zum Beispiel interessant, wenn man nicht mehr weiß ob man in einem Spanischen Wort das 'ñ' mit einem normalen 'n' geschrieben hat oder nicht. So könnte man dann nach 'Espa_a' suchen und er würde 'España' und auch 'Espana' finden.

Code:
SELECT * FROM tabelle
WHERE spalte LIKE '%1_345%';

Letzte Änderung dieser Information:

Zitat:19.01.2012 10:47 h

MySQL - Nach einem Strings einer bestimmten Länge suchen

Manchmal könnte es vorkommen, daß man Strings sucht, die eine bestimmte Länge aufweisen. So ist es mir zumindest heute ergangen. Dafür gibt es auch SQL Funktionen. Für meinen Fall half mir heute diese SQL.

Code:
SELECT *
FROM tabelle
WHERE CHAR_LENGTH( spalte ) >5;

MySQL - Eine Spalte in zwei Tabellen vergleichen und fehlende anzeigen

Soeben habe ich mich gefragt, wie man eine Spalte in zwei Tabellen vergleichen kann. Ich hatte zwei Tabellen, die eigentlich die gleiche Anzahl von datensätzen haben sollte. Hatten Sie aber nicht. Die eine Tabelle hatte einen Satz mehr. Damit ich nicht meine Jugendzeit damit verbringe, diesen einen Satz zu suchen, habe ich eine SQL-Abfrage geschrieben. Hier ist sie:

Code:
SELECT a.spalteA
FROM tabelle1 AS a
LEFT JOIN tabelle2 AS b ON a.spalteA = b.id
WHERE b.id IS NULL;

MySQL - Werte einer Spalte in eine andere Spalte schreiben

Heute hatte ich das Problem, daß ich Werte einer Spalte in eine andere Spalte schreiben mußte, und das über 24 Spalten hinweg bei einer Anzahl von 1200 Datensätzen. Da läßt sich logischerweise nichts mehr mit der Hand machen. Also kam ich zu folgender Lösung:

Code:
UPDATE `tabelle` SET
wert1 = wert4,
wert2 = wert5,
wert3 = wert6;

Dabei sollte man aber bedenken, daß man nicht Spalte 1 auf Spalte 2 und dann erste Spalte 2 auf Spalte 3 setzen kann. Denn dann hat man dreimal den Wert der Spalte 1. Man muß am hinteren Ende der Tabelle anfagnen, damit man sich nicht die Werte überschreibt. Bei solchen Angelegenheiten ist es sowieso ratsam man macht erst einmal einen Test mit einer Beispieltabelle, und dann erst an den richtigen Daten. Am Besten ist es auch vorher von der Datenbank ein Backup zu erstellen.

MySQL - Spalte mit einer bestimmten Anzahl von Buchstaben füllen

Wollten Sie schon mal eine Spalte mit einer bestimmten Anzahl von Buchstaben füllen? Das mußte ich heute. Meine Tabelle braucht in einer Spalte eine gewisse Anzahl von Buchstaben für einen Belegunskalender für Ferienhäuser. Also muß in der Spalte für den Januar 31 Buchstaben stehen, für Februar 2012 natürlich 29, da dies ein Schaltjahr ist. Hier folgender Vorschlag:

Code:
UPDATE `tabelle` SET
januar = REPEAT('F',31),
februar = REPEAT('F',29);

Drucke diesen Beitrag

  Saturday - 11:00 CST: Not available, 12°C (55°F)
Geschrieben von: Joopi - 23-11-2024, 08:55 - Forum: Wetter in Little Rock - Keine Antworten

Saturday - 11:00 CST: Not available, 12°C (55°F)

Temperature: 12°C (55°F), Wind Direction: Northerly, Wind Speed: 4mph, Humidity: 57%, Pressure: 1022mb, Falling, Visibility: Good


https://www.bbc.co.uk/weather/

Drucke diesen Beitrag

  Einigen Code zu PHP
Geschrieben von: Joopi - 23-11-2024, 08:55 - Forum: Programmieren - Keine Antworten

PHP - Suchen eines Key in einem Array

Manchmal ist es notwendig die Position eines Wertes in einem Array zu wissen. Dafür gibt es einen php-Befehl: array_search.
Hier mal ein kleines Beispiel:
 

Code:
$MeinArray = array("W0","W1","W2","W3");  $MeinKey = array_search("W2", $MeinArray);  echo "Mein Key = ".$MeinKey; 

Das Ergebnis dieser Abfrage ist dann:

Zitat:Mein Key = 2

PHP - Der erste Key eines Array soll höher als Null sein.

Es kommt auch schon einmal vor, das Array mit einem anderen key anfangen soll. Ein normales Array fängt immer mit einem Key von 0 an. Was wäre aber jetzt, wenn edas programm verlangt, das der Key mit 100 anfangen soll? Hier gibt es auch eine einfache Lösung.

Hier mal ein kleines Beispiel:

Code:
$MeinArray = array("W0","W1","W2","W3");
$MeinNeyesArray = array(100 => "W100","W101","W102","W103"); 
echo "Mein 102 = ".$MeinNeyesArray[102]; 

Das Ergebnis dieser Abfrage ist dann:

Zitat:Mein 102 = W102


PHP - Hier die Beispiele mit der date() - Funktion

Code:
date("d.m.Y");

Heutiges Datum mit jeweils führender Null und vierstellige Jahreszahl so sieht's: aus:

03.01.2023

Auch die Zeit kann man damit darstellen:

Code:
date("h:i:s \h");

Zu bedenken ist dabei, daß es sich um die Zeit des Servers handet. Und so sieht's aus:

Zitat:05:14:13 h


Man kann beides zusammentun, und erhält dann etwas wie:

Code:
date("l jS F Y h:i:s");


Hier das Ergebnis:

Zitat:Tuesday 3rd January 2023 05:14:13


Jetzt noch ein letztes Beispiel, wie man auch andere Daten außer dem heutigen Datum darstellen kann, und sogar auch damit rechnen.

Code:
<?php
    $noon = mktime(12,0,0, date("m"), date("d"), date("Y"));
    $morgen = mktime(0,0,0, date("m"), date("d")+1, date("Y"));
    $letztermonat = mktime(0,0,0, date("m")-1, date("d"), date("Y"));
    $naechstesjahr = mktime(0,0,0, date("m"), date("d"), date("Y")+1);

    echo "Heute Mittag = ".date("d.m.Y h:i:s", $noon)."<br>";
    echo "Morgen = ".date("d.m.Y", $morgen)."<br>";
    echo "Letzer Monat = ".date("d.m.Y", $letztermonat)."<br>";
    echo "Nächstes Jahr = ".date("d.m.Y", $naechstesjahr)."<br>";
?>

Und so sieht das ganze dann aus:

Zitat:Heute Mittag = 03.01.2023 12:00:00
Morgen = 04.01.2023
Letzer Monat = 03.12.2022
Nächstes Jahr = 03.01.2024

PHP - Ein Datum aus der Datenbank richtig darstellen

Wenn man ein Datum in der Datenbank speichert wird es normalerweise in einer Art und Weise gespeicher, daß man es in deutsch nicht wirklich lesen kann. Aus diesem Grund gibt es einen netten php-Befehl, der das Datum in ein Array packt, und von dort wieder ausgelesen werden kann.

Code:
$datum = explode("-",tabellenspalte); 
echo $datum[2].".".$datum[1].".".$datum[0]; 

Das Ganze würde aber auch Sinn machen, daß man es direkt in der SQL-Abfrage ändert. Das können Sie aber in der Rubrik Tipps und Tricks für MySQL nachlesen

PHP - Mit strpos einen String suchen

Sehr oft kommt es vor, daß man überprüfen muss ob ein String in einem anderen String vorhanden ist. Hierfür ist der php-Befehl strpos('meinstring','suchstring'); hilfreich.

Hier mal eine kleines Beispiel:

Code:
<?php
    $meinString = 'abc';
    $findMich  = 'a';
    $pos = strpos($meinString, $findMich);
    if ($pos !== false) {
        echo "Der String '$findMich' wurde im String
        '$meinString' gefunden";
        echo " und befindet sich an Position $pos";
    } else {
        echo "Der String '$findMich' wurde nicht im String
        '$meinString' gefunden";
    }
?>

weitere Beispiele und Erklärungen finden Sie auf der Seite
http://php.net/manual/de/function.strpos.php

Ab und zu muss man aber nach dem letzten Vorkommen eines Zeichens suchen. Dafür gibt es auch einen Befehl, der da wäre: strrpos('meinstring','suchstring')

Beide Befehle kann man noch mit einem dritten Parameter versehen. Der besagt ab welchem Zeichen gesucht werden soll. Wenn dieser Wert negativ ist, dann würde er ab dem Zeichen vom Ende der Zeichenkette anfangen zu suchen.

Code:
$pos = strpos('abcdef abcdef', 'a', 1); // $pos = 7, nicht 0

PHP - Anzahl der Tage eines Monats ermitteln

In letzter Zeit treffe ich immer öfter auf das Problem, wie ich herausfinden kann, wieviel Tage ein bestimmter Monat hat. Dazu gibt es natürlich auch einen Programmierweg. Dieser setzt sich aus den beiden php-Funktionen
mktime und date zusammen. Zuerst muß man das Datum von einem Text in einen Wert, den sogannten Timestamp, umwandeln. Dies sind die Sekunden seit dem 01.01.1970. Damit kann man dann wiederum ermittlen, wieviel Tage der Monat hat. Hier mal das script dazu:

Code:
echo date("t",mktime(0,0,0,2,1,2012));


Und das ergebins davon ist:

Zitat:29

PHP - Grossen Zahl nach Tausendern mit Trennzeichen darstellen

Wenn man eine grosse Zahl wie z.B. 10000000 auf einer Webseite darstellen möchte, wird das Lesen dieser Zahl bei so vielen Nullen etwas schwierig. Hierfür gibt es eine php-Funktion die sich number_fomrat nennt. Sie Syntax ist recht simple.

Code:
echo number_format('10000000', 0, ',', '.');
echo number_format('10000000', 2, ',', '.');
echo number_format('10000000');

So würde das ganze dann fertig aussehen:

Zitat:10.000.000
10.000.000,00
10,000,000


Die erste Zeile ist das Deutsche Zahlenformat. Die zweite Zeile wird mit der Zahl 2 dazu veranlasst noch 2 Stellen hinter dem komma anzuzeigen. Die Dritte Zeile ist das engliche Zahlen Format.

Drucke diesen Beitrag

  Saturday - 10:00 CST: Not available, 8°C (48°F)
Geschrieben von: Joopi - 23-11-2024, 08:08 - Forum: Wetter in Little Rock - Keine Antworten

Saturday - 10:00 CST: Not available, 8°C (48°F)

Temperature: 8°C (48°F), Wind Direction: East South Easterly, Wind Speed: 3mph, Humidity: 73%, Pressure: 1023mb, Rising, Visibility: Good


https://www.bbc.co.uk/weather/

Drucke diesen Beitrag