SQL Server Linux 컨테이너 구성 및 사용자 지정

적용 대상:SQL Server - Linux

이 문서에서는 Docker를 사용하여 SQL Server Linux 컨테이너를 구성하고 사용자 지정하는 방법을 설명합니다. 데이터를 보관하고, 파일을 컨테이너 간에 이동하고, 기본 설정을 변경할 수 있습니다.

sqlcmd(Go)를 사용하여 개발 목적으로 컨테이너에 SQL Server의 새 인스턴스를 만들 수 있습니다. 자세한 내용은 SQL Server 컨테이너 만들기 및 쿼리를 참조 하세요.

사용자 지정 컨테이너 만들기

사용자 고유의 Dockerfile 을 만들어 사용자 지정된 SQL Server 컨테이너를 빌드할 수 있습니다. 자세한 내용은 SQL Server와 노드 애플리케이션을 결합하는 데모를 참조하세요. 사용자 고유의 Dockerfile을 만드는 경우 컨테이너의 수명을 제어하는 포그라운드 프로세스에 유의합니다. 종료되면 컨테이너가 종료됩니다. 예를 들어 스크립트를 실행하고 SQL Server를 시작하려면 SQL Server 프로세스가 맨 오른쪽 명령이어야 합니다. 다른 모든 명령은 백그라운드에서 실행됩니다. 다음 명령은 Dockerfile 내에서 이러한 동작을 보여 줍니다.

/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr

위 예제의 명령을 역순으로 실행하면 do-my-sql-commands.sh 스크립트가 완료될 때 컨테이너가 종료됩니다.

데이터 유지

docker stopdocker start를 사용하여 컨테이너를 다시 시작하는 경우에도 SQL Server 구성 변경 내용과 데이터베이스 파일이 컨테이너에 유지됩니다. 그러나 docker rm을 사용하여 컨테이너를 제거하면 SQL Server 및 데이터베이스를 포함하여 컨테이너의 모든 항목이 삭제됩니다. 다음 섹션에서는 연결된 컨테이너가 삭제된 경우에도 데이터 볼륨을 사용하여 데이터베이스 파일을 유지하는 방법을 설명합니다.

Important

SQL Server의 경우 Docker의 데이터 지속성을 이해하는 것이 중요합니다. 이 섹션의 설명 외에도 Docker 컨테이너의 데이터를 관리하는 방법에 대한 Docker 설명서를 참조하세요.

호스트 디렉터리를 데이터 볼륨으로 탑재

첫 번째 옵션은 호스트의 디렉터리를 컨테이너에 데이터 볼륨으로 탑재하는 것입니다. 이렇게 하려면 지정된 경로가 docker run 있는 <host directory> 플래그와 함께 -v <host directory>:/var/opt/mssql 명령을 사용합니다. 예를 들어 C:\SQL Windows 또는 ~/sqlvolumes Linux에서. 그러면 컨테이너 실행 간에 데이터를 복원할 수 있습니다.

참고 항목

SQL Server 2019(15.x) 이상 버전의 컨테이너는 자동으로 루트가 아닌 것으로 시작되고 SQL Server 2017(14.x) 컨테이너는 기본적으로 루트로 시작됩니다. SQL Server 컨테이너를 루트가 아닌 컨테이너로 실행하는 방법에 대한 자세한 내용은 보안 SQL Server Linux 컨테이너를 참조 하세요.

Important

SA_PASSWORD 환경 변수는 사용되지 않습니다. 대신 MSSQL_SA_PASSWORD를 사용하세요.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2022-latest

이 방법을 사용하여 Docker 외부에서 호스트의 파일을 공유하고 볼 수도 있습니다.

데이터 볼륨 컨테이너 사용

두 번째 옵션은 데이터 볼륨 컨테이너를 사용하는 것입니다. -v 매개 변수를 사용하여 호스트 디렉터리 대신 볼륨 이름을 지정하면 데이터 볼륨 컨테이너를 만들 수 있습니다. 다음 예제에서는 라는 sqlvolume공유 데이터 볼륨을 만듭니다.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2022-latest

참고 항목

run 명령에서 암시적으로 데이터 볼륨을 만드는 이 방법은 이전 버전의 Docker에서 작동하지 않습니다. 이 경우에는 Docker 설명서인 데이터 볼륨 컨테이너 만들기 및 탑재에 간략하게 설명된 명시적 단계를 사용합니다.

이 컨테이너를 중지하고 제거해도 데이터 볼륨이 계속 유지됩니다. docker volume ls 명령을 사용하여 데이터 볼륨을 볼 수 있습니다.

docker volume ls

그런 다음, 동일한 볼륨 이름을 사용하여 다른 컨테이너를 만들면 새 컨테이너는 볼륨에 포함된 것과 동일한 SQL Server 데이터를 사용합니다.

데이터 볼륨 컨테이너를 제거하려면 docker volume rm 명령을 사용합니다.

경고

데이터 볼륨 컨테이너를 삭제하면 컨테이너의 모든 SQL Server 데이터가 ‘영구적으로’ 삭제됩니다.

백업 및 복원

이러한 컨테이너 방법 외에 표준 SQL Server 백업 및 복원 방법을 사용할 수도 있습니다. 백업 파일을 사용하여 데이터를 보호하거나 데이터를 다른 SQL Server 인스턴스로 이동할 수 있습니다. 자세한 내용은 Linux에서 SQL Server 데이터베이스 백업 및 복원을 참조하세요.

경고

백업을 만드는 경우 컨테이너 외부에 백업 파일을 만들거나 복사해야 합니다. 그러지 않고 컨테이너를 제거하면 백업 파일도 삭제됩니다.

컨테이너에서 VDI 백업 및 복원 사용

VDI(가상 디바이스 인터페이스) 백업 및 복원 작업은 이제 SQL Server 2019용 CU15(15.x) 및 SQL Server 2017(14.x)용 CU28부터 SQL Server 컨테이너 배포에서 지원됩니다. 다음 단계에 따라 SQL Server 컨테이너에 대한 VDI 기반 백업 또는 복원을 사용하도록 설정합니다.

  1. SQL Server 컨테이너를 배포할 때 --shm-size 옵션을 사용합니다. 시작하려면 다음 명령에 표시된 대로 크기 조정을 1GB로 설정합니다.

    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Mystr0ngP@ssw0rd!" \
    --shm-size 1g \
    -p 1433:1433 \
    --name sql19 \
    --hostname sql19 \
    -d mcr.microsoft.com/mssql/server:2019-latest
    

    --shm-size 옵션을 사용하면 기본적으로 64MB로 설정되는 컨테이너 내 공유 메모리 디렉터리(/dev/shm)의 크기를 구성할 수 있습니다. 이 공유 메모리 기본 크기는 VDI 백업을 지원하기에 충분하지 않습니다. SQL Server 컨테이너를 배포하고 VDI 백업을 지원하려는 경우 이를 최소 1GB로 구성하는 것이 좋습니다.

  2. 또한 컨테이너 내에서 새 매개 변수 memory.enablecontainersharedmemorymssql.conf 사용하도록 설정해야 합니다. 데이터 유지 섹션에 설명된 대로 옵션을 사용 -v 하거나 컨테이너 내에서 수동으로 업데이트 mssql.conf 하여 컨테이너를 배포한 후 컨테이너 배포에 탑재 mssql.conf 할 수 있습니다. 다음은 설정이 .로 설정된 샘플 mssql.conf 파일 memory.enablecontainersharedmemory 입니다 true.

    [memory]
    enablecontainersharedmemory = true
    

컨테이너에서 파일 복사

컨테이너에서 파일을 복사하려면 다음 명령을 사용합니다.

docker cp <Container ID>:<Container path> <host path>

docker ps -a 명령을 실행하여 컨테이너 ID를 가져올 수 있습니다.

예:

docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog

컨테이너에 파일 복사

컨테이너에 파일을 복사하려면 다음 명령을 사용합니다.

docker cp <Host path> <Container ID>:<Container path>

예:

docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data

표준 시간대 구성

특정 표준 시간대를 사용하여 Linux 컨테이너에서 SQL Server를 실행하려면 환경 변수를 구성 TZ 합니다(자세한 내용은 Linux에서 SQL Server 2022에 대한 표준 시간대 구성 참조). 올바른 표준 시간대 값을 찾으려면 Linux bash 프롬프트에서 tzselect 명령을 실행합니다.

tzselect

표준 시간대 tzselect 를 선택하면 다음 예제와 유사한 출력이 표시됩니다.

The following information has been given:

    United States
    Pacific

Therefore TZ='America/Los_Angeles' will be used.

이 정보를 사용하여 Linux 컨테이너에서 동일한 환경 변수를 설정할 수 있습니다. 다음 예제에서는 Americas/Los_Angeles 표준 시간대의 컨테이너에서 SQL Server를 실행하는 방법을 보여 줍니다.

sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2022-latest

tempdb 경로 변경

tempdb 데이터베이스를 사용자 데이터베이스와 별도로 유지하는 것이 좋습니다.

  1. SQL Server 인스턴스에 연결하고 다음 T-SQL(Transact-SQL) 스크립트를 실행합니다. 연결된 tempdb파일이 더 많은 경우 파일을 이동해야 합니다.

    ALTER DATABASE tempdb MODIFY FILE (
       NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf'
    );
    GO
    
    ALTER DATABASE tempdb MODIFY FILE (
        NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf'
    );
    GO
    
  2. 다음 T-SQL 스크립트를 사용하여 tempdb 파일 위치가 수정되었는지 확인합니다.

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. 이러한 변경 내용을 적용하려면 SQL Server 컨테이너를 중지했다가 다시 시작해야 합니다.

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. 대화형 bash 세션을 열어 컨테이너에 연결합니다.

    docker exec -it sql1 bash
    
    docker exec -it sql1 bash
    
    docker exec -it sql1 bash
    

    대화형 셸에 연결되면 다음 명령을 실행하여 tempdb의 위치를 확인합니다.

    ls /var/opt/mssql/tempdb/
    

    이동에 성공하면 다음과 같은 출력이 표시됩니다.

    tempdb.mdf templog.ldf
    

기본 파일 위치 변경

MSSQL_DATA_DIR 변수를 추가하여 docker run 명령에서 데이터 디렉터리를 변경한 다음, 컨테이너의 사용자가 액세스할 수 있는 위치에 볼륨을 탑재합니다.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2022-latest

mssql-config를 사용하여 컨테이너 내에서 SQL Server 구성

mssql-conf 도구를 사용하여 SQL Server 컨테이너에서 매개 변수를 설정할 수 있습니다.

예를 들어 다음 단계를 사용하여 인스턴스에 대한 메모리 제한을 설정할 수 있습니다.

  1. 루트 사용자로 사용하여 docker exec 컨테이너에 직접 커넥트. 컨테이너 이름으로 대체 sqlcontainer 합니다.

    docker exec -u root -it sqlcontainer "bash"
    
  2. mssql-conf를 사용하여 설정을 변경합니다. 다음은 설정을 2GB(2,048MB)로 변경하는 memory.memorylimitmb 예제입니다.

    /opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
    

사용자 지정 Docker 컨테이너 예제

사용자 지정 Docker 컨테이너의 예는 https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples를 참조하세요. 다음은 그 예입니다.

Dockerfiles를 사용하여 Docker 컨테이너를 빌드하고 실행하는 방법에 대한 자세한 내용은 GitHub의 ML Services 샘플을 참조하세요.

  • 빠른 시작을 진행하여 Docker에서 SQL Server 2017(14.x) 컨테이너 이미지로 시작합니다.
  • 빠른 시작을 진행하여 Docker에서 SQL Server 2019(15.x) 컨테이너 이미지로 시작합니다.
  • 빠른 시작을 진행하여 Docker에서 SQL Server 2022(16.x) 컨테이너 이미지로 시작합니다.

SQL 설명서에 참여하세요

SQL 콘텐츠를 직접 편집할 수 있다는 것을 알고 계셨나요? 직접 편집하면 설명서가 개선될 뿐만 아니라 페이지에 참여자로 기입됩니다.

자세한 내용은 SQL Server 설명서에 기여하는 방법을 참조하세요.