ITPub博客

首页 > 数据库 > SQL Server > 使用 Docker 运行 SQL Server 容器映像

使用 Docker 运行 SQL Server 容器映像

原创 SQL Server 作者:lhrbest 时间:2020-03-24 13:05:23 0 删除 编辑


使用 Docker 运行 SQL Server 容器映像


https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker?view=sql-server-2017&pivots=cs1-bash


https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash



https://hub.docker.com/r/microsoft/mssql-server-windows-developer/tags
参考:https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker?view=sql-server-2017&pivots=cs1-bash
docker search mssql
docker pull mcr.microsoft.com/mssql/server:2017-latest
docker run -d --name mssql20171401 -p 1401:1433  -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=lhr@zr123" mcr.microsoft.com/mssql/server:2017-latest
docker exec -it mssql20171401 bash
/opt/mssql-tools/bin/sqlcmd  -S localhost -U SA -P "lhr@zr123"
sqlcmd -S 121.36.78.6,1401 -U SA -P "lhr@zr123"
SELECT Name from sys.Databases
go



拉取并运行容器映像

在开始执行以下步骤之前,请确保已在本文顶部选择了首选的 shell(bash、PowerShell 或 cmd)。

  1. 从 Microsoft 容器注册表中拉取 SQL Server 2017 Linux 容器映像。

    bash 复制
    sudo docker pull mcr.microsoft.com/mssql/server:2017-latest

     提示

    如果要运行 SQL Server 2019 容器,请参阅 本文的 SQL Server 2019 版本

    前一个命令请求最新的 SQL Server 2017 容器映像。  如果想请求某个特定映像,需添加一个冒号和标记名称(例如  mcr.microsoft.com/mssql/server:2017-GA-ubuntu  若要查看所有可用映像,请参阅  mssql-server Docker hub 页

    对于本文中的 bash 命令,将使用  sudo  在 MacOS 上,可能不需要  sudo  在 Linux 上,如果不想使用  sudo 来运行 Docker,可以配置一个  docker 组,并将用户添加到该组。  有关详细信息,请参阅  Post-installation steps for Linux(适用于 Linux 的安装后步骤)。

  2. 要使用 Docker 运行容器映像,可以从 Bash Shell (Linux/macOS) 或提升的 PowerShell 命令提示符使用以下命令。

    bash 复制
    sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
       -p 1433:1433 --name sql1 \
       -d mcr.microsoft.com/mssql/server:2017-latest

     备注

    密码应符合 SQL Server 默认密码策略,否则容器无法设置 SQL Server,将停止工作。  默认情况下,密码的长度必须至少为 8 个字符,并且必须包含以下四种字符中的三种:大写字母、小写字母、十进制数字和符号。  你可以通过执行  docker logs 命令检查错误日志。

     备注

    默认情况下,这会创建一个使用 SQL Server 2017 开发人员版的容器。  在容器中运行生产版本的过程略有不同。  有关详细信息,请参阅 运行生产容器映像

    下表对前一个  docker run 示例中的参数进行了说明:

    表 1
    参数 说明
    -e "ACCEPT_EULA=Y" 将  ACCEPT_EULA 变量设置为任意值,以确认接受 最终用户许可协议  SQL Server 映像的必需设置。
    -e "SA_PASSWORD=<YourStrong@Passw0rd\>" 指定至少包含 8 个字符且符合  SQL Server 密码要求的强密码。  SQL Server 映像的必需设置。
    -p 1433:1433 将主机环境中的 TCP 端口(第一个值)映射到容器中的 TCP 端口(第二个值)。  在此示例中,SQL Server 侦听容器中的 TCP 1433,并对主机上的端口 1433 公开。
    --name sql1 为容器指定一个自定义名称,而不是使用随机生成的名称。  如果运行多个容器,则无法重复使用相同的名称。
    -d mcr.microsoft.com/mssql/server:2017-latest SQL Server 2017 Linux 容器映像。
  3. 要查看 Docker 容器,请使用  docker ps 命令。

    bash 复制
    sudo docker ps -a

    应会看到与以下屏幕截图类似的输出:

    Docker ps 命令输出

  4. 如果“状态”列显示“正常运行”,则 SQL Server 将在容器中运行,并侦听“端口”列中指定的端口 。  如果 SQL Server 容器的“状态”列显示“已退出”,则参阅 配置指南的疑难解答部分 。

-h(主机名)参数也非常有用,但为了简单起见,本教程中不使用它。  这会将容器的内部名称更改为一个自定义值。  也就是以下 Transact-SQL 查询中返回的名称:

SQL 复制
SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName')

将  -h 和  --name 设为相同的值是一种很好的方法,可以轻松地识别目标容器。

更改 SA 密码

SA 帐户是安装过程中在 SQL Server 实例上创建的系统管理员。  创建 SQL Server 容器后,通过在容器中运行  echo $SA_PASSWORD,可发现指定的  SA_PASSWORD 环境变量。  出于安全考虑,请考虑更改 SA 密码。

  1. 选择 SA 用户要使用的强密码。

  2. 使用  docker exec 运行sqlcmd ,以使用 Transact-SQL 更改密码。  在下面的示例中,将旧密码  <YourStrong!Passw0rd> 和新密码  <YourNewStrong!Passw0rd> 替换为你自己的密码值。

    bash 复制
    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P "<YourStrong@Passw0rd>" \
       -Q 'ALTER LOGIN SA WITH PASSWORD="<YourNewStrong@Passw0rd>"'

连接到 SQL Server

下列步骤在容器内部使用 SQL Server 命令行工具  sqlcmd 来连接 SQL Server。

  1. 使用  docker exec -it 命令在运行的容器内部启动交互式 Bash Shell。  在下面的示例中, sql1 是在创建容器时由  --name 参数指定的名称。

    bash 复制
    sudo docker exec -it sql1 "bash"
  2. 在容器内部使用 sqlcmd 进行本地连接。  默认情况下,sqlcmd 不在路径之中,因此需要指定完整路径。

    bash 复制
    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"

     提示

    可以省略命令行上提示要输入的密码。

  3. 如果成功,应会显示 sqlcmd 命令提示符: 1>

创建和查询数据

以下部分将引导你使用 sqlcmd 和 Transact-SQL 完成新建数据库、添加数据并运行简单查询的整个过程。

新建数据库

以下步骤创建一个名为  TestDB 的新数据库。

  1. 在 sqlcmd 命令提示符中,粘贴以下 Transact-SQL 命令以创建测试数据库:

    SQL 复制
    CREATE DATABASE TestDB
  2. 在下一行中,编写一个查询以返回服务器上所有数据库的名称:

    SQL 复制
    SELECT Name from sys.Databases
  3. 前两个命令没有立即执行。  必须在新行中键入  GO 才能执行以前的命令:

    SQL 复制
    GO

插入数据

接下来创建一个新表  Inventory,然后插入两个新行。

  1. 在 sqlcmd 命令提示符中,将上下文切换到新的  TestDB 数据库:

    SQL 复制
    USE TestDB
  2. 创建名为  Inventory 的新表:

    SQL 复制
    CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
  3. 将数据插入新表:

    SQL 复制
    INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
  4. 要执行上述命令的类型  GO

    SQL 复制
    GO

选择数据

现在,运行查询以从  Inventory 表返回数据。

  1. 通过 sqlcmd 命令提示符输入查询,以返回  Inventory 表中数量大于 152 的行:

    SQL 复制
    SELECT * FROM Inventory WHERE quantity > 152;
  2. 执行此命令:

    SQL 复制
    GO

退出 sqlcmd 命令提示符

  1. 要结束 sqlcmd 会话,请键入  QUIT

    SQL 复制
    QUIT
  2. 要在容器中退出交互式命令提示,请键入  exit  退出交互式 Bash Shell 后,容器将继续运行。

从容器外连接

还可以从支持 SQL 连接的任何 Linux、Windows 或 macOS 外部工具连接到 Docker 计算机上的 SQL Server 实例。

以下步骤在容器外使用  sqlcmd 连接在容器中运行的 SQL Server。  这些步骤假定你已在容器外安装了 SQL Server 命令行工具。  使用其他工具时,同样的原则依然适用,但连接过程因工具而异。

  1. 查找承载容器的计算机的 IP 地址。  在 Linux 上,使用  ifconfig 或  ip addr。在 Windows 上,使用  ipconfig

  2. 对于本示例,请在客户端计算机上安装  sqlcmd 工具。  有关详细信息,请参阅 在 Windows 上安装 sqlcmd在 Linux 上安装 sqlcmd

  3. 运行 sqlcmd,指定 IP 地址和映射容器中的端口 1433 的端口。  本例中为主机上的相同端口 1433。  如果在主机上指定了不同的映射端口,则在此处使用它。

    bash 复制
    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
  4. 运行 Transact-SQL 命令。  完成后,键入  QUIT

连接到 SQL Server 的其他常见工具包括:

删除容器

如果想删除本教程中使用的 SQL Server 容器,请运行以下命令:

bash 复制
sudo docker stop sql1
sudo docker rm sql1

 警告

停止并永久删除容器会删除容器中的所有 SQL Server 数据。  如果你需要保留数据,请 在容器外创建并复制备份文件或使用 容器数据暂留技术

Docker 演示

尝试对 Docker 使用 SQL Server 容器映像后,你可能想知道如何 Docker 是如何用于改进开发和测试的。  下面的视频介绍如何在持续集成和部署方案中使用 Docker。

后续步骤

有关如何将数据库备份文件还原到容器中的教程,请参阅 在 Linux Docker 容器中还原 SQL Server 数据库  若要浏览其他方案(例如运行多个容器、数据暂留和故障排除),请参阅 在 Docker 上配置 SQL Server 容器映像

并且,请查看  mssql-docker GitHub 存储库,了解资源、反馈和已知问题。



在 Docker 上配置 SQL Server 容器映像


https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash


本文介绍如何通过 Docker 配置和使用  mssql-server-linux 容器映像

有关其他部署方案,请参阅:

此映像包含在 Linux 上运行的 SQL Server(基于 Ubuntu 16.04)。  它可与 Linux 上或用于 Mac/Windows 的 Docker 上的 Docker 引擎 1.8+ 配合使用。

 备注

本文专门重点介绍 mssql-server-linux 映像的使用。  虽然没有介绍 Windows 映像,但可在  mssql-server-windows Docker Hub 页上找到关于它的详细信息。

 重要

在选择运行 SQL Server 容器以用于生产用例之前,请查看  SQL Server 容器的支持策略,以确保在支持的配置上运行。

本视频时长 6 分钟,介绍了如何在容器上运行 SQL Server:

拉取并运行容器映像

若要拉取并运行 SQL Server 2017 和 SQL Server 2019 的 Docker 容器映像,请按照以下快速入门中的先决条件和步骤执行操作:

本配置文章在以下部分中提供其他使用方案。

运行基于 RHEL 的容器映像

SQL Server Linux 容器映像的文档指向基于 Ubuntu 的容器。  从 SQL Server 2019 开始,可使用基于 Red Hat Enterprise Linux (RHEL) 的容器。  在所有 docker 命令中,将容器存储库从 mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04 更改为 mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8 。

例如,以下命令拉取使用 RHEL 8 的 SQL Server 2019 容器的累积更新 1:

bash 复制
sudo docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8
PowerShell 复制
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU1-rhel-8

连接和查询

可从容器外部或内部对容器中的 SQL Server 进行连接和查询。  以下部分介绍这两种方案。

容器外的工具

可从支持 SQL 连接的任何 Linux、Windows 或 macOS 外部工具连接到 Docker 计算机上的 SQL Server 实例。 一些常用工具包括:

以下示例使用  sqlcmd 连接到在 Docker 容器中运行的 SQL Server。  连接字符串中的 IP 地址为运行容器的主机的 IP 地址。

bash 复制
sqlcmd -S 10.3.2.4 -U SA -P '<YourPassword>'
PowerShell 复制
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"

如果映射的主机端口不是默认的  1433,请将该端口添加到连接字符串中。  例如,如果在  docker run 命令中指定了  -p 1400:1433,则请通过显式指定端口 1400 来进行连接。

bash 复制
sqlcmd -S 10.3.2.4,1400 -U SA -P '<YourPassword>'
PowerShell 复制
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"

容器内的工具

从 SQL Server 2017 开始,容器映像中加入了  SQL Server 命令行工具  如果使用交互式命令提示符附加至此映像,则可在本地运行工具。

  1. 使用  docker exec -it 命令在运行的容器内部启动交互式 Bash Shell。  在以下示例中, e69e056c702d 是容器 ID。

    bash 复制
    docker exec -it e69e056c702d "bash"

     提示

    并非始终需要指定完整的容器 ID。只需指定能够唯一标识它的足够字符即可。  因此,在本示例中,使用  e6 或  e69 足矣,无需使用完整 ID。

  2. 在容器内部使用 sqlcmd 进行本地连接。  请注意,默认情况下,sqlcmd 不在路径之中,因此需要指定完整的路径。

    bash 复制
    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
  3. 使用 sqlcmd 完成操作后,键入  exit

  4. 使用交互式命令提示符完成操作后,键入  exit  退出交互式 Bash Shell 后,容器将继续运行。

运行多个 SQL Server 容器

Docker 支持在同一主机上运行多个 SQL Server 容器。  对要求在同一主机上运行多个 SQL Server 实例的方案使用此解决办法。  每个容器必须在不同的端口上公开自己。

以下示例创建两个 SQL Server 2019 容器,并将它们映射到主机的 1401 和 1402 端口 。

bash 复制
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
PowerShell 复制
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

现在,两个 SQL Server 实例在单独的容器内运行。  客户端可通过使用 Docker 主机的 IP 地址和容器的端口号连接到每个 SQL Server 实例。

bash 复制
sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'sqlcmd -S 10.3.2.4,1402 -U SA -P '<YourPassword>'
PowerShell 复制
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"

创建自定义容器

可以创建自己的  Dockerfile 来创建自定义 SQL Server 容器。  有关详细信息,请参阅 组合使用 SQL Server 和节点应用程序的演示  如果创建了自己的 Dockerfile,请注意前台进程,因为此进程控制容器的生命周期。  如果它退出,容器将关闭。  例如,如果想要运行脚本并启动 SQL Server,请确保 SQL Server 进程是最右侧的命令。 所有其他命令都会在后台运行。  以下命令在 Dockerfile 中对此进行说明:

bash 复制
/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr

如果撤销上一个示例中的命令,则容器将在 do-my-sql-commands.sh 脚本完成时关闭。

保留数据

即使通过  docker stop 和  docker start 重启容器,SQL Server 配置仍会更改,且数据库文件依然保留在容器中。  但是,如果使用  docker rm 删除容器,则会删除容器中的所有内容,包括 SQL Server 和数据库。  以下部分介绍如何使用 数据卷保留数据库文件(即使关联的容器已被删除)。

 重要

对于 SQL Server,了解 Docker 中的数据持久性至关重要。  除本部分讨论的内容外,请参阅有关 如何在 Docker 容器中管理数据的 Docker 文档。

将主机目录作为数据卷装载

第一种方法是在主机上将目录作为容器中的数据卷装载。  为此,请将  docker run 命令与  -v <host directory>:/var/opt/mssql 标志配合使用。  这允许在容器执行之间还原数据。

bash 复制
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
PowerShell 复制
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

借助此方法,还能共享和查看 Docker 外部的主机上的文件。

 重要

Windows 上的 Docker 的主机卷映射当前不支持映射完整的  /var/opt/mssql 目录 。  但是,你可以将子目录(如  /var/opt/mssql/data)映射到主机。

 重要

目前不支持 Mac 上的 Docker 与 Linux 映像上的 SQL Server 之间的主机卷映射 。  请改为使用数据卷容器。  此限制特定于  /var/opt/mssql 目录。  从已装载目录进行读取操作可正常运行。  例如,可在 Mac 上使用 –v 装载主机目录,并通过驻留在主机上的 .bak 文件还原备份。

使用数据卷容器

第二种方法是使用数据卷容器。  可通过指定卷名(而不是包含  -v 参数的主机目录)来创建数据卷容器。  以下示例创建名为  sqlvolume 的共享数据卷。

bash 复制
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v sqlvolume:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
PowerShell 复制
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v sqlvolume:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

 备注

早期版本的 Docker 不支持通过此方法在 run 命令中隐式创建数据卷。  在这种情况下,请使用 Docker 文档 创建和装载数据卷容器中列出的显式步骤。

即使停止并删除此容器,数据卷仍然存在。  可使用  docker volume ls 命令进行查看。

bash 复制
docker volume ls

如果随后创建另一个具有相同卷名的容器,则新容器会使用卷中包含的相同 SQL Server 数据。

若要删除数据卷容器,请使用  docker volume rm 命令。

 警告

如果删除数据卷容器,则该容器中的所有 SQL Server 数据都会被 永久删除。

备份和还原

除这些容器技术外,还可使用 SQL Server 标准备份和还原技术。  可通过备份文件来保护数据,或将数据移至其他 SQL Server 实例。  有关详细信息,请参阅 在 Linux 上备份和还原 SQL Server 数据库

 警告

如果要创建备份,请确保在容器外部创建或复制备份文件。  否则,一旦删除容器,备份文件也将随之删除。

在容器中执行命令

如果正在运行容器,则可从主机终端在容器内部执行命令。

若要获取容器 ID,请运行:

bash 复制
docker ps

若要在容器中启动 Bash 终端,请运行:

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

现在,可以像在容器内的终端上那样运行这些命令。  完成后,键入  exit  这将退出交互式命令会话,但容器会继续运行。

从容器复制文件

若要从容器复制文件,请使用以下命令:

bash 复制
docker cp <Container ID>:<Container path> <host path>

示例:

bash 复制
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
PowerShell 复制
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog

将文件复制到容器中

若要将文件复制到容器中,请使用以下命令:

bash 复制
docker cp <Host path> <Container ID>:<Container path>

示例:

bash 复制
docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
PowerShell 复制
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data

配置时区

若要在具有特定时区的 Linux 容器中运行 SQL Server,请配置  TZ 环境变量。  若要查找正确的时区值,请从 Linux bash 提示符运行  tzselect 命令:

bash 复制
tzselect

选择时区后, tzselect 显示类似以下内容的输出:

bash 复制
The following information has been given:
        United States
        Pacific
Therefore TZ='America/Los_Angeles' will be used.

可使用此信息在 Linux 容器中设置相同的环境变量。  以下示例介绍如何在  Americas/Los_Angeles 时区的容器中运行 SQL Server:

bash 复制
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -e 'TZ=America/Los_Angeles'\
   -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
PowerShell 复制
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `   -p 1433:1433 --name sql1 `   -e "TZ=America/Los_Angeles" `   -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

运行特定 SQL Server 容器映像

在某些情况下,可能不希望使用最新的 SQL Server 容器映像。  若要运行特定 SQL Server 容器映像,请使用以下步骤:

  1. 确定想要使用的版本的 Docker  标记  若要查看可用标记,请参阅  mssql-server-linux Docker Hub 页

  2. 使用标记拉取 SQL Server 容器映像。  例如,若要拉取 RC1 映像,请将以下命令中的  <image_tag> 替换为  rc1

    bash 复制
    docker pull mcr.microsoft.com/mssql/server:<image_tag>
  3. 若要使用该映像运行新容器,请在  docker run 命令中指定标记名称。  在以下命令中,将  <image_tag> 替换为想要运行的版本。

    bash 复制
    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    PowerShell 复制
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>

这些步骤也可用于降级现有容器。  例如,你可能会希望回滚或降级正在运行的容器以进行故障排除或测试。  若要降级正在运行的容器,必须对数据文件夹使用持久性技术。  按照 升级部分所述的相同步骤进行操作,但在运行新容器时指定早期版本的标记名称。

检查容器版本

如果想要了解正在运行的 docker 容器中的 SQL Server 的版本,请运行以下命令以显示它。  将  <Container ID or name> 替换为目标容器 ID 或名称。  将  <YourStrong!Passw0rd> 替换为 SA 登录名的 SQL Server 密码。

bash 复制
sudo docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '<YourStrong!Passw0rd>' \
   -Q 'SELECT @@VERSION'
PowerShell 复制
docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd `   -S localhost -U SA -P "<YourStrong!Passw0rd>" `   -Q 'SELECT @@VERSION'

还可以标识目标 docker 容器映像的 SQL Server 版本和生成号。  以下命令显示 mcr.microsoft.com/mssql/server:2017-latest 映像的 SQL Server 版本和生成信息 。  它通过运行具有环境变量  PAL_PROGRAM_INFO=1 的新容器来实现此目的。  生成的容器会立即退出,且  docker rm 命令会将其删除。

bash 复制
sudo docker run -e PAL_PROGRAM_INFO=1 --name sqlver \
   -ti mcr.microsoft.com/mssql/server:2017-latest && \
   sudo docker rm sqlver
PowerShell 复制
docker run -e PAL_PROGRAM_INFO=1 --name sqlver `   -ti mcr.microsoft.com/mssql/server:2017-latest; `
   docker rm sqlver

上一个命令显示类似以下输出的版本信息:

Text 复制
sqlservr
  Version 14.0.3029.16
  Build ID ee3d3882f1c48a7a7e590a620153012eaedc2f37143d485df945a079b9d4eeea
  Build Type release
  Git Version 65d42c4
  Built at Sat Jun 16 01:20:11 GMT 2018
PAL
  Build ID 60cfcb134bbae96d311f6a4f56aeb5a685b3809de80bcb61ec587a8f58b555eb
  Build Type release
  Git Version 21a4c11
  Built at Sat Jun 16 01:18:53 GMT 2018
Packages
  system.sfp                    6.2.9200.1,21a4c1178,
  system.common.sfp             10.0.15063.540
  system.certificates.sfp       6.2.9200.1,21a4c1178,
  system.netfx.sfp              4.6.1590.0
  secforwarderxplat.sfp         14.0.3029.16
  sqlservr.sfp                  14.0.3029.16
  sqlagent.sfp                  14.0.3029.16

升级容器中的 SQL Server

若要使用 Docker 升级容器映像,请先确定升级版本的标记。  使用  docker pull 命令从注册表中拉取此版本:

bash 复制
docker pull mcr.microsoft.com/mssql/server:<image_tag>

此操作会更新创建的任何新容器的 SQL Server 映像,但不会更新任何正在运行的容器中的 SQL Server。  为此,必须使用最新的 SQL Server 容器映像创建新容器,并将数据迁移到该新容器。

  1. 确保为现有 SQL Server 容器使用一种 数据持久性技术  这样便可以启动具有相同数据的新容器。

  2. 使用  docker stop 命令停止 SQL Server 容器。

  3. 使用  docker run 创建新的 SQL Server 容器,并指定映射主机目录或数据卷容器。  确保使用特定标记进行 SQL Server 升级。  新容器现在使用新版 SQL Server 和现有 SQL Server 数据。

     重要

    目前仅支持在 RC1、RC2 和 GA 之间升级。

  4. 在新容器中验证数据库和数据。

  5. 使用  docker rm 删除旧容器(可选)。

生成并运行非根 SQL Server 2017 容器

按照以下步骤生成以  mssql(非根)用户身份启动的 SQL Server 2017 容器。

 备注

SQL Server 2019 容器自动以非根身份启动,因此以下步骤仅适用于 SQL Server 2017 容器,默认情况下,该容器以根身份启动。

  1. 下载 适用于非根 SQL Server 容器的示例dockerfile,并将其另存为  dockerfile

  2. 在 dockerfile 目录的上下文中运行以下命令,生成非根 SQL Server 容器:

bash 复制
cd <path to dockerfile>
docker build -t 2017-latest-non-root .
  1. 启动容器。
bash 复制
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword@" --cap-add SYS_PTRACE --name sql1 -p 1433:1433 -d 2017-latest-non-root

 备注

非根 SQL Server 容器需要  --cap-add SYS_PTRACE 标志来生成用于排除故障的转储。

  1. 检查是否以非根用户的身份运行容器:

docker 执行到容器中。

bash 复制
docker exec -it sql1 bash

运行  whoami,这将返回容器中运行的用户。

bash 复制
whoami

在主机上以其他非根用户的身份运行容器

若要以其他非根用户的身份运行 SQL Server 容器,请将 -u 标志添加到 docker run 命令。  非根容器具有以下限制:必须作为根组的一部分运行,除非已将卷装载到非根用户可以访问的“/var/opt/mssql”。  根组不向非根用户授予任何额外的根权限。

以具有 UID 4000 的用户身份运行

可使用自定义 UID 启动 SQL Server。  例如,以下命令使用 UID 4000 启动 SQL Server:

bash 复制
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" --cap-add SYS_PTRACE -u 4000:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

 警告

确保 SQL Server 容器具有命名用户,如“mssql”或“root”,否则 SQLCMD 将无法在容器中运行。  可通过在容器中运行  whoami 来检查是否以命名用户的身份运行 SQL Server 容器。

以根用户的身份运行非根容器

如果需要,以根用户的身份运行非根容器。  这还会将所有文件权限自动授予容器,因为容器具有更高的特权。

bash 复制
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" -u 0:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

在主机计算机上以用户的身份运行

可使用以下命令在主机计算机上以现有用户身份启动 SQL Server:

bash 复制
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" --cap-add SYS_PTRACE -u $(id -u myusername):0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

以其他用户和组的身份运行

可使用自定义用户和组启动 SQL Server。  在此示例中,已装载的卷具有为主机计算机上的用户或组配置的权限。

bash 复制
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" --cap-add SYS_PTRACE -u (id -u myusername):(id -g myusername) -v /path/to/mssql:/var/opt/mssql -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

为非根容器配置持久存储权限

若要允许非根用户访问已装载的卷上的 DB 文件,请确保运行容器所用的用户/组可以接触持久文件存储。

可通过此命令获取数据库文件的当前所有权。

bash 复制
ls -ll <database file dir>

如果 SQL Server 无权访问持久数据库文件,请运行以下命令之一。

授予对 DB 文件的根组读/写访问权限

授予对以下目录的根组权限,使非根 SQL Server 容器有权访问数据库文件。

bash 复制
chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>

将非根用户设置为文件的所有者。

这可以是默认的非根用户,也可以是要指定的任何其他非根用户。  在此示例中,我们将 UID 10001 设置为非根用户。

bash 复制
chown -R 10001:0 <database file dir>

更改默认文件位置

添加  MSSQL_DATA_DIR 变量以在  docker run 命令中更改数据目录,然后将卷装载到容器的用户有权访问的位置。

bash 复制
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

故障排除

以下部分提供关于在容器中运行 SQL Server 的故障排除建议。

Docker 命令错误

如果遇到任何  docker 命令错误,请确保 Docker 服务正在运行,并尝试通过提升的权限运行。

例如,在 Linux 上运行  docker 命令时可能会遇到以下错误:

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

如果在 Linux 上遇到此错误,请尝试对相同的命令加上  sudo 前缀,然后再运行。  如果失败,请验证 Docker 服务是否正在运行;如果没有,请启动它。

bash 复制
sudo systemctl status docker
sudo systemctl start docker

在 Windows 上,验证并确保以管理员身份启动 PowerShell 或命令提示符。

SQL Server 容器启动错误

如果 SQL Server 容器无法运行,请尝试以下测试:

  • 如果遇到  “无法在网桥上创建终结点 CONTAINER_NAME。启动代理时出错: 侦听 tcp 0.0.0.0:1433 绑定: 地址已被使用。” 等错误,这表示你正尝试将容器端口 1433 映射到某个正在使用的端口。  在主机上本地运行 SQL Server 时可能发生此错误。  如果启动两个 SQL Server 容器,并尝试将它们映射到同一主机端口,也可能发生此错误。  如果发生此错误,请使用  -p 参数将容器端口 1433 映射到不同的主机端口。  例如:
bash 复制
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04`.
PowerShell 复制
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1400:1433 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04`.
  • 如果在尝试启动容器时遇到  “在 unix:///var/run/docker.sock 尝试连接到 Docker 守护程序套接字时获取权限被拒绝:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.30tdout=1&tail=all: dial unix /var/run/docker.sock: connect: 权限被拒绝” 等错误,请将用户添加到 Ubuntu 中的 docker 组。  然后注销并重新登录,因为此更改将影响新会话。

    bash 复制
      usermod -aG docker $USER
  • 检查是否有任何来自容器的错误消息。

    bash 复制
    docker logs e69e056c702d
  • 确保符合快速入门文章的 先决条件部分中指定的最低内存和磁盘要求。

  • 如果使用任何容器管理软件,请确保它支持以根身份运行的容器进程。  容器中的 sqlservr 进程以根身份运行。

  • 查看  SQL Server 安装和错误日志

启用转储捕获

如果 SQL Server 进程在容器内失败,则应创建一个启用了  SYS_PTRACE 的新容器。  此操作可添加用于跟踪进程的 Linux 功能,该功能是在出现异常时创建转储文件所必需的。  支持人员可以使用转储文件来帮助对问题进行故障排除。  以下 docker run 命令可启用此功能。

bash 复制
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-GA-ubuntu-16.04

SQL Server 连接故障

如果无法连接到在容器中运行的 SQL Server 实例,请尝试以下测试:

  • 通过查看  docker ps -a 输出的“状态”列,确保 SQL Server 容器正在运行 。  如果未在运行,则使用  docker start <Container ID> 启动它。

  • 如果映射到非默认主机端口(非 1433),请确保在连接字符串中指定端口。  可在  docker ps -a 输出的“端口”列中查看端口映射 。  例如,以下命令将 sqlcmd 连接至正在侦听端口 1401 的容器:

    bash 复制
    sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
    PowerShell 复制
    sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
  • 如果将  docker run 和现有的映射数据卷或数据卷容器配合使用,SQL Server 会忽略  MSSQL_SA_PASSWORD的值。  改为使用来自 SQL Server 数据(数据卷或数据卷容器中)的预配置 SA 用户密码。  验证所使用的 SA 密码是否与附加到的数据相关联。

  • 查看  SQL Server 安装和错误日志

SQL Server 可用性组

如果将 Docker 与 SQL Server 可用性组配合使用,则还有两个附加要求。

  • 映射用于副本通信的端口(默认为 5022)。  例如,将  -p 5022:5022 指定为  docker run 命令的一部分。

  • 使用  docker run 命令的  -h YOURHOSTNAME 参数显式设置容器主机名。  配置可用性组时会使用此主机名。 如果不使用  -h 来指定它,它会默认使用容器 ID。

SQL Server 安装和错误日志

可在  /var/opt/mssql/log 中查看 SQL Server 安装和错误日志。  如果容器未在运行,请先启动它。  然后使用交互式命令提示符来检查日志。

bash 复制
docker start e69e056c702d
docker exec -it e69e056c702d "bash"

从容器内的 bash 会话运行以下命令:

bash 复制
cd /var/opt/mssql/logcat setup*.logcat errorlog

 提示

如果在创建容器时将主机目录装载到了  /var/opt/mssql,可改为在主机上映射路径的  log 子目录中进行查找。



使用Docker运行SQL Server

现在.net core已经跨平台了,大家也都用上了linux用上了docker。跟.net经常配套使用的SQL SERVER以前一直是windows only,但是从SQL Server 2017开始已经支持运行在docker上,也就说现在SQL Serer已经可以运行在linux下了。
下面在Ubuntu 16.4上演示安装并使用SQL Server 2019-CTP3.2

SQL Server in Docker

sudo docker pull mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu

使用docker pull命令从docker hub拉取sqlserver 2019-ctp3.2的镜像

sudo mkdir /hd2/sqlserver2019_data
sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=dev@123," -p 14330:1433 --name sqlserver2019 -v /hd2/sqlserver2019_data:/var/opt/mssql  -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu

使用docker run 命令启动容器,其中要注意的是使用-v参数指定了sqlserver2019_data目录挂载到容器的/var/opt/mssql目录,这个目录是用来存储数据库文件的,所以最好挂载到外容器外部,避免因为不小心删除容器而丢失数据

sudo docker ps -a

使用docker ps 命令查看容器运行情况,可以看到sqlserver2019正在运行

使用命令行连接SQL Server

sudo docker exec -it sqlserver2019 "bash"

使用docker exec命令登录到容器内部执行命令

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "dev@123,"

在容器内部执行命令,打开sqlcmd
打开sqlcmd之后我们就可以进行一些数据库的操作了,比如创建数据库,创建表,查询数据等。

CREATE DATABASE TEST_DBGOUSE TEST_DBGOCREATE TABLE Table1 (ID INT, NAME NVARCHAR(50))GOInsert Into Table1 Values (0, 'agile')

创建TEST_DB数据库;创建表Table1;插入一行数据;查询表数据

我们使用docker运行的SQL Server同样可以使用Sql Server Management Studio来管理。

使用服务器ip加端口连接成功后,可以看到刚才新建的数据库TEST_DB跟表TABLE1还有里面的数据都在。能使用SSMS管理后就简单多了跟使用SQL Server其他版本没啥区别。

至此SQL Server in Docker的基本操作演示的差不多了,还有更多的高级功能比如配置故障转移集群,复制订阅,Always On等功能跟windows环境配置还有点区别大家可以自己尝试一下。

Email:kklldog@gmail.com 








About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2020-03-01 06:00 ~ 2020-03-31 24:00 在西安完成

● 最新修改时间:2020-03-01 06:00 ~ 2020-03-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2682222/,如需转载,请注明出处,否则将追究法律责任。

全部评论
【QQ:646634621】【微信:lhrbestxh】【微信公众号:DB宝】【11g、12c OCM】【QQ群:230161599、618766405】【《数据库笔试面试宝典》作者】【OCP、OCM、高可用(RAC+DG+OGG)、MySQL培训班已开讲,只讲实用内容】

注册时间:2012-09-23

  • 博文量
    1494
  • 访问量
    8672525