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

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

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

Ошибки команды 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 или командную строку как администратор.

Important

Переменная среды 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=<password>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2022-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2022-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2022-latest
    
    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2025-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2025-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2025-latest
    

    Caution

    Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

  • Если при попытке запуска контейнера возникает ошибка 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
    
  • Убедитесь, что ваша система отвечает требованиям к объему памяти и дисковому пространству, которые указаны в разделе Предварительные требования статьи с кратким руководством.

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

  • Если контейнер SQL Server в Docker сразу завершается после запуска, проверьте логи 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=<password>' -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=<password>" -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=<password>" -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=<password>' -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=<password>" -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=<password>" -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=<password>' -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=<password>" -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=<password>" -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=<password>' -e 'MSSQL_PID=Developer' --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2025-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2025-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 1401:1433 -d mcr.microsoft.com/mssql/server:2025-latest

Caution

Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

Сбой подключений 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 '<password>'
    
    sqlcmd -S 10.3.2.4,1401 -U sa -P "<password>"
    
    sqlcmd -S 10.3.2.4,1401 -U sa -P "<password>"
    
  • Если вы использовали docker run с существующим сопоставленным томом данных или контейнером тома данных, SQL Server игнорирует значение MSSQL_SA_PASSWORD. Вместо этого используется предварительно настроенный пароль учетной записи sa из данных SQL Server, хранящихся в томе данных или контейнере тома данных. Убедитесь, что вы используете sa пароль, связанный с данными, к которым вы подключаетесь.

  • Проверьте журналы установки и ошибок 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 <Container ID>
docker exec -it <Container ID> "bash"

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

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

Tip

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

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

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

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

docker ps -a

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

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

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

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

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

Дополнительные сведения см. в разделе Редактирование документации Microsoft Learn.