如何连接在一个Docker容器内运行的MSSQL服务器?



我在Docker上使用MSSQL服务器有困难。我创建了撰写文件,一切正常启动,但每当我尝试登录时,它就失败了。它不会通过docker exec命令在本地连接:

sudo docker exec -it <container_id> /opt/mssql-tools/bin/sqlcmd -S localhost -U sa
Password:
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed for user 'sa'..

并且它也无法使用相同的凭据从我的远程PC通过DBeaver连接:

2021-10-20 16:13:48.22 Logon       Error: 18456, Severity: 14, State: 7.
2021-10-20 16:13:48.22 Logon       Login failed for user 'sa'. Reason: An error occurred while evaluating the password. [CLIENT: 192.168.1.150] 

这是我的docker-compose文件:

services:
mssql:
image: mcr.microsoft.com/mssql/server:2017-latest
container_name: mssql
restart: always
environment:
- "SА_PASSWORD=Lmnt!1991"
- "ACCEPT_EULA=Y"
- "TZ=Europe/Belgrade"
ports:
- "1433:1433"
volumes:
- "./data:/var/opt/mssql"
deploy:
resources:
limits:
memory: 4096M
networks:
default:
networks:
default:
name: pyramid
driver: bridge
ipam:
config:
-
subnet: 172.9.9.0/24
gateway: 172.9.9.1

这里有两个问题:

  1. 环境变量不正确
  2. 不安全的密码字符

如果你观察你的Docker容器日志,你会看到有用的信息,如:

2021-10-20 23:37:51.74 Logon       Error: 18456, Severity: 14, State: 7.
2021-10-20 23:37:51.74 Logon       Login failed for user 'sa'. Reason: An error occurred while evaluating the password. [CLIENT: 172.9.9.2]

根据MSSQLSERVER_18456状态7的意思:

7禁止登录,密码错误。

发生这种情况是因为您在docker-compose中指定了环境变量SA_PASSWORD而不是MSSQL_SA_PASSWORD。yaml文件。作为第一步,停止并删除容器(也删除./data文件夹),并编辑YAML如下所示:

environment:
- "MSSQL_SA_PASSWORD=Lmnt!1991"
- "ACCEPT_EULA=Y"
- "TZ=Europe/Belgrade"

现在当你登录时,你会看到一个不同的登录错误:

2021-10-20 23:42:26.11 Logon       Error: 18456, Severity: 14, State: 8.
2021-10-20 23:42:26.11 Logon       Login failed for user 'sa'. Reason: Password did not match that for the login provided. [CLIENT: 172.9.9.2]

这似乎是因为!是一个特殊的shell字符。停止并删除容器(也删除./data文件夹),编辑YAML如下所示:

environment:
- "MSSQL_SA_PASSWORD=Lmnt@1991"
- "ACCEPT_EULA=Y"
- "TZ=Europe/Belgrade"

现在当您登录时,使用@字符而不是!,您将成功连接。

注意:您需要在两次尝试之间删除./data文件夹,因为sa密码设置只在容器首次启动时发生。重新配置docker-compose。并简单地删除/提升容器将不会重置sa凭证,之前的配置将在./data文件夹中持久存在。

最新更新