Eine bestehende Datenbank auf einem Docker laufen lassen

Stellt euch vor ihr bekommt die undankbare Aufgabe ein altes WordPress Projekt zu upgraden. Das Projekt hinkt bereits zwei Major Releases hinterher. Das bedeutet ihr könnt nicht einfach im Produktivsystem ein upgrade vollziehen. Ihr müsst euch das Produsystem auf eure lokale Entwicklungsumgebung kopieren.

Dafür eignet sich Docker ganz gut. Heute gehe ich davon aus, dass wir nur die Datenbank dockerisieren. Dann schieben wir den Datenbankdump der Produktivumgebung in unseren Docker.
Vorraussetzung: Ihr habt docker auf eurem System, könnt mit der Konsole umgehen und hab bereits den Datenbank Dump.

  1. Erstellt ein Order wo ihr Euer Projekt erstellen möchtet.
  2. Erstellt eine docker-compose.yml
  3. kopiert diese Befehle in die eben erstellte docker-compose.yml rein *
  4. erstellt zwei Ordner: my-datavolume und dumps
  5. legt das SQL Dump file in diesen Ordner. Tut euch ein gefallen um bennent die Datei aussagekräftig um. Zum Beispiel 2021-11-11-dump.sql
  6. startet docker-compose mit docker-compose up -d
  7. checkt ob der container vorhanden ist: docker ps
  8. loggt euch jetzt in euer Container ein docker exec -it my_mysql bash
  9. loggt euch innerhalb des Containers in MySql ein mit mysql -uroot -p
  10. Okay, mir ist es gerade auch einwenig peinlich aber Passwort ist : password
  11. gebt ein source /home/2011-11-11-dump.sql
  12. A viola! Die Datenbank ist da
  13. exit und dann noch mal exit und ihr seid wieder im HOST

Über ein SQLTool wie MySQL Workbench könnt ihr solange der Conatiner läuft drauf zugreifen. Wenn ihr die DB in eure DB UI einfügen möchtet dann beachtet das der PORT nicht default 3306 ist sonder ich ihn in der docker-compose.yml mit 3309 angegeben habe. Das könnt ihr natürlich anpassen. Dafür müsst ihr nur den container wieder mit docker-compose down runterfahren.

* das docker-compose.yml file:

version: '3.1'

services:

  wordpress:
    image: wordpress:4
    restart: always
    ports:
      - '8090:80'
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: password
    volumes:
      - ./db:/var/lib/mysql      
      - ./schema/:/home/dumps
      #- ./schema/:/docker-entrypoint-initdb.d
    ports:
      - "3309:3306"      
volumes:
  wordpress:
  db:

MySQL über die Console

Vielleicht geht es euch ja wie mir. Ständig vergesse ich die MySQL Commands. Schnell kommt es vor, dass man in einer MySQL Docker Instanz etwas an der Datenbank machen muss. In meinem Fall, der mich dazu brachte es ein für alle mal die wichtigsten MySQL Commands niederzuschreiben, war es, dass meine Docker App ständig meinte er kenne die Datenbank nicht.

Logt euch über die CLI auf eure MySQL Docker Instanz ein.

docker exec -it laravel-app-mysql bash
 mysql -u root -p
 SHOW DATABASES; // Zeigt dir alle Datenbanken an
 +--------------------+
 |     Databases      |
 +--------------------+
 | information_schema |
 | database_name      |
 | mysql              |
 | opencart           |
 | laravel          |
 | performance_schema |
 | sys                |
 +--------------------+
 7 rows in set (0.00 sec)
 SHOW DATABASES LIKE 'lara%'; // Zeigt dir die Datenbanken die auf lara matchen.
 USE laravel; // Loggt dich in die laravel DB ein
 SHOW Tables; / Zeigt dir alle Tabellen an

Starte und Stoppe dein Mysql Service:

service mysql start

service mysql stop

MySQL Datenbankserver im lokalen Netzwerk einrichten

Es kommt mal vor, dass man beim Entwickeln die Test, Entwickler Datenbank nicht auf einem Liveserver sowie auf dem lokalen Rechner einrichten möchte. Und arbeiten an der Livedatenbank sollten sowieso keine Option sein. Jedenfalls kann der Wunsch nach einer Testdatenbank, die nicht auf dem Entwicklerrechner installiert ist unterschiedliche Gründe haben. Ein häufiger Grund ist wohl, wenn die Datenbank sehr mit Testdaten aufgebläht ist. So war das bei einem großen Kunden von mir. Die Datenbank war so riesig, dass man den Dump nicht auf den Rechner hätte packen können. Wahrscheinlich wurden dort alle Flatulenzen der letzten 30 Jahre aller Menschen, samt Geodaten und Meta(n)daten in die Datenbank geschrieben. Der Dump alleine war ein Wochenprojekt. Es war wirklich einfach grauenvoll. Unabhängig von den Gründen, ist es auch nett zum Verständnis im eigenen Netzwerk eine Datenbank auf einem am Netzwerk angeschlossenen Rechner (Server) zu kontaktieren.

Was muss gemacht werden. Wir bräuchten mindestens zwei Rechner. Der eine (Host) der die Datenbank hat und der andere (Client) der über das Netzwerk drauf zugreift. Dazu benötigen wir natürlich auch die lokale IP Adresse des Datenbankrechners. Im Grunde könnten wir auch sagen, wir brauchen die IP Adresse von unserem lokalen Datenbankservers. Unter der Linux Distribution Ubuntu geht das rasch mit der Konsole.

hostname -I

Der erste Wert wäre die benötigte IP Adresse. In meinem Fall die 192.168.1.45

Nun müssen wir als erstes auf dem Datenbankserver die Configuration anpassen. Diese ist nämlich Standardmässig nur auf Zugriffe innerhalb des installierten Rechners nutzbar. Also nur localhost. Dazu müssen wir in einer Konfigurationsdatei von MySQL eine Zeile ändern.

Das ändert man ebenfalls über die Ubuntu Konsole:

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 

In der Zeile bind-address: 127.0.0.1 ersetzten wir den Wert 127.0.0.1 mit 0.0.0.0 . Das bedeutet nun das Remote Rechner die Datenbank ansprechen können. Ansonsten wird die Ansprache von MySQL direkt verweigert.

Standardmäßig ist ein MySQL Nutzer nur Abrufbar vom Rechner auf dem MySQL installiert ist. Mit anderen Worten nur localhost. Man kann sich die Nutzer und deren Hosts ausgeben lassen:

mysql -u root -p
mysql_>  SELECT USer, Host, authentication_string FROM mysql.user;

Im nächsten Schritt müssen wir auf dem Datenbankserver einen Nutzer anlegen, der berechtigt ist, von einem externen Aufruf zu antworten. Wir loggen uns dafür über die Konsole auf den Datenbankserver ein.

mysql -u root -p

nun

mysql_> CREATE USER 'remote_user'@'%' IDENTIFIED BY superCyptoPassword_123';

das Prozentzeichen dient hier als Wildcard und berechtigt Remote Rechner den Zugriff auf die Datenbank. Statt einer Wildcard (%) kann man auch mit festen IP oder IP Bereichen arbeiten.

_> CREATE USER 'remote_user'@'192.168.1.45' IDENTIFIED BY superCyptoPassword_123';
_> CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY superCyptoPassword_123';
und Standard wäre:
_> CREATE USER 'remote_user'@'localhost' IDENTIFIED BY superCyptoPassword_123';

danach berechtigen wir den neuen User, dass er auf alle Datenbanken auf dem Datenbankserver zugreifen darf.

GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';

Alternativ kann man den User auch nur auf eine bestimmte Datenbank zugreifen lassen oder gar nur auf eine bestimmte Tabelle in einer Datenbank eingrenzen. Ebenfalls kann man Lese und Schreibrechte einen einzelnen Nutzer zuweisen. Dazu mal in einem anderen Tutorial. Wenn ihr das wollt?

That it.

mysql> SELECT Ueer, Host, authentication_string FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| USer             | Host      | authentication_string                     |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.session    | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| icke           | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| remote_user         | %         | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+------------------+-----------+-------------------------------------------+

SeoTheater Autoren