본문 바로가기
서버구축 (WEB,DB)

Docker에서 SQL Server linux 컨테이너 이미지 실행

by 날으는물고기 2023. 11. 5.

Docker에서 SQL Server linux 컨테이너 이미지 실행

SQL Server를 컨테이너 이미지로 구축하고 연결하는 방법에 관해서 Docker를 사용하여 SQL Server 2022(16.x) Linux 컨테이너 이미지를 실행하고, SQL Server 컨테이너 내에서 데이터베이스를 만들고 쿼리를 실행하는 단계별 가이드를 제공합니다.

단계 1: Docker 설치
Docker를 호스트 시스템에 설치해야 합니다. Docker 공식 웹사이트에서 설치 가이드를 확인하여 Docker를 설치합니다.

 

단계 2: SQL Server 컨테이너 이미지 가져오기
원하는 SQL Server 버전에 해당하는 Docker 이미지를 Docker Hub에서 가져옵니다. 예를 들어, SQL Server 2022 이미지를 가져오려면 다음 명령어를 사용합니다.

docker pull mcr.microsoft.com/mssql/server:2022-latest

사용 가능한 모든 이미지를 보려면 mssql-server Docker 허브 페이지를 참조하세요.

 

단계 3: SQL Server 컨테이너 실행
다음으로, SQL Server 컨테이너를 실행합니다. 이때 컨테이너의 포트 매핑과 관리자 비밀번호를 설정해야 합니다. 아래 명령어에서 <YourStrong!Passw0rd> 부분을 본인의 비밀번호로 바꾸세요. 암호는 SQL Server 기본 암호 정책이 따라야 합니다. 그렇지 않으면 컨테이너는 SQL 서버를 설정할 수 없어 작동이 중지됩니다. 기본적으로 암호는 8자 이상이어야 하며 대문자, 소문자, 0~9까지의 숫자 및 기호 네 가지 집합 중 세 집합의 문자를 포함해야 합니다.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" \
   -p 1433:1433 --name sql1 --hostname sql1 \
   -d mcr.microsoft.com/mssql/server:2022-latest

이 명령은 SQL Server 컨테이너를 백그라운드에서 실행하고 호스트의 1433 포트와 컨테이너의 1433 포트를 매핑합니다.

다음 명령을 사용하여 컨테이너 내에서 SQL Server 오류 로그를 검토할 수 있습니다.

docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection

위에서 설명한 대로 --hostname 매개 변수는 컨테이너의 내부 이름을 사용자 지정 값으로 변경합니다. 이 값은 다음 Transact-SQL 쿼리에서 반환되는 이름입니다.

SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName');

--hostname 및 --name을 같은 값에 설정하는 것은 대상 컨테이너를 쉽게 식별하는 데 유용한 좋은 방법입니다.

프로덕션 버전을 실행하려면 MSSQL_PID 환경 변수를 사용하여 프로덕션 버전을 지정해야 합니다. 다음 예제에서는 Enterprise Edition용 최신 SQL Server 2022(16.x) 컨테이너 이미지를 실행하는 방법을 보여 줍니다.

docker run --name sqlenterprise \
-e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-e 'MSSQL_PID=Enterprise' -p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
매개 변수 설명
-e "ACCEPT_EULA=Y" 최종 사용자 사용권 계약 수락을 확인하기 위해 ACCEPT_EULA 변수를 어떤 값에 설정합니다. SQL Server 이미지에 대한 설정을 해야 합니다.
-e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" 8자 이상이고 SQL Server 암호 요구 사항을 충족하는 자신만의 강력한 암호를 지정합니다. SQL Server 이미지에 대한 설정을 해야 합니다.
-e "MSSQL_COLLATION=<SQL_Server_collation>" 기본값 SQL_Latin1_General_CP1_CI_AS 대신 사용자 지정 SQL Server 데이터 정렬을 지정합니다.
-p 1433:1433 호스트 환경의 TCP 포트(첫 번째 값)를 컨테이너의 TCP 포트(두 번째 값)로 매핑합니다. 이 예제에서 SQL Server는 컨테이너의 TCP 1433에서 수신 대기하고 이 컨테이너는 호스트의 TCP 포트 1433에 공개됩니다.
--name sql1 컨테이너에 대해 임의로 생성된 이름보다는 사용자 지정 이름을 지정합니다. 둘 이상의 컨테이너를 실행하는 경우 이 동일한 이름을 다시 사용할 수 없습니다.
--hostname sql1 컨테이너 호스트 이름을 명시적으로 설정하는 데 사용됩니다. 지정하지 않으면 임의로 생성된 시스템 GUID인 컨테이너 ID가 기본값으로 사용됩니다.
-d 백그라운드(디먼)에서 컨테이너를 실행합니다.
mcr.microsoft.com/mssql/server:2022-latest SQL Server Linux 컨테이너 이미지입니다.

 

단계 4: SQL Server 컨테이너에 연결
이제 SQL Server 컨테이너가 실행 중이므로 컨테이너에 연결할 수 있습니다.

먼저, Microsoft ODBC Driver for SQL Server 설치(Linux)를 합니다. ODBC 드라이버 다운로드

if ! [[ "18.04 20.04 22.04 23.04" == *"$(lsb_release -rs)"* ]];
then
    echo "Ubuntu $(lsb_release -rs) is not currently supported.";
    exit;
fi

curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo apt-get install -y unixodbc-dev

연결을 위해 SQL Server 명령줄 도구(sqlcmd)를 사용할 수 있습니다. 아래 명령은 sqlcmd를 사용하여 컨테이너의 SQL Server에 연결하는 예시입니다.

/opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P "<YourStrong!Passw0rd>"

위 명령어에서 -S localhost는 로컬 호스트의 SQL Server에 연결하는 것을 나타냅니다. 포트를 지정하기 위해 , 형식으로 입력할 수 있습니다.

 

SA 계정은 설치 중에 생성되는 SQL Server 인스턴스의 시스템 관리자입니다. SQL Server 컨테이너를 만든 후 컨테이너에서 echo $MSSQL_SA_PASSWORD를 실행하여 지정한 MSSQL_SA_PASSWORD 환경 변수를 검색할 수 있습니다. 보안을 위해 SA 암호를 변경합니다.

docker exec를 사용하여 sqlcmd를 실행하고 Transact-SQL을 사용하여 암호를 변경합니다. 다음 예제에서는 사용자 입력에서 이전 및 새 암호를 읽습니다.

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
 -S localhost -U SA \
 -P "$(read -sp "Enter current SA password: "; echo "${REPLY}")" \
 -Q "ALTER LOGIN SA WITH PASSWORD=\"$(read -sp "Enter new SA password: "; echo "${REPLY}")\""

참고. sqlcmd 명령의 옵션과 사용 방법

sqlcmd
   -a packet_size
   -A (dedicated administrator connection)
   -b (terminate batch job if there is an error)
   -c batch_terminator
   -C (trust the server certificate)
   -d db_name
   -D
   -e (echo input)
   -E (use trusted connection)
   -f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]
   -g (enable column encryption)
   -G (use Azure Active Directory for authentication)
   -h rows_per_header
   -H workstation_name
   -i input_file
   -I (enable quoted identifiers)
   -j (Print raw error messages)
   -k[1 | 2] (remove or replace control characters)
   -K application_intent
   -l login_timeout
   -L[c] (list servers, optional clean output)
   -m error_level
   -M multisubnet_failover
   -N (encrypt connection)
   -o output_file
   -p[1] (print statistics, optional colon format)
   -P password
   -q "cmdline query"
   -Q "cmdline query" (and exit)
   -r[0 | 1] (msgs to stderr)
   -R (use client regional settings)
   -s col_separator
   -S [protocol:]server[instance_name][,port]
   -t query_timeout
   -u (unicode output file)
   -U login_id
   -v var = "value"
   -V error_severity_level
   -w screen_width
   -W (remove trailing spaces)
   -x (disable variable substitution)
   -X[1] (disable commands, startup script, environment variables, optional exit)
   -y variable_length_type_display_width
   -Y fixed_length_type_display_width
   -z new_password
   -Z new_password (and exit)
   -? (usage)

  1. 기본 구문
    sqlcmd [옵션]
  2. SQL Server에 연결하기
    -S 옵션을 사용하여 SQL Server에 연결합니다. SQL Server 인스턴스의 이름과 포트 번호(선택적)를 지정합니다.
    -S [protocol:] server[,port]
    예)
    sqlcmd -S server_name\instance_name -U username -P password
  3. 쿼리 실행
    -Q 옵션을 사용하여 SQL 쿼리를 실행합니다.
    -Q "SQL_Query"
    예:
    sqlcmd -S server_name -U username -P password -Q "SELECT * FROM YourTable"
  4. 결과 출력 및 파일로 저장
    -o 옵션을 사용하여 결과를 파일로 저장합니다.
    -o OutputFile.txt
    예:
    sqlcmd -S server_name -U username -P password -Q "SELECT * FROM YourTable" -o OutputFile.txt
  5. 스크립트 파일 실행
    -i 옵션을 사용하여 SQL 스크립트 파일을 실행합니다.
    -i YourScript.sql
    예:
    sqlcmd -S server_name -U username -P password -i YourScript.sql
  6. 옵션 및 변수 설정
    -v  -setvar 옵션을 사용하여 SQL Server 연결 설정 및 sqlcmd 변수를 설정합니다.
    -v var_name=value
    -setvar var_name value
    예:
    sqlcmd -S server_name -U username -P password -v MyVar=123 -Q "SELECT * FROM YourTable WHERE Column = $(MyVar)"
  7. 결과 형식 지정
    -s 옵션을 사용하여 열 구분자를 지정하고, -W 옵션을 사용하여 열의 후행 공백을 제거합니다.
    -s column_separator_char
    -W
    예:
    sqlcmd -S server_name -U username -P password -Q "SELECT Col1, Col2 FROM YourTable" -s ',' -W
  8. 기타 명령 및 옵션
    sqlcmd에는 다양한 기타 명령 및 옵션이 있습니다. 예를 들어, :list 명령을 사용하여 sqlcmd 변수를 나열하거나, :on error 명령을 사용하여 오류 처리 동작을 지정할 수 있습니다.
  9. 결과 암호화 모드 설정
    -N 옵션을 사용하여 연결 암호화 모드를 설정합니다. s (Strict), m (Mandatory), 또는 o (Optional) 중 하나를 선택할 수 있습니다.
    -N [s|m|o]
    예:
    sqlcmd -S server_name -U username -P password -N s -Q "SELECT * FROM YourTable"
  10. 암호 변경
    -z 옵션을 사용하여 암호를 변경하고 -Z 옵션을 사용하여 변경 후에 sqlcmd를 종료합니다.
    -z new_password
    -Z new_password
    예:
    sqlcmd -S server_name -U username -P old_password -z new_password -Z new_password
  11. SQL Server 인증
    -U 옵션을 사용하여 사용자 로그인 ID를 지정하고, -P 옵션과 함께 사용하여 암호를 지정합니다.
    -U username
    -P password
    예:
    sqlcmd -S server_name -U username -P password -Q "SELECT * FROM YourTable"
  12. 필요한 결과 행 수 지정
    -h 옵션을 사용하여 열 머리글 사이에 출력할 행의 수를 지정합니다.
    -h number_of_rows
    예:
    sqlcmd -S server_name -U username -P password -Q "SELECT * FROM YourTable" -h 2

이러한 옵션 및 명령을 조합하여 원하는 작업을 수행하거나 SQL Server와 상호 작용할 수 있습니다. SQL Server 버전 및 환경에 따라 지원되는 옵션과 동작이 다를 수 있으므로 해당 버전의 문서와 설명서를 참고하는 것이 좋습니다.

 

sqlcmd를 사용하여 연결 - ODBC Driver for SQL Server

Linux 및 macOS의 mssql-tools 패키지에서 제공되는 sqlcmd 유틸리티에서 사용할 수 있는 옵션 및 명령을 알아봅니다.

learn.microsoft.com

참고. 컨테이너 외부 도구

 

단계 5: SQL Server 컨테이너 버전 확인
SQL Server 컨테이너의 버전을 확인하려면 다음 명령을 사용합니다. <YourStrong!Passw0rd> 부분은 앞서 설정한 관리자 비밀번호로 대체해야 합니다.

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourStrong!Passw0rd>" -Q "SELECT @@VERSION"

대상 컨테이너 이미지의 SQL Server 버전 및 빌드 번호를 확인할 수도 있습니다.

docker run -e PAL_PROGRAM_INFO=1 --name sqlver \
-ti mcr.microsoft.com/mssql/server:2022-latest && \
docker rm sqlver

위 명령은 다음 출력과 비슷한 버전 정보를 표시합니다.

sqlservr
  Version 16.0.1000.6
  Build ID d81e9b6de06534e649bd57dd609aa3050f5e380f361b7f8a80a80eeb71e7422c
  Build Type release
  Git Version 2aede92f
  Built at Tue Nov 01 06:11:40 GMT 2022

PAL
  Build ID 754097e8f0db68f559e1cbc9d46952ac9fd518b5da9f12964ef40fc9033720e3
  Build Type release
  Git Version d88e3e1130
  Built at Tue Nov 01 06:08:02 GMT 2022

Packages
  system.security                         mssql-16.0.1000.6_26_official-release
  system.certificates                     mssql-16.0.1000.6_26_official-release
  sqlagent                                16.0.1000.6
  system.wmi                              10.0.17763.2061.202107231
  system.netfx                            4.7.0.0.202104262
  system                                  mssql-16.0.1000.6_26_official-release
  system.common                           10.0.17763.2061.202107231
  sqlservr                                16.0.1000.6
  secforwarderxplat                       16.0.1000.6

 

단계 6: 추가 SQL Server 컨테이너 실행 (옵션)
만약 동일한 호스트에서 추가 SQL Server 컨테이너를 실행하고자 한다면, 다음과 같이 동일한 단계를 반복할 수 있습니다. 다른 포트 번호로 매핑하여 다른 컨테이너를 실행할 수 있습니다.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest

이렇게 하면 여러 SQL Server 인스턴스를 동일한 호스트에서 실행할 수 있습니다.

 

참고사항:

  • 이 문서에서는 SQL Server 2022 이미지를 사용하는 예제를 보여주었지만, 원하는 버전으로 변경할 수 있습니다.
  • 반드시 관리자 비밀번호를 안전하게 설정하고 사용하세요.
  • 컨테이너를 다운그레이드하거나 업그레이드하려면 데이터 지속성을 고려해야 합니다.

 

Docker Compose를 통해 컨테이너를 수행할 수 있습니다. docker-compose.yml 샘플을 참고해주세요.

version: '3.3'
services:

  db:
    build:
      context: ./docker/db/
      dockerfile: Dockerfile
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "Alaska2017"
      ACCEPT_EULA: "Y"
    healthcheck:
      test: sqlcmd -S db1.internal.prod.example.com -U SA -P 'Alaska2017' -Q 'select distinct 1 from AdventureWorksDW2017.dbo.DimDate'
    networks:
      mynetwork:
        aliases:
          - db1.internal.prod.example.com

  web:
    build:
      context: ./docker/web/
      dockerfile: Dockerfile
    user: root
    depends_on:
      - db
    volumes:
      - .:/code/
    ports:
      - "8080:8080"
    environment:
      DJANGO_SETTINGS_MODULE: SqlServerOnDocker.settings
    command: python3 manage.py runserver 0.0.0.0:8080
    restart: unless-stopped
    networks:
      mynetwork:
        aliases:
          - web1.internal.prod.example.com

networks:
  mynetwork:
    driver: bridge

이제 SQL Server Linux 컨테이너를 배포하고 연결하는 데 필요한 단계를 이해하셨을 것입니다. 필요한 경우 버전 및 포트를 맞춰서 적절히 설정하면 됩니다.

 

단계 7: 데이터베이스 생성 및 쿼리 실행

SQL Server 컨테이너 내에서 다음 명령을 사용하여 데이터베이스를 생성하고 쿼리를 실행합니다.

1. 데이터베이스 생성

CREATE DATABASE TestDB;

2. 데이터베이스 목록 확인

SELECT Name from sys.databases;

3. 실행

GO

4. 데이터 삽입

USE TestDB;
CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT);
INSERT INTO Inventory VALUES (1, 'banana', 150);
INSERT INTO Inventory VALUES (2, 'orange', 154);
GO

5. 데이터 선택

SELECT * FROM Inventory WHERE quantity > 152;
GO

6. sqlcmd 명령 프롬프트 종료

QUIT

SQL Server에 연결할 다른 일반적인 도구는 다음과 같습니다.

 

단계 8: 컨테이너 제거

SQL Server 컨테이너를 제거하려면 다음 명령을 사용합니다.

docker stop sql1
docker rm sql1

컨테이너를 중지하고 삭제합니다.

 

이제 단계별로 Docker를 사용하여 SQL Server 컨테이너를 실행하고 데이터베이스를 만들고 쿼리를 실행하는 과정을 완료했습니다. 필요에 따라 SQL Server 및 Docker 설정을 사용자 지정할 수 있습니다.

 

Linux 컨테이너에서 SQL Server 데이터베이스 복원

 

Linux 컨테이너에서 SQL Server 데이터베이스 복원 - SQL Server

이 자습서에서는 새 Linux 컨테이너에서 SQL Server 데이터베이스 백업을 복원하는 방법을 보여 줍니다.

learn.microsoft.com

728x90

댓글