新版的Windows 2016已经支持原生Docker,现在也将部分服务往Docker上迁移进行测试。

环境中有使用.net 3.5和.net 4.0以及有使用Oracle客户端,因此Web容器就需要安装Oracle客户端

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
FROM microsoft /iis
# install .NET 3.5
ADD sxs  /sxs
RUN Dism  /online  /enable-feature  /featurename :NetFX3  /All  /Source :C:\sxs  /LimitAccess  && del  /S  /Q  C:\sxs
# install ASP.NET 4.5
RUN dism  /online  /enable-feature  /all  /featurename :NetFx4  /featurename :IIS-ApplicationInit  /featurename :IIS-ASPNET45  /featurename :IIS-ASPNET  /NoRestart
 
# enable windows eventlog
RUN powershell.exe - command  Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\WMI\Autologger\EventLog-Application Start 1
 
# set IIS log fields
RUN  /windows/system32/inetsrv/appcmd .exe  set  config  /section :system.applicationHost /sites  /siteDefaults .logFile.logExtFileFlags: "Date, Time, ClientIP, UserName, SiteName, ServerIP, Method, UriStem, UriQuery, HttpStatus, Win32Status, TimeTaken, ServerPort, UserAgent, Referer, HttpSubStatus"   /commit :apphost
 
# install Oracle Client
ADD win64_11gR2_client.zip  /win64_11gR2_client .zip
ADD unzip.exe  /unzip .exe
RUN  /unzip .exe  /win64_11gR2_client .zip && del  /S  /Q  win64_11gR2_client.zip
ADD client.rsp  /client/client .rsp
RUN  /client/setup .exe -silent -force -noconsole -ignoreSysPrereqs -ignorePrereq -waitforcompletion -responseFile C:\client\client.rsp && del  /S  /Q  client
#RUN cacls c:\app /T /E /C /G users:r
 
# deploy webapp
#COPY publish /inetpub/wwwroot/html
 
# set entrypoint script
ADD SetHostsAndStartMonitoring.cmd \SetHostsAndStartMonitoring.cmd
ENTRYPOINT [ "C:\\SetHostsAndStartMonitoring.cmd" ]
 
# declare volumes
VOLUME [ "c:/inetpub/logs/LogFiles" , "C:/inetpub/wwwroot/html" ]

Dockerfile涉及的文件内容有

sxs     #在Windows Server 2016 安装包的\sources\sxs\目录

unzip.exe   #Oracle Client客户端安装包的client\install目录下

win64_11gR2_client.zip  #自行到官方下载

client.rsp  #Oracle客户端安装响应文件

SetHostsAndStartMonitoring.cmd


client.rsp

1
2
3
4
5
6
7
8
9
10
11
12
13
oracle. install .responseFileVersion=http: //www .oracle.com /2007/install/rspfmt_clientinstall_response_schema_v11_2_0
ORACLE_HOSTNAME= 
UNIX_GROUP_NAME=
INVENTORY_LOCATION=C:\Program Files\Oracle\Inventory
SELECTED_LANGUAGES=zh_CN,en 
ORACLE_HOME=C:\app\Administrator\product\11.2.0\client_1
ORACLE_BASE=C:\app\Administrator
oracle. install .client.installType=Runtime
oracle. install .client.customComponents= "oracle.precomp:11.2.0.1.0" , "oracle.ons:11.2.0.0.0" , "oracle.oraolap.mgmt:11.2.0.1.0" , "oracle.rdbms.scheduler:11.2.0.1.0"
oracle. install .client.customComponents=
oracle. install .client.oramtsPortNumber=49152
oracle. install .client.schedulerAgentHostName=
oracle. install .client.schedulerAgentPortNumber=


SetHostsAndStartMonitoring.cmd

1
2
3
4
5
6
echo  %HOST% >> /Windows/System32/drivers/etc/hosts
/windows/system32/inetsrv/appcmd .exe delete site  "Default Web Site/"
/windows/system32/inetsrv/appcmd .exe add apppool  /name : "%site_name%"   /managedRuntimeVersion : "v%site_version%.0"   /managedPipelineMode :Classic -queueLength:65535
/windows/system32/inetsrv/appcmd .exe add site  /name : "%site_name%"  /physicalPath : "c:\inetpub\wwwroot\html"  -serverAutoStart: true  /bindings :http: // *:80 
/windows/system32/inetsrv/appcmd .exe  set  site  /site .name: "%site_name%"  /[path= '/' ].applicationPool: "%site_name%"
c:\ServiceMonitor.exe w3svc

文件中涉及到三个环境变量

HOST   #因为windows Docker无法通过--add-host指host这里通过这种方法指host

site_name   #站点域名

site_version   #.net版本


Docker启动示例:

1
docker run -d -p 80 -e site_name=fengwan.blog.51cto.com -e site_version=4 -e host= "192.168.2.2 db.51cto.com"  - v  c: /webroot/fengwan :c: /inetpub/wwwroot/html  - v  c: /logs :c: /inetpub/logs/logFiles  image_name