Jak wdrożyć MySQL/MariaDB w Dockerze z trwałym przechowywaniem danych | INTROSERV
EUR
european

EUR

usa

USD

Poland Pl
Ex. VAT Ex. VAT 0%

Jak wdrożyć MySQL/MariaDB w Dockerze z trwałym przechowywaniem danych

Wprowadzenie

W tym samouczku wdrożysz kontener bazy danych MySQL lub MariaDB za pomocą Dockera z trwałym przechowywaniem danych. Uruchamianie baz danych w kontenerach upraszcza wdrażanie, kontrolę wersji i przenośność między środowiskami. Po zakończeniu tego samouczka będziesz mieć gotową do produkcji instancję MySQL lub MariaDB działającą w Dockerze z danymi przechowywanymi bezpiecznie poza kontenerem.

Wymagania wstępne

Docelowa grupa odbiorców: Średniozaawansowani administratorzy systemów
Szacowany czas ukończenia: ~30–45 minut

System operacyjny

  • Ubuntu 24.04 LTS (przetestowane)
  • Również kompatybilne z: Ubuntu 22.04 LTS, Debian 12 / 13

Wymagania dotyczące oprogramowania

  • Docker 24.0.6 lub nowszy
  • Docker Compose v2 (zawarty w nowoczesnych instalacjach Dockera)

Sprawdź wersję Dockera:

docker --version

Oczekiwany wynik: Docker version 24.0.6, build ed223bc

Sprawdź wersję Docker Compose:

docker compose version

Oczekiwany wynik: Docker Compose version v5.1.0

Tip

Jeśli nie masz zainstalowanego Dockera, zainstalujesz go w Kroku 1.

Wymagania sprzętowe

  • Minimum 2 GB RAM
  • Co najmniej 10 GB wolnego miejsca na dysku

Wymagania sieciowe

  • Dostępny port 3306 (domyślny port MySQL/MariaDB)
  • Zapora skonfigurowana do zezwalania na dostęp tylko wtedy, gdy wymagane są połączenia zewnętrzne

Uprawnienia

  • Użytkownik niebędący rootem z uprawnieniami sudo
  • Użytkownik dodany do grupy docker (zalecane)

Zakładana wiedza

  • Podstawowe pojęcia Dockera (obrazy, kontenery, wolumeny)
  • Komfortowe korzystanie z operacji w wierszu poleceń

Krok 1: Instalacja i weryfikacja Dockera

Jeśli Docker nie jest zainstalowany, zainstaluj go:

sudo apt update && sudo apt upgrade -y && sudo apt install curl

curl -sSL https://get.docker.com/ | CHANNEL=stable bash

sudo apt install docker-ce docker-compose-plugin -y

Włącz i uruchom Dockera:

sudo systemctl enable docker

sudo systemctl start docker

Zweryfikuj, czy Docker działa:

sudo systemctl status docker

Oczekiwany wynik: Status usługi Docker pokazuje active (running).

Dodaj swojego użytkownika do grupy docker, aby uniknąć używania sudo podczas korzystania z Dockera:

sudo usermod -aG docker <YOUR_USERNAME>

newgrp docker

Krok 2: Utwórz katalog trwałych danych

Powiązane montowanie mapuje katalog z systemu hosta bezpośrednio do kontenera, czyniąc go dostępnym w systemie plików kontenera.
Utwórz katalog dla danych bazy danych i ustaw odpowiednie uprawnienia:

mkdir -p ~/mysql-docker/data

chmod 750 ~/mysql-docker/data

Ten katalog będzie przechowywać pliki bazy danych poza kontenerem.

Info

Bez trwałego przechowywania wszystkie dane bazy danych są tracone po usunięciu kontenera.

Krok 3: Utwórz konfigurację Docker Compose

Przejdź do katalogu projektu:

cd ~/mysql-docker

Utwórz plik docker-compose.yml:

nano docker-compose.yml

Dodaj następującą konfigurację (przykład MySQL):

services: mysql: image: mysql:8.0.36 container_name: mysql-server restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql

Alternatywa dla MariaDB — jeśli wolisz MariaDB, użyj:

services: mariadb: image: mariadb:11.3 container_name: mariadb-server restart: unless-stopped environment: MARIADB_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MARIADB_DATABASE: appdb MARIADB_USER: appuser MARIADB_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql

Info

Ważne: Nigdy nie zapisuj prawdziwych haseł w kontroli wersji. Używaj zmiennych środowiskowych lub pliku .env w produkcji. Zastąp <YOUR_STRONG_USER_PASSWORD> i <YOUR_STRONG_ROOT_PASSWORD> swoimi bezpiecznymi hasłami.

Krok 4: Uruchom kontener bazy danych

Uruchom:

docker compose up -d

Oczekiwany wynik:

  • Docker pobiera obraz (jeśli nie został jeszcze pobrany)
  • Kontener uruchamia się w trybie odłączonym

Zweryfikuj status kontenera:

docker ps

Oczekiwany wynik:

CONTAINER ID IMAGE STATUS PORTS abc123def456 mysql:8.0.36 Up 10 seconds 0.0.0.0:3306->3306/tcp

Krok 5: Zweryfikuj funkcjonalność bazy danych

Połącz się z kontenerem

Dla kontenera MySQL wykonaj:

docker exec -it mysql-server mysql -u root -p

Dla kontenera MariaDB wykonaj:

docker exec -it mariadb-server mysql -u root -p

Wprowadź swoje hasło root.
Oczekiwany wynik: Pojawia się znak zachęty MySQL: mysql>

Sprawdź bazy danych

SHOW DATABASES;

Powinieneś zobaczyć:

  • appdb
  • information_schema
  • mysql
  • performance_schema
  • sys

EXIT;

Przetestuj trwałość danych

Utwórz tabelę testową

docker exec -it mysql-server mysql -u root -p

Wewnątrz powłoki MySQL wprowadź następujące polecenia:

USE appdb;

CREATE TABLE test_table (id INT PRIMARY KEY);

EXIT;

Zatrzymaj i usuń kontener

docker compose down

Uruchom ponownie kontener

docker compose up -d

Zweryfikuj, czy tabela nadal istnieje

docker exec -it mysql-server mysql -u root -p

Wewnątrz powłoki MySQL wprowadź następujące polecenia:

USE appdb;

SHOW TABLES;

Oczekiwany wynik: Pojawia się test_table. To potwierdza, że trwałe przechowywanie działa.

Krok 6: Zabezpiecz wdrożenie

Ogranicz dostęp zewnętrzny

Jeśli dostęp do bazy danych jest potrzebny tylko wewnętrznie, zmodyfikuj porty w docker-compose.yml:

ports: - "127.0.0.1:3306:3306"

Uruchom ponownie:

docker compose down

docker compose up -d

Info

Ważne: Unikaj publicznego udostępniania portu 3306, chyba że jest to absolutnie konieczne.

Użyj pliku .env

Utwórz .env:

nano .env

Przykład:

MYSQL_ROOT_PASSWORD=<YOUR_STRONG_ROOT_PASSWORD> MYSQL_PASSWORD=<YOUR_STRONG_USER_PASSWORD>

Odwołaj się w docker-compose.yml:

environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_PASSWORD: ${MYSQL_PASSWORD}

Weryfikacja

Możesz potwierdzić, że wszystko działa poprawnie, wykonując:

  • Uruchomienie docker ps — kontener jest Up
  • Połączenie za pomocą CLI MySQL — logowanie się powiodło
  • Ponowne uruchomienie kontenera — dane są trwałe
  • Sprawdzenie logów: docker logs mysql-server

Oczekiwane wpisy w logach: "ready for connections".

Cofanie zmian

Aby zatrzymać i usunąć kontener:

docker compose down

Aby usunąć trwałe dane:

Info

Ważne: To trwale usuwa wszystkie dane bazy danych.

rm -rf ~/mysql-docker/data

Aby odinstalować Dockera:

sudo apt remove docker-ce docker-compose-plugin -y

Rozwiązywanie problemów

Kontener nie uruchamia się

Sprawdź logi:

docker logs mysql-server

Typowe przyczyny:

  • Słabe hasło odrzucone
  • Port 3306 już używany

Sprawdź użycie portu:

sudo ss -tulnp | grep 3306

Błędy uprawnień

Jeśli widzisz błędy odmowy dostępu:

sudo chown -R 999:999 ~/mysql-docker/data

999 to zazwyczaj identyfikator użytkownika kontenera MySQL.

Podsumowanie i kolejne kroki

Udało Ci się wdrożyć MySQL lub MariaDB w Dockerze z trwałym przechowywaniem. Baza danych działa teraz w izolowanym kontenerze, jednocześnie bezpiecznie przechowując dane w systemie hosta.

Kolejne kroki:

  • Skonfiguruj automatyczne kopie zapasowe
  • Wdrożenie replikacji dla wysokiej dostępności
  • Zintegruj z kontenerami aplikacji
  • Dodaj monitorowanie za pomocą Prometheus i Grafana

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA