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:\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"]}]'

七,測試

參考另一篇文章有完整的測試文件和過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM