Устранение неполадок контейнеров Docker SQL Server

Применимо к:SQL Server — Linux

В этой статье рассматриваются распространенные ошибки, возникающие при развертывании и использовании контейнеров Docker в SQL Server, а также способы устранения этих ошибок.

Ошибки команды Docker

Если вы получаете ошибки, связанные с командами docker, убедитесь, что служба Docker запущена, и попробуйте выполнить запуск с повышенными привилегиями.

Например, при выполнении команд docker в Linux вы можете получить следующее сообщение об ошибке:

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

Если вы получаете эту ошибку в Linux, попробуйте выполнить те же команды с префиксом sudo. Если этот способ также не сработает, убедитесь, что служба Docker запущена, и при необходимости запустите ее.

sudo systemctl status docker
sudo systemctl start docker

В Windows убедитесь, что запускаете PowerShell или командную строку от имени администратора.

Важно!

Переменная среды SA_PASSWORD является нерекомендуемой. Вместо этого используйте MSSQL_SA_PASSWORD.

Ошибки при запуске контейнера с SQL Server

Если запуск контейнера SQL Server завершился сбоем, попробуйте выполнить следующие проверки:

  • Если возникает ошибка, такая как 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 с уже используемым портом. Это может произойти в том случае, если вы запускаете SQL Server локально на хост-компьютере. Кроме того, такая ситуация возможна при запуске двух контейнеров с SQL Server и попытке сопоставить их с одним портом узла. В этом случае используйте параметр -p, чтобы сопоставить порт контейнера 1433 с другим портом узла. Например:

    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`.
    
    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2022-latest`.
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2022-latest`.
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2022-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, добавьте пользователя в группу docker в Ubuntu. После этого выйдите из системы и выполните вход снова, чтобы применить изменения к новым сеансам.

      usermod -aG docker $USER
    
  • Проверьте наличие сообщений об ошибках от контейнера.

    docker logs e69e056c702d
    
  • Убедитесь, что ваша система отвечает требованиям к объему памяти и дисковому пространству, которые указаны в разделе Предварительные требования статьи с кратким руководством.

  • Если вы используете программное обеспечение для управления контейнером, убедитесь, что оно поддерживает привилегированное выполнение процессов контейнера. Процесс sqlservr в контейнере выполняется в привилегированном режиме.

  • Если контейнер Docker в SQL Server выполняет выход сразу после запуска, проверьте журналы Docker. Если вы используете PowerShell в Windows с помощью команды docker run, используйте двойные кавычки вместо одинарных. В PowerShell Core используйте одинарные кавычки.

  • Проверьте журналы установки и ошибок SQL Server.

Включение записи дампа

Если произошел сбой процесса SQL Server внутри контейнера, необходимо создать новый контейнер и включить для него SYS_PTRACE. При этом будет добавлена возможность отслеживания процесса в Linux, которая необходима для создания файла дампа при возникновении исключения. Файл дампа может использоваться службой поддержки в процессе устранения неполадок. Эту возможность можно включить с помощью следующей команды выполнения Docker.

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
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:2022-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:2022-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:2022-latest

Сбой подключений SQL Server

Если вам не удается подключиться к экземпляру SQL Server, запущенному в контейнере, попробуйте выполнить следующие проверки:

  • Убедитесь, что контейнер с SQL Server запущен. Для этого проверьте содержимое столбца STATUS (Состояние) в выходных данных команды docker ps -a. При необходимости запустите его с помощью команды docker start <Container ID>.

  • Если вы сопоставляете с портом, отличным от порта узла по умолчанию (1433), обязательно укажите этот порт в строке подключения. Сопоставление порта можно проверить в столбце PORTS (Порты) в выходных данных команды docker ps -a. Например, следующая команда подключает sqlcmd к контейнеру, прослушивающему порт 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 игнорирует значение MSSQL_SA_PASSWORD. Вместо этого для тома данных или контейнера тома данных используется предварительно заданный пароль системного администратора, хранящийся в данных SQL Server. Убедитесь, что используемый пароль системного администратора связан с данными, к которым вы подключаетесь.

  • Проверьте журналы установки и ошибок SQL Server.

Группы доступности SQL Server

Если вы используете Docker с группами доступности SQL Server, существует два дополнительных требования.

  • Выполните сопоставление порта, который используется для подключения к реплике (по умолчанию 5022). Например, укажите -p 5022:5022 в команде docker run.

  • Явно укажите имя узла контейнера с помощью параметра -h YOURHOSTNAME команды docker run. Это имя узла используется при настройке группы доступности. Если оно не задано с помощью команды -h, по умолчанию в этом качестве используется идентификатор контейнера.

Журналы установки и ошибок SQL Server

Вы можете просмотреть журналы установки и ошибок SQL Server в папке /var/opt/mssql/log. Если контейнер не запущен, сначала запустите его. Затем проверьте журналы с помощью интерактивной командной строки. Идентификатор контейнера можно получить, выполнив команду docker ps.

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

Из сеанса Bash внутри контейнера выполните следующие команды:

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

Совет

Если вы подключили каталог хоста к каталогу /var/opt/mssql при создании контейнера, вместо этого можно выполнять поиск в подкаталоге log по сопоставленному пути на узле.

Выполнение команд в контейнере

Вы можете выполнять команды из работающего контейнера с помощью терминала узла.

Чтобы получить идентификатор контейнера, выполните следующую команду:

docker ps -a

Чтобы запустить терминал Bash в контейнере, выполните следующую команду:

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

Теперь вы можете выполнять команды так, выполняли бы их из терминала внутри контейнера. По завершении введите exit. В этом случае завершается интерактивный сеанс команд, однако контейнер продолжает работать.

  • Приступая к работе с образами контейнеров SQL Server 2022 в Docker, ознакомьтесь с кратким руководством.

Примите участие в разработке документации по SQL

Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.

Дополнительные сведения см. в разделе Участие в работе над документацией по SQL Server.