Dockerfile:设计一个满足开发测试需求的SQLServer容器镜像
本文是基于为k8s平台上,开发测试业务设计的一个运行微软SQL Server 2017数据库服务的容器镜像。容器镜像设计重点是满足开发测试工作的使用需求,其次是尽量控制镜像文件大小,最终交付的镜像文件体积为1.82GB。本示例是使用CentOS7作为基础镜像,安装和配置了SQL Server 2017服务,数据库服务配置为采用developer许可。注意:由于CentOS7中使用system...
本文是基于为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)