• Windows2019系统用Docker容器部署.NET+Sql server+redis+ssl完整流程和解释


    外包公司开发的系统,.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:ProgramDatadockerconfigdaemon.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:ProgramFilesdockerdocker-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:sqldbxiding_data.mdf', --主文件文件名
    SIZE=5mb,--系统默认创建的时候会给主文件分配初始大小
    MAXSIZE=500MB,--主文件的最大值
    filegrowth=15%-- 主文件的增长幅度
    )
    LOG ON
    (
    name='xiding_log',--日志文件逻辑文件名
    filename='c:sqldbxiding_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:sqldbXidingErp.bak'

      VS里面运行结果是这样:

      

    •   恢复语句:
    -- 通过逻辑文件名恢复数据
    RESTORE DATABASE XiDing FROM DISK='c:sqldbXidingErp.bak'
    WITH 
       MOVE 'SmallLoan' TO 'c:sqldbxiding.mdf',
       MOVE 'SmallLoan_log' TO 'c:sqldbxiding_l.ldf'

    最终得到数据库文件c:sqldbxiding.mdf和c:sqldbxiding_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:httpsxxx.com.pfx"
    $pfxCertPwdPath = "C:httpsxxx.com.txt"
    $certImportPwd = Get-Content $pfxCertPwdPath | ConvertTo-SecureString -AsPlainText -Force
    
    # import new ssl 
    $cert = Import-PfxCertificate -FilePath $pfxCertPath -CertStoreLocation "Cert:LocalMachineMy" -Password $certImportPwd
    
    cd iis:
    new-item -path IIS:SslBindings0.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"]}]'

    七,测试

    参考另一篇文章有完整的测试文件和过程

  • 相关阅读:
    双态运维分享之:业务场景驱动的服务型CMDB
    双态运维分享之二: 服务型CMDB的消费场景
    双态运维:如何让CMDB配置维护更贴近人性
    CMDB经验分享之 – 剖析CMDB的设计过程
    APM最佳实践: 诊断平安城市视频网性能问题
    先定一个运维小目标,比方监控它10000台主机
    大规模Docker平台自动化监控之路
    少走冤枉路!带你走过SNMP的那些坑
    完整性约束
    数据类型
  • 原文地址:https://www.cnblogs.com/lxsky/p/12690708.html
Copyright © 2020-2023  润新知