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

本文是基于为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 <[email protected]>

# 重置系统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

猜你喜欢

转载自blog.csdn.net/watermelonbig/article/details/90585157
今日推荐