Dockerfile:设计一个满足开发测试需求的SQLServer容器镜像

    xiaoxiao2025-11-04  24

    本文是基于为k8s平台上,开发测试业务设计的一个运行微软SQL Server 2017数据库服务的容器镜像。容器镜像设计重点是满足开发测试工作的使用需求,其次是尽量控制镜像文件大小,最终交付的镜像文件体积为1.82GB。

    本示例是使用CentOS7作为基础镜像,安装和配置了SQL Server 2017服务,数据库服务配置为采用developer许可。

    注意:由于CentOS7中使用systemctl工具管理软件服务的启停,而在容器未获得特权容器授权的情况下,执行systemctl命令时会报错Failed to get D-Bus connection: Operation not permitted。出于安全考虑,我们不希望给容器打开特权容器的授权,所以在本示例中会另外提供管理mssql-server服务启停的方法说明。

    Dockerfile文件

    ########################################################### FROM centos:7 MAINTAINER watermelonbig <watermelonbig@163.com> # 重置系统root密码 RUN echo "root:YYtest2019" | chpasswd # 配置yum源并安装基础工具包 RUN curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo;\ curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo RUN yum clean all; \ yum makecache; \ yum install -y sudo which openssh-server openssh-clients rsync wget iproute net-tools sysstat lsof tcpdump telnet iputils lrzsz zip unzip kde-l10n-Chinese # 中文支持和时区设置 RUN sed -i 's/LANG="en_US.UTF-8"/LANG="zh_CN.UTF-8"/g' /etc/locale.conf;\ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 必要的系统参数调优 RUN echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf;\ echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf;\ echo 'net.ipv4.ip_local_port_range = 1024 65000' >> /etc/sysctl.conf;\ echo 'vm.swappiness = 10' >> /etc/sysctl.conf;\ echo '* soft nofile 65535' >> /etc/security/limits.conf;\ echo '* hard nofile 65535' >> /etc/security/limits.conf;\ echo "session required /lib64/security/pam_limits.so" >> /etc/pam.d/login;\ sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config;\ sed -i '/UseDNS yes/s/.*/UseDNS no/g' /etc/ssh/sshd_config RUN ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key;\ ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key RUN chmod u+s /usr/sbin/lsof;\ chmod u+s /usr/sbin/tcpdump # 采用离线方式安装 COPY ./mssql-server-14.0.3015.40-1.x86_64.rpm . COPY ./mssql-server-agent-14.0.3015.40-1.x86_64.rpm . # 拷贝一份静默安装mssql-server服务的shell脚本 COPY ./install_sqlserver.sh . # 安装并配置mssql-server RUN bash install_sqlserver.sh RUN /opt/mssql/bin/mssql-conf set memory.memorylimitmb 7000 RUN rm -rf mssql-server-14.0.3015.40-1.x86_64.rpm;\ rm -rf mssql-server-agent-14.0.3015.40-1.x86_64.rpm;\ rm -rf install_sqlserver.sh ENV LANG=zh_CN.UTF-8 # 提供ssh登录管理的支持 CMD ["/usr/sbin/sshd","-D"] EXPOSE 1433 22

    一份静默方式安装Linux SQL Server 2017数据库的脚本

    #!/bin/bash -e # Use the following variables to control your install: # Password for the SA user (required) MSSQL_SA_PASSWORD='YY12345678!' # Product ID of the version of SQL server you're installing # Must be evaluation, developer, express, web, standard, enterprise, or your 25 digit product key # Defaults to developer MSSQL_PID='developer' # Install SQL Server Agent (recommended) SQL_INSTALL_AGENT='y' # Install SQL Server Full Text Search (optional) # SQL_INSTALL_FULLTEXT='y' # Create an additional user with sysadmin privileges (optional) #SQL_INSTALL_USER='yytester' #SQL_INSTALL_USER_PASSWORD='yy123456!' if [ -z $MSSQL_SA_PASSWORD ] then echo Environment variable MSSQL_SA_PASSWORD must be set for unattended install exit 1 fi #echo Adding Microsoft repositories... #curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo #curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo echo Installing SQL Server... yum localinstall -y mssql-server-14.0.3015.40-1.x86_64.rpm echo Running mssql-conf setup... MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD \ MSSQL_PID=$MSSQL_PID \ /opt/mssql/bin/mssql-conf -n setup accept-eula echo Installing mssql-tools and unixODBC developer... ACCEPT_EULA=Y yum install -y mssql-tools unixODBC-devel # Add SQL Server tools to the path by default: echo Adding SQL Server tools to your path... echo PATH="$PATH:/opt/mssql-tools/bin" >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc # Optional SQL Server Agent installation: if [ ! -z $SQL_INSTALL_AGENT ] then echo Installing SQL Server Agent... yum localinstall -y mssql-server-agent-14.0.3015.40-1.x86_64.rpm fi # Optional SQL Server Full Text Search installation: if [ ! -z $SQL_INSTALL_FULLTEXT ] then echo Installing SQL Server Full-Text Search... yum install -y mssql-server-fts fi # Optional new user creation: if [ ! -z $SQL_INSTALL_USER ] && [ ! -z $SQL_INSTALL_USER_PASSWORD ] then echo Creating user $SQL_INSTALL_USER /opt/mssql-tools/bin/sqlcmd \ -S localhost \ -U SA \ -P $MSSQL_SA_PASSWORD \ -Q "CREATE LOGIN [$SQL_INSTALL_USER] WITH PASSWORD=N'$SQL_INSTALL_USER_PASSWORD', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON; ALTER SERVER ROLE [sysadmin] ADD MEMBER [$SQL_INSTALL_USER]" fi echo Done! MSSQL_SA_PASSWORD参数指定数据库系统管理账号sa的密码;MSSQL_PID参数指定sql server使用哪一种许可授权;SQL_INSTALL_AGENT同步安装一个客户端管理工具;yum localinstall -y mssql-server-14.0.3015.40-1.x86_64.rpm,离线方式安装数据库服务端软件包,安装过程中依赖的其他工具包则直接从线上yum源下载安装;MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD MSSQL_PID=$MSSQL_PID /opt/mssql/bin/mssql-conf -n setup accept-eula ,对sqlserver进行初始化配置,这个步骤中会有一个调用systemctl时报错D-Bus无法访问的告警消息,忽略即可;

    注意:上面的静默安装脚本中有部分功能我们未启用,部分原因是暂时使用不到,部分原因是在这个配置阶段执行这些配置和启动这些服务均会失败,需要延后到使用镜像创建出业务容器后再行配置。

    创建容器镜像

    # ls Dockerfile install_sqlserver.sh mssql-server-14.0.3015.40-1.x86_64.rpm mssql-server-agent-14.0.3015.40-1.x86_64.rpm # docker build -t centos7-sqlserver2017 .

    注意:由于镜像制作过程中,涉及到很多软件包的下载、安装和配置,所以对创建镜像过程中打印的错误信息需要特别的留意。除前文提到过的D-Bus无法访问的报错可以忽略外,有几个与获取软件包签名文件相关的warning信息也可以忽略。如果发现在下载软件包时有发生服务域名解析失败、软件包安装失败或未安装,或是其它error类的报错信息,都需要特别注意,这些均会导致最终的服务安装问题。如果是因为访问centos或微软的yum安装源问题引发的报错,大概率是受网络延时影响的,在报错后,可以反复重试几次创建命令。

    创建业务容器后的数据库配置

    由于业务容器缺少使用systemctl工具所需的特权,所以我们不能使用systemctl管理mssql-server服务的启停。

    手动启停sqlserver服务的方法

    sqlserver 2017服务手动启动方法:

    sudo su - mssql -c "/opt/mssql/bin/sqlservr &"

    停止:

    ps -ef|grep mssql|grep -v grep|awk '{print $2}'|xargs kill

    配置sqlserver数据库的管理用户账号

    管理员账号是:sa/YY12345678!

    密码是在静默安装脚本中指定的

    使用管理员账号登录数据库:

    sqlcmd -S localhost -U SA -P 'YY12345678!'

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

    继续创建一个普通用户账号,作为业务程序使用的账号: yytester/yy123456!

    手动创建普通用户账号yytester,并授予sysadmin权限。 请在确认启动了mssql-server服务后,拷贝下面4行命令并在系统中执行即可:

    MSSQL_SA_PASSWORD='YY12345678!' SQL_INSTALL_USER='yytester' SQL_INSTALL_USER_PASSWORD='yy123456!' /opt/mssql-tools/bin/sqlcmd \ -S localhost \ -U SA \ -P $MSSQL_SA_PASSWORD \ -Q "CREATE LOGIN [$SQL_INSTALL_USER] WITH PASSWORD=N'$SQL_INSTALL_USER_PASSWORD', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON; ALTER SERVER ROLE [sysadmin] ADD MEMBER [$SQL_INSTALL_USER]"

    sqlserver建库建表和查询的方法

    建库

    CREATE DATABASE TestDB SELECT Name from sys.Databases GO

    建表

    USE TestDB CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT) INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154); GO

    查询表数据

    SELECT * FROM Inventory WHERE quantity > 152; GO

    参考资料:https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-2017

    最新回复(0)