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
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.
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
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
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:
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