Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

Für die Verwendung von MariaDB wird ab sofort das offizielle MariaDB-Docker-Image in der Version 10.11 verwendet:

mariadb:10.11

Konfiguration für docker-compose

Das Image kann in einer docker-compose.yml wie folgt eingebunden werden:

Codeblock
languageyml
mariadb:
    image: mariadb:10.11
    volumes:
      - db_data:/var/lib/mysql
      - ./config/mariadb:/etc/mysql/conf.d
    env_file:
      - brandbox.docker.env
    environment:
      MYSQL_HOST: database.${COMPOSE_PROJECT_NAME}
      MARIADB_AUTO_UPGRADE: 1
      MARIADB_INITDB_SKIP_TZINFO: 1
    labels:
      traefik.enable: "false"
    healthcheck:
      test: ["CMD", "mysql", "-u", "root", "-proot", "-e", "SELECT version();"]
      interval: 1m
      timeout: 10s
      retries: 3
    ports:
      - "3306"
    cpus: 0.75
    mem_limit: 1000M
    networks:
      internal:
        aliases:
          - database.${COMPOSE_PROJECT_NAME}

volumes:
  db_data:

Zusätzliche Konfiguration über Bind-Mount

Konfigurationsdateien müssen per Bind-Mount in den Container gemountet werden. Dazu muss der Ordner ./config/mariadb

...

parallel zu docker-compose.yml vor dem Ausführen von

...

up

...

angelegt werden.
Der Ordner muss folgende Dateien enthalten:

  • MariaDB-Konfiguration my.cnf

  • SSL-Zertifikate im PEM-Format:
    • ca.crt.pem
    • ca.key.pem
    • server.crt.pem
    • server.key.pem
  • entrypoint.sh, um MariaDB-Logs in die Docker-Logs umzuleiten (siehe unten unter “Logging”)

my.cnf

Codeblock
languagetext
titlemy.cnf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
sort_buffer_size=1M

innodb_open_files=1048576
open_files_limit=1048576

tmp_table_size=256M
max_allowed_packet=1024M
max_heap_table_size=256M

query_cache_limit=16M
query_cache_size=128M

innodb_lru_scan_depth=128
innodb_ft_max_token_size=84
innodb_ft_result_cache_limit=2000000000
innodb_ft_total_cache_size=640000000
innodb_io_capacity=150000
innodb_io_capacity_max=150000
innodb_open_files=40960

open_files_limit=40960
tmp_table_size=128M
max_allowed_packet=1073741824
max_heap_table_size=128M

query_cache_limit=16777216
query_cache_size=134217728

ssl=1
ssl-ca=/etc/mysql/conf.d/ca.crt.pem
ssl-cert=/etc/mysql/conf.d/server.crt.pem
ssl-key=/etc/mysql/conf.d/server.key.pem

In der brandbox.docker.env müssen die Pfade zu den Zertifikaten für die Verwendung in der Anwendung korrekt gesetzt werden:

Codeblock
languagetext
MYSQL_SSL_KEY=/etc/mysql/conf.d/server.key.pem
MYSQL_SSL_CRT=/etc/mysql/conf.d/server.crt.pem
MYSQL_SSL_CA_CRT=/etc/mysql/conf.d/ca.crt.pem
general_log=0
general_log_file=/var/log/mysql/query.log

Logging

Es ist möglich, über Einträge in der my.cnf das Query-Log und das Slow-Log zu aktivieren:

my.cnf

Codeblock
languagetexttitlemy.cnf
general_log=1
general_log_file=/var/log/mysql/query.log

slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log

long_query_time=0.1
log_queries_not_using_indexes

Über einen Custom-Entrypoint können diese Logdateien in die Standardausgabe (stdout) geschrieben werden, damit sie über docker logs bzw. Graylog ausgewertet werden können:

...

...

docker-compose.yml (Auszug)

Codeblock
languageyml
database:
    image: mariadb:10.11
    volumes:
      - db_data:/var/lib/mysql
      - ./config/mariadb:/etc/mysql/conf.d
    env_file:
      - brandbox.docker.env
    environment:
      MYSQL_HOST: database.${COMPOSE_PROJECT_NAME}
    entrypoint: /etc/mysql/conf.d/entrypoint.sh # >> Custom-Entrypoint definieren
    labels:
      traefik.enable: "false"
    healthcheck:
      test: ["CMD", "mysql", "-u", "root", "-proot", "-e", "SELECT version();"]
      interval: 1m
      timeout: 10s
      retries: 3
    ports:
      - "3306"
    cpus: 0.75
    mem_limit: 1000M
    networks:
      internal:
        aliases:
          - database.${COMPOSE_PROJECT_NAME}

Die Datei entrypoint.sh muss dazu im definierten Bind-Mount-Ordner abgelegt werden (./config/mariadb/

...

) und wie folgt aussehen:

Codeblock
languagebash
#!/usr/bin/env bash
set -euo pipefail

##
# This script exists to work-around the fact that
# mysql does not support logging to stdout
#
# This will tail the file logs configured in ./my.cnf
##

LOG_PATHS=(
  '/var/log/mysql/slow.log'
  '/var/log/mysql/query.log'
)
for LOG_PATH in "${LOG_PATHS[@]}"; do
  ( umask 0 && truncate -s0 "$LOG_PATH" )
  tail --pid $$ -n0 -F "$LOG_PATH" &
done

/usr/local/bin/docker-entrypoint.sh mariadbd

Wichtig: Die Datei entrypoint.sh benötigt Ausführungsrechte für "other":

Codeblock
chmod o+x ./entrypoint.sh

Cluster-Konfiguration (Kubernetes)