外包公司开发的系统,.net framework+sql server+redis,公司要求容器化部署。但是它们Container系统都不一样
| windows Container | linux Container |
.net core | √ | √ |
.net framework | √ | |
sql server | √ | √ |
redis | | √ |
这里的坑在.net framework只能使用windows Container,查了很多资料,没有人这个干过,基本都是.net core+linux Container,走了很多弯路终于成功在windows server2019 DataCenter下搞定。
结构如下,宿主机采用windows,把redis放在主机里面,容器化.net和mssql
记录一下,留待有缘人。
一、server2019环境安装docker,使用阿里datacenter 2019版本。如果是虚拟机自己安装的有个2019版本有问题,开始前最好升级补丁
1.1、安装SSH:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
设定服务器自动启动
Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic
Start-Service sshd
Start-Service ssh-agent
1.2、安装docker
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
docker -v
启动
Start-Service docker
这里重启一下
1.3、配置阿里加速器:
C:\ProgramData\docker\config\daemon.json
{
"registry-mirrors": [ "https://cd6xo91e.mirror.aliyuncs.com"]
}
1.4、安装docker-compose
Invoke-WebRequest https://github.com/docker/compose/releases/download/1.25.4/docker-compose-Windows-x86_64.exe -UseBasicParsing -OutFile $env:ProgramFiles\docker\docker-compose.exe
二、.net framework容器化
直接使用microsoft提供的镜像,点击了解https://hub.docker.com/_/microsoft-dotnet-framework
三、自定义路径的数据库容器化
3.1、通过创建数据库准备数据库文件
- 创建一个自定义路径的数据库XD
USE master
GO
CREATE DATABASE XD ON PRIMARY
(
NAME='xiding_data',--主文件逻辑文件名
FILENAME='c:\sqldb\xiding_data.mdf', --主文件文件名
SIZE=5mb,--系统默认创建的时候会给主文件分配初始大小
MAXSIZE=500MB,--主文件的最大值
filegrowth=15%-- 主文件的增长幅度
)
LOG ON
(
name='xiding_log',--日志文件逻辑文件名
filename='c:\sqldb\xiding_log.ldf',--日志文件屋里文件名
SIZE=5MB,--日志文件初始大小
filegrowth=0 --启动自动增长
)
GO
- 创建数据表
USE XD
create table users
(
id int identity(1,1) not null primary key,
name nvarchar(50) null,
age nvarchar(50) null,
)
go
- 随便加点数据
3.2、或者通过备份数据恢复得到数据库文件
- sqlcmd语句如下
--获取备份文件的逻辑文件名LogicalName
RESTORE FILELISTONLY FROM DISK='c:\sqldb\XidingErp.bak'
VS里面运行结果是这样:
- 恢复语句:
-- 通过逻辑文件名恢复数据
RESTORE DATABASE XiDing FROM DISK='c:\sqldb\XidingErp.bak'
WITH
MOVE 'SmallLoan' TO 'c:\sqldb\xiding.mdf',
MOVE 'SmallLoan_log' TO 'c:\sqldb\xiding_l.ldf'
最终得到数据库文件c:\sqldb\xiding.mdf和c:\sqldb\xiding_l.ldf。
3.3、mssql docker附加宿主机数据库
挂载宿主机数据库目录:把数据库文件复制到宿主机目录,通过volumes挂载这个目录到docker里面。
附加数据库:在mssql docker里面将上面数据库文件附加进去,docker-compose.yml里主要添加以下:
volumes:
- ./sql:C:\sqldb
environment:
attach_dbs: '[{"dbName":"XD","dbFiles":["c:\\sqldb\\xiding_data.mdf","c:\\sqldb\\xiding_log.ldf"]}]'
四,redis安装和测试
4.1、安装redis在宿主机里,https://redis.io/download
4.2、修改配置文件redis.windows-service.conf
- 注释掉中的bind 127.0.0.1这一行(在前面加#)
- 同文件中将protected-mode yes 改成 protected-mode no
4.3、测试:
启动应用程序,由于应用在docker里面,通过docker-compose映射本机目录过去,里面有redis-cli.exe文件,用于在cmd下测试redis
volumes:
- ./redis:c:/redis
进入docker测试链接,ipconfig 获取宿主机的 ip为172.25.16.1,那么通过容器链接宿主机的redis如下:
redis-cli -h 172.25.16.1 -p 6379 -a 12345
set name llxx
get name
五,最后的docker-compose.yml
version: "3.4"
services:
weifu_asp:
image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp
environment:
VIRTUAL_HOST: http://www.xxx.com
links:
- weifu_db
ports:
- "80:80"
volumes:
- ./www:c:/inetpub/wwwroot
- ./redis:c:/redis
container_name: weifu_asp
weifu_db:
image: christianacca/mssql-server-windows-express
volumes:
- ./sql:C:\sqldb
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Sa111111
attach_dbs: '[{"dbName":"XD","dbFiles":["c:\\sqldb\\xiding_data.mdf","c:\\sqldb\\xiding_log.ldf"]}]'
ports:
- "9000:1433"
container_name: weifu_db
注意:attach_dbs: '[{"dbName":"XD","dbFiles":["c:\\sqldb\\xiding_data.mdf","c:\\sqldb\\xiding_log.ldf"]}]'这句是附加数据库的,这里目录一定要用 双斜杠,害死人了啊
1、应用位置 ./www下
2、redis连接使用:172.25.16.1:6379
3、mssql连接使用:
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=weifu_db;Initial Catalog=XD;Persist Security Info=True;User ID=sa;Password=123456;"
providerName="System.Data.SqlClient" />
</connectionStrings>
六、添加ssl
ssl只能通过powershell脚本加载了。先上Dockerfile
FROM mcr.azk8s.cn/dotnet/framework/samples:aspnetapp
WORKDIR /inetpub/wwwroot
EXPOSE 80
EXPOSE 443
COPY ./https c:/https
COPY ./redis c:/redis
RUN powershell.exe c:/https/certificate.ps1
certificate.ps1
import-module webadministration
$hostName = "www.xxx.com"
xxx
$pfxCertPath = "C:\https\xxx.com.pfx"
$pfxCertPwdPath = "C:\https\xxx.com.txt"
$certImportPwd = Get-Content $pfxCertPwdPath | ConvertTo-SecureString -AsPlainText -Force
# import new ssl
$cert = Import-PfxCertificate -FilePath $pfxCertPath -CertStoreLocation "Cert:\LocalMachine\My" -Password $certImportPwd
cd iis:
new-item -path IIS:\SslBindings\0.0.0.0!443 -value $cert
New-WebBinding -Name "Default Web Site" -IP "*" -Port 443 -Protocol https
最后修改docker-compose.yml,同时为了固定redis访问地址,设置ip
version: "3.4"
services:
weifu_asp:
build: ./weifu_asp
links:
- weifu_db
ports:
- 80:80
- 443:443
volumes:
- ./www:c:/inetpub/wwwroot
container_name: weifu_asp
networks:
hx_net:
ipv4_address: 172.25.16.2
weifu_db:
image: christianacca/mssql-server-windows-express
volumes:
- ./sql:C:\sqldb
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Sa111111
attach_dbs: '[{"dbName":"XiDing","dbFiles":["c:\\sqldb\\xiding_data.mdf","c:\\sqldb\\xiding_log.ldf"]}]'
ports:
- "9000:1433"
container_name: weifu_db
networks:
hx_net:
ipv4_address: 172.25.16.3
networks:
hx_net:
ipam:
config:
- subnet: 172.25.16.0/16
七、其它注意及解释
1、windows下的.net framework(docker)
windows主机的docker支持.net framework和.net core;linux主机的docker只支持.net core
就是说.net framework只能在windows主机里的docker下使用,但是这个超级大:docker pull mcr.microsoft.com/dotnet/framework/samples:dotnetapp
2、windows下的sql server也叫mssql(docker)
windows下的sql server超级大,基本下载不下来microsoft/mssql-server-windows-express,可以用christianacca/mssql-server-windows-express替代
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Sa111111' -p 1433:1433 -v c:\sqldb:c:\sqldb --name mssql -d christianacca/mssql-server-windows-express
不能映射原始数据库的文件夹到主机,否则会一直提示失败,原因不知,只能映射是其他文件夹,比如c:\sqldb,最后再附加到数据库。
在docker-compose.yml里面通过 volumes映射该目录到主机,通过attach_dbs附加数据库到master。
volumes:
- ./sql:C:\sqldb
environment:
attach_dbs: '[{"dbName":"XD","dbFiles":["c:\\sqldb\\xiding_data.mdf","c:\\sqldb\\xiding_log.ldf"]}]'
七,测试
参考另一篇文章有完整的测试文件和过程