SQL Server Docker 컨테이너 문제 해결Troubleshooting SQL Server Docker containers

적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) - Linux적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) - Linux

이 문서에서는 SQL Server Docker 컨테이너 배포 및 사용 시 발생하는 일반적인 오류를 설명하고, 문제 해결에 도움이 되는 문제 해결 기술을 제공합니다.This article talks about common errors seen when deploying and using SQL Server Docker containers, and provide troubleshooting techniques to help resolve the issue.

Docker 명령 오류Docker command errors

docker 명령과 관련된 오류가 발생할 경우 docker 서비스가 실행되고 있는지 확인하고 관리자 권한으로 실행해 봅니다.If you get errors for any docker commands, make sure that the docker service is running, and try to run with elevated permissions.

예를 들어 Linux에서 docker 명령을 실행할 때 다음과 같은 오류가 발생할 수 있습니다.For example, on Linux, you might get the following error when running docker commands:

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Linux에서 이 오류가 발생할 경우 앞에 sudo를 추가하여 동일한 명령을 실행해 봅니다.If you get this error on Linux, try running the same commands prefaced with sudo. 이 명령이 실패하면 docker 서비스가 실행되고 있는지 확인하고, 필요한 경우 서비스를 시작합니다.If that fails, verify the docker service is running, and start it if necessary.

sudo systemctl status docker
sudo systemctl start docker

Windows에서 PowerShell 또는 명령 프롬프트를 관리자 권한으로 시작했는지 확인합니다.On Windows, verify that you are launching PowerShell or your command-prompt as an Administrator.

SQL Server 컨테이너 시작 오류SQL Server container startup errors

SQL Server 컨테이너가 실행되지 않으면 다음 테스트를 시도합니다.If the SQL Server container fails to run, try the following tests:

  • failed to create endpoint CONTAINER_NAME on network bridge. Error starting proxy: listen tcp 0.0.0.0:1433 bind: address already in use. 등과 같은 오류가 발생하면 컨테이너 포트 1433을 이미 사용 중인 포트에 매핑하려고 시도하는 것입니다.If you get an error such as failed to create endpoint CONTAINER_NAME on network bridge. Error starting proxy: listen tcp 0.0.0.0:1433 bind: address already in use., you are attempting to map the container port 1433 to a port that is already in use. 이 문제는 호스트 머신에서 SQL Server를 로컬로 실행하는 경우에 발생할 수 있습니다.This can happen if you're running SQL Server locally on the host machine. 두 개의 SQL Server 컨테이너를 시작하고 둘 다 동일한 호스트 포트에 매핑하려고 하는 경우에도 발생할 수 있습니다.It can also happen if you start two SQL Server containers and try to map them both to the same host port. 이 문제가 발생할 경우 -p 매개 변수를 사용하여 컨테이너 포트 1433을 다른 호스트 포트에 매핑합니다.If this happens, use the -p parameter to map the container port 1433 to a different host port. 예를 들면 다음과 같습니다.For example:

    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest`.
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest`.
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest`.
    
    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-latest`.
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-latest`.
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-latest`.
    
  • 컨테이너를 시작하려고 할 때 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.30tdout=1&tail=all: dial unix /var/run/docker.sock: connect: permission denied 등과 같은 오류가 발생하는 경우 Ubuntu의 Docker 그룹에 사용자를 추가합니다.If you get an error such as Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.30tdout=1&tail=all: dial unix /var/run/docker.sock: connect: permission denied when trying to start a container, then add your user to the docker group in Ubuntu. 이 변경 내용은 새 세션에 영향을 주기 때문에 로그아웃한 후 다시 로그인합니다.Then logout and login again as this change will affect new sessions.

      usermod -aG docker $USER
    
  • 컨테이너의 오류 메시지가 있는지 확인합니다.Check to see if there are any error messages from container.

    docker logs e69e056c702d
    
  • 빠른 시작 문서의 필수 조건 섹션에 지정된 최소 메모리 및 디스크 요구 사항을 충족하는지 확인합니다.Make sure that you meet the minimum memory and disk requirements specified in the prerequisites section of the quickstart article.

  • 컨테이너 관리 소프트웨어를 사용하는 경우 소프트웨어가 루트로 실행 중인 컨테이너 프로세스를 지원하는지 확인합니다.If you are using any container management software, make sure it supports container processes running as root. 컨테이너의 sqlservr.exe 프로세스가 루트로 실행됩니다.The sqlservr process in the container runs as root.

  • SQL Server Docker 컨테이너가 시작 후 즉시 종료되는 경우 Docker 로그를 확인합니다.If your SQL Server Docker container exits immediately after starting, check your docker logs. docker run 명령을 사용하여 Windows에서 PowerShell을 사용하는 경우 작은따옴표 대신 큰따옴표를 사용합니다.If you are using PowerShell on Windows with the docker run command, use double quotes instead of single quotes. PowerShell Core를 사용하는 경우 작은따옴표를 사용합니다.With PowerShell Core, use single quotes.

  • SQL Server 설치 및 오류 로그를 검토합니다.Review the SQL Server setup and error logs.

덤프 캡처 사용Enable dump captures

컨테이너 내부에서 SQL Server 프로세스가 실패하는 경우 SYS_PTRACE를 사용하도록 설정하여 새 컨테이너를 만들어야 합니다.If the SQL Server process is failing inside the container, you should create a new container with SYS_PTRACE enabled. 그러면 예외 발생 시 덤프 파일을 만드는 데 필요한 Linux 프로세스 추적 기능이 추가됩니다.This adds the Linux capability to trace a process, which is necessary for creating a dump file on an exception. 덤프 파일은 고객 지원팀이 문제를 해결하는 데 사용할 수 있습니다.The dump file can be used by support to help troubleshoot the problem. 다음 docker run 명령은 이 기능을 사용하도록 설정합니다.The following docker run command enables this capability.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -e 'MSSQL_PID=Developer' --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -e 'MSSQL_PID=Developer' --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest

SQL Server 연결 실패SQL Server connection failures

컨테이너에서 실행되는 SQL Server 인스턴스에 연결할 수 없는 경우 다음 테스트를 시도합니다.If you can't connect to the SQL Server instance running in your container, try the following tests:

  • docker ps -a 출력의 STATUS 열을 확인하여 SQL Server 컨테이너가 실행되고 있는지 확인합니다.Make sure that your SQL Server container is running by looking at the STATUS column of the docker ps -a output. 컨테이너가 실행되고 있지 않으면 docker start <Container ID>를 사용하여 시작합니다.If not, use docker start <Container ID> to start it.

  • 기본값이 아닌 호스트 포트(1433이 아님)에 매핑한 경우 연결 문자열에 포트를 지정해야 합니다.If you mapped to a non-default host port (not 1433), make sure you are specifying the port in your connection string. docker ps -a 출력의 PORTS 열에서 포트 매핑을 확인할 수 있습니다.You can see your port mapping in the PORTS column of the docker ps -a output. 예를 들어 다음 명령은 sqlcmd를 포트 1401에서 수신 대기 중인 컨테이너에 연결합니다.For example, the following command connects sqlcmd to a container listening on port 1401:

    sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
    
    sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
    
    sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
    
  • 기존의 매핑된 데이터 볼륨 또는 데이터 볼륨 컨테이너와 함께 docker run을 사용한 경우 SQL Server는 SA_PASSWORD 값을 무시합니다.If you used docker run with an existing mapped data volume or data volume container, SQL Server ignores the value of SA_PASSWORD. 대신, 데이터 볼륨 또는 데이터 볼륨 컨테이너의 SQL Server 데이터에서 미리 구성된 SA 사용자 암호를 사용합니다.Instead, the pre-configured SA user password is used from the SQL Server data in the data volume or data volume container. 연결 중인 데이터와 연결된 SA 암호를 사용하고 있는지 확인합니다.Verify that you are using the SA password associated with the data you're attaching to.

  • SQL Server 설치 및 오류 로그를 검토합니다.Review the SQL Server setup and error logs.

SQL Server 가용성 그룹SQL Server Availability Groups

SQL Server 가용성 그룹과 함께 Docker를 사용하는 경우 두 가지 추가 요구 사항이 있습니다.If you are using Docker with SQL Server Availability Groups, there are two additional requirements.

  • 복제본 통신에 사용되는 포트를 매핑합니다(기본값 5022).Map the port that is used for replica communication (default 5022). 예를 들어 docker run 명령의 일부로 -p 5022:5022를 지정합니다.For example, specify -p 5022:5022 as part of your docker run command.

  • docker run 명령의 -h YOURHOSTNAME 매개 변수를 사용하여 컨테이너 호스트 이름을 명시적으로 설정합니다.Explicitly set the container host name with the -h YOURHOSTNAME parameter of the docker run command. 이 호스트 이름은 가용성 그룹을 구성할 때 사용됩니다.This host name is used when you configure your Availability Group. -h를 사용하여 지정하지 않으면 기본적으로 컨테이너 ID로 설정됩니다.If you don't specify it with -h, it defaults to the container ID.

SQL Server 설치 및 오류 로그SQL Server setup and error logs

/var/opt/mssql/log에서 SQL Server 설치 및 오류 로그를 확인할 수 있습니다.You can look at the SQL Server setup and error logs in /var/opt/mssql/log. 컨테이너가 실행되고 있지 않으면 먼저 컨테이너를 시작합니다.If the container is not running, first start the container. 그런 다음, 대화형 명령 프롬프트를 사용하여 로그를 검사합니다.Then use an interactive command-prompt to inspect the logs. docker ps 명령을 실행하여 컨테이너 ID를 가져올 수 있습니다.You can get the container ID by running the command docker ps.

docker start <ContainerID>
docker exec -it <ContainerID> "bash"

컨테이너 내부 bash 세션에서 다음 명령을 실행합니다.From the bash session inside your container, run the following commands:

cd /var/opt/mssql/log
cat setup*.log
cat errorlog

컨테이너를 만들 때 호스트 디렉터리를 /var/opt/mssql에 탑재한 경우, 대신 호스트의 매핑된 경로에 있는 log 하위 디렉터리에서 확인할 수 있습니다.If you mounted a host directory to /var/opt/mssql when you created your container, you can instead look in the log subdirectory on the mapped path on the host.

컨테이너에서 명령 실행Execute commands in a container

실행 중인 컨테이너가 있는 경우 호스트 터미널을 통해 컨테이너 내에서 명령을 실행할 수 있습니다.If you have a running container, you can execute commands within the container from a host terminal.

컨테이너 ID를 가져오려면 다음 명령을 실행합니다.To get the container ID run:

docker ps -a

컨테이너에서 bash 터미널을 시작하려면 다음 명령을 실행합니다.To start a bash terminal in the container run:

docker exec -it <Container ID> /bin/bash

이제 컨테이너 내부 터미널에서 실행하는 것처럼 명령을 실행할 수 있습니다.Now you can run commands as though you are running them at the terminal inside the container. 완료되면 exit을 입력합니다.When finished, type exit. 대화형 명령 세션이 종료되지만 컨테이너는 계속 실행됩니다.This exits in the interactive command session, but your container continues to run.

다음 단계Next steps

  • 빠른 시작을 진행하여 Docker에서 SQL Server 2017 컨테이너 이미지로 시작합니다.Get started with SQL Server 2017 container images on Docker by going through the quickstart.
  • 빠른 시작을 진행하여 Docker에서 SQL Server 2019 컨테이너 이미지로 시작합니다.Get started with SQL Server 2019 container images on Docker by going through the quickstart.