本文是基于为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
MSSQL_SA_PASSWORD
='YY12345678!'
MSSQL_PID
='developer'
SQL_INSTALL_AGENT
='y'
if [ -z
$MSSQL_SA_PASSWORD ]
then
echo Environment variable MSSQL_SA_PASSWORD must be
set for unattended
install
exit 1
fi
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
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
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
if [ ! -z
$SQL_INSTALL_FULLTEXT ]
then
echo Installing SQL Server Full-Text Search
...
yum
install -y mssql-server-fts
fi
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无法访问的告警消息,忽略即可;
注意:上面的静默安装脚本中有部分功能我们未启用,部分原因是暂时使用不到,部分原因是在这个配置阶段执行这些配置和启动这些服务均会失败,需要延后到使用镜像创建出业务容器后再行配置。
创建容器镜像
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
注意:由于镜像制作过程中,涉及到很多软件包的下载、安装和配置,所以对创建镜像过程中打印的错误信息需要特别的留意。除前文提到过的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