Instruktaż/Tutorial MSSQL w dokerze

jerry1333

void *ptr
Contributor
9 Październik 2019
684
4
345
63
Tomaszów Mazowiecki
github.com
QNAP
TS-x73A
Ethernet
1 GbE
W tym krótkim poradniku chciałbym opisać jak zainstalować serwer MS SQL, jak przywrócić bazę z kopii oraz w jaki sposób można wykonać kopię bazy. Całość będzie działać na serwerze QNAP z procesorem x86 a do instalacji wykorzystamy kontenery dockera od Microsoftu. Postaram się pokazać jak zrobić wszystko z linii komend oraz w skróconej formie jak wyklikać to w interfejsie Portainer.

Czego będziemy potrzebować?
Instalacja z linii komend
  1. Łączymy się z serwerem QNAP przez SSH
  2. Tworzymy trzy woluminy np. o nazwach mssql-data, mssql-log oraz mssql-backup - jeden będzie przechowywał bazy danych, drugi wykorzystamy do sprawdzania logów serwera a trzeci na kopie zapasowe i do odtwarzania danych w przypadku awarii / migracji itp.
    Bash:
    docker volume create mssql-data
    docker volume create mssql-log
    docker volume create mssql-backup
    ALTERNATYWNIE:
    Możemy pominąć tworzenie woluminu mssql-backup a zamiast tego wskazać dowolny katalog na Qnapie (patrz kolejny krok).
  3. Następnie tworzymy kontener MS SQL Server (tutaj w ostatniej wersji 2017)
    Bash:
    docker run \
    --name 'mssql' \
    -e 'ACCEPT_EULA=Y' \
    -e 'MSSQL_PID=Express' \
    -e 'SA_PASSWORD=yourStrong(!)Password' \
    -v mssql-data:'/var/opt/mssql/data/' \
    -v mssql-log:'/var/opt/mssql/log' \
    -v mssql-backup:'/var/backups/' \
    -p 1433:1433 \
    -e 'MSSQL_MEMORY_LIMIT_MB=4096' \
    --memory="4096m" \
    --restart=unless-stopped \
    -d mcr.microsoft.com/mssql/server:2017-latest
    ALTERNATYWNIE:
    Mapujemy katalog /share/Public do katalogu /var/backups/ w kontenerze. Tym sposobem kopie zapasowe stworzone w katalogu /var/backups/ będą widoczne w katalogu /share/Public na Qnapie.
    Bash:
    docker run \
    --name 'mssql' \
    -e 'ACCEPT_EULA=Y' \
    -e 'MSSQL_PID=Express' \
    -e 'SA_PASSWORD=yourStrong(!)Password' \
    -v mssql-data:'/var/opt/mssql/data/' \
    -v mssql-log:'/var/opt/mssql/log' \
    -v /share/Public:'/var/backups/' \
    -p 1433:1433 \
    -e 'MSSQL_MEMORY_LIMIT_MB=4096' \
    --memory="4096m" \
    --restart=unless-stopped \
    -d mcr.microsoft.com/mssql/server:2017-latest

Opis istotnych części polecenia:
  • -e 'MSSQL_PID=Express' – jakiej edycji serwera SQL użyć - w tym przypadku Express, można podać swój klucz produktu. Domyślnie uruchamiany jest SQL Server Developer
  • -e 'SA_PASSWORD=yourStrong(!)Password' – po znaku = podajemy hasło do serwera SQL, tym hasłem będziemy się posługiwali w aplikacjach itd. Hasło powinno być trudne do odgadnięcia oraz wystarczająco długie / skomplikowane aby nie dało się go złamać metodą siłową.
  • -p 1433:1433 – port serwera (domyślny 1433), w większości aplikacji nie musimy podawać domyślnego portu połączenia.
  • -e 'MSSQL_MEMORY_LIMIT_MB=4096' --memory="4096m" – ustawiamy limit pamięci na 4096 MB - dopasowujemy tą wartość w zależności od przewidywanego obciążenia serwera (+20%) oraz możliwości QNAP-a.
Kompletny opis wszystkich zmiennych: Configure environment variables for SQL Server on Linux - SQL Server
Zmienne dockera: Docker run reference

Instalacja przez Portainer
  1. Tworzymy woluminy
    portainer-volume-create.png portainer-volume-list.png
  2. Tworzymy kontener podając te same wartości w odpowiednich polach
    portainer-create-container-1.png portainer-create-container-2.png portainer-create-container-3.png portainer-create-container-4.png portainer-create-container-5.png portainer-create-container-6.png

JAK PODŁĄCZYĆ SIĘ DO SERWERA?
W aplikacji klienckiej podajemy następujące informacje:
  • Nazwa serwera / host / adres serwera: ADRES IP QNAPA
  • Port (jeśli takie pole występuje): 1433 (lub ten który podaliśmy przy -p)
  • Użytkownik: sa
  • Hasło: hasło podane przy tworzeniu kontenera po SA_PASSWORD=
Czasami aplikacja nie ma pola na port możemy spróbować podać adres w formacie ADRES_IP:pORT np. 192.168.0.1:21433

IMPORTOWANIE / PRZYWRACANIE BAZY DANYCH
Jeśli posiadamy pliki .MDF oraz .LDF możemy spróbować podłączyć taką bazę do serwera SQL. Nie ma żadnej gwarancji, że to zadziała bo przyczyn może być wiele (niezgodne architektury serwera, nieobsługiwana wersja bazy / serwera itd.) ale jeśli nie mamy innej opcji to próbujemy :!
  1. Kopiujemy pliki bazy na wolumin mssql-data (zarówno plik MDF jak i LDF)
    db-attach-1.png
  2. Uruchamiamy SSMS i logujemy się do serwera
  3. Klikamy prawym przyciskiem na Databases i wybieramy Attach...
  4. Dodajemy plik i wskazujemy nasz plik MDF (LDF podłączy się automatycznie)
    db-attach-2.png
  5. Klikamy OK i czekamy
    db-attach-3.png
  6. Jeśli nie wystąpią błędy baza powinna pojawić się na liście i w aplikacji która ma jej używać - weryfikujemy czy zawiera dane których potrzebujemy.

Jeśli posiadamy plik .BAK/.BAC lub ogólnie plik z kopią bazy wykonaną z serwera SQL jest większa szansa na odzyskanie bazy.
  1. Kopiujemy plik kopii na wolumin mssql-backup (lub do katalogu który wskazaliśmy podczas tworzenia kontenera)
  2. Uruchamiamy SSMS i logujemy się do serwera
  3. Klikamy prawym przyciskiem na Databases i wybieramy Restore Database...
  4. Source zmieniamy na Device
    db-restore-1.png
  5. Klikamy na ... i dodajemy nasz plik .BAK/.BAC z lokalizacji /var/backups (jeśli go nie widać zmieniamy filtr na All Files (**)) i klikamy OK
    db-restore-2.png
  6. Klikamy OK i czekamy, pojawi się komunikat o zakończeniu operacji.
    db-restore-3.png
  7. Jeśli nie wystąpią błędy baza powinna pojawić się na liście i w aplikacji która ma jej używać - weryfikujemy czy zawiera dane których potrzebujemy
Linia komend:
  1. Kopiujemy plik kopii zapasowej do woluminu mssql-backup (lub do katalogu który wskazaliśmy podczas tworzenia kontenera)
  2. Logujemy się do serwera QNAP przez SSH
  3. Dostajemy się do kontenera przez polecenie:
    Bash:
    docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password'
  4. Wpisujemy polecenie odtworzenia kopii (zmieniamy nazwę bazy oraz nazwę pliku na własną)
    SQL:
    RESTORE DATABASE NAZWA_BAZY FROM DISK = '/var/backups/PLIK-KOPII.BAK'
    GO
    np.:
    SQL:
    RESTORE DATABASE CDN_FIRMA_DEMO FROM DISK = '/var/backups/CDN_FIRMA_DEMO-210101.BAK'
    GO
Dokumentacja polecenia RESTORE: RESTORE (Transact-SQL) - SQL Server

KOPIA ZAPASOWA BAZY DANYCH
Wykonać kopię bazy danych możemy na kilka sposobów. Podstawowym (ale nie zawsze bezpiecznym) będzie kopia samych plików MDF/LDF - zatrzymujemy kontener z serwerem, robimy kopię plików z woluminu mssql-data i uruchamiamy na nowo kontener.
Jednak lepszą metodą będzie zrobienie kopii bezpośrednio przez serwer bazy danych.
  1. Logujemy się do serwera QNAP przez SSH
  2. Dostajemy się do kontenera przez polecenie:
    Bash:
    docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password'
  3. Wpisujemy polecenie wykonania kopii (zmieniamy nazwę bazy na własną)
    SQL:
    BACKUP DATABASE NAZWA_BAZY TO DISK = '/var/backups/PLIK-KOPII.BAK'
    GO
    np.:
    SQL:
    BACKUP DATABASE CDN_FIRMA_DEMO TO DISK = '/var/backups/CDN_FIRMA_DEMO-210101.BAK'
    GO
  4. Tak stworzona kopia pojawi się w woluminie mssql-backup (lub w katalogu który wskazaliśmy przy tworzeniu kontenera) skąd możemy go skopiować w dowolne miejsce.
Aby zautomatyzować tworzenie kopii możemy wywoływać polecenie z crona:
Bash:
docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password' -Q "BACKUP DATABASE CDN_FIRMA_DEMO TO DISK = '/var/backups/CDN_FIRMA_DEMO.BAK'"
To polecenie wrzucamy tyle razy ile baz danych posiadamy (zmieniając nazwę bazy i pliku) lub tworzymy skrypt SQL np: Simple script to backup all SQL Server databases umieszczamy w woluminie mssql-backup i wywołujemy poleceniem:
Bash:
docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password' -i '/var/backups/backup-all.sql'

Dokumentacja polecenia BACKUP: BACKUP (Transact-SQL) - SQL Server

FAQ

P: Gdzie znajdę kopie zapasowe utworzone w Management Studio (lub z konsoli)? Na Qnapie nie mam folderu /var/backups/?!
O: Domyślnie przykład tworzy odrębny wolumin na kopie zapasowe. Aby odnaleźć ścieżkę do tego katalogu trzeba przez SSH wykonać polecenie:
Bash:
docker volume inspect mssql-backup | jq .[0].Mountpoint
W tej ścieżce znajdziesz swoje kopie.

Alternatywnym rozwiązaniem może być bezpośrednie podłączenie katalogu /var/backups/ kontenera do katalogu na Qnapie.
Podczas tworzenia kontenera należy zamienić jedną linię z
-v mssql-backup:'/var/backups/' \
na
-v /share/Public:'/var/backups/' \
Tym sposobem kopie wykonane do katalogu /var/backups/ wylądują w /share/Public na Qnapie.

P: Problemy z uruchomieniem wersji 2019 - brak możliwości połączenia z serwerem, serwer wali błędy w konsoli!
O: Najprawdopodobniej problem z prawami dostępu do katalogów. Rozwiazaniem jest dodanie praw 777 do katalogów zawierających twoje woluminy. np.:
Bash:
chmod -R 777 /share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/mssql-data
chmod -R 777 /share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/mssql-logs
chmod -R 777 /share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/mssql-backups
Dokładne ścieżki do woluminu można uzyskać poleceniem:
Bash:
docker volume inspect NAZWA_WOLUMINU | jq .[0].Mountpoint
https://forum.qnap.net.pl/threads/ts-x31k-i-docker-mssql.39858/post-177066


Jeśli macie jakieś uwagi, konstruktywną krytykę lub dodatkowe informacje warte umieszczenia piszcie, post będzie uzupełniany.
 
Aby zautomatyzować tworzenie kopii możemy wywoływać polecenie z crona:
Bash:
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password' -Q "BACKUP DATABASE CDN_FIRMA_DEMO TO DISK = '/var/backups/CDN_FIRMA_DEMO.BAK'"

Mógłbyś dodać mały opis jak dodawać polecenia do crona.
 
Tu Silas...
Proszę :)
upload_2021-1-5_9-11-38.png


Mam problem:
Bash:
/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker exec -it MSSQL-2019 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'P@$sw0rd' -Q "BACKUP DATABASE test TO DISK = '/MSSQL/backup/test.BAK'"
i mam result:
Kod:
the input device is not a TTY

---------- ERROR ----------
exit status 1

@pigers masz pomysl?
 
Opis fajny ale na moją wiedzę wszystkiego nie pojmuję. nie potrafię zrozumieć jak mogę wykonaną już kopię *.bak skopiować z kontenera na qnapa.
Zrozumiałem tyle że po wykonaniu kopi loguję się na qnapa po SSH dalej dostaje się do kontenera i nie wiem jakimi poleceniami skopiować plik bazy. jaki udział wybrać czy najpierw musze jakiś mapować ?


upload_2021-11-23_22-3-18.png
 
Ok ale piszesz mi opis przy tworzeniu kontenera a ja już mam kontener odpalony i działa oczywiście pewnie nie mam tego wpisu jak tworzyłem z poziomu qnapa. czy mogę dodać ten wpis aby zmapował zasób zewnętrzny ?
 
haaa no właśnie to chciałem zrobic i zatrzymałem ale nie ma możliwości dodania
upload_2021-11-23_22-29-19.png



upload_2021-11-23_22-29-45.png

po zatrzymaniu kontenera logować się po ssh na qnapa i dostać do tego kontenera i wpisać to polecenie ?
tylko czy przy zatrzymanym będę mógł wejśc ?
 
no dobra po kolei

zainstaluje portainer i co dalej zobaczy moją bazę którą mam już na kontenerze? i poprawię wpis?
Nie uwalę bazy ani kontenera który juz mi działa ?

upload_2021-11-23_22-43-26.png
 
Mój przykład tworzył odrębny wolumin na kopie (mssql-backup), jak @pigers napisał można zrobić bind na dowolny katalog wedle uznania.

Generalnie nie polecam grzebania na "produkcyjnych" kontenerach - chcesz się czegoś nauczyć, przetestować? Zrób sobie nowy kontener mssql-test, tam możesz testować do woli a jak już ogarniesz o co chodzi to wtedy działasz na oryginale :)
 

Użytkownicy znaleźli tą stronę używając tych słów:

  1. mssql
  2. non-root
  3. MSSQL_PID="Express" \
  4. mssql w dokerze\
  5. brak dostępu do qnapa
  6. mssql-server
  7. *
  8. jak zainstalować PDO mssql
  9. Failed to access the file.
  10. print
  11. repozytorium
  12. docker status
  13. NAS instalacja Kontenera MSSQL
  14. brak dostępu do bazy danych
  15. portainer instalacja
  16. MSSQL W DOKERZE
  17. error 102
  18. sql server
  19. mysql