利用Swarmkit構建Windows/Linux混合Docker叢集
在很多公司都同時存在Windows+Linux兩種作業系統,在Linux上跑Docker很方便各種資料文件齊全,但是在Windows上跑Docker相對比較少,同時也受到一些限制,如Windows上docker網路問題。下面就介紹下利用Windows IIS跑Web應用,同時使用Haproxy作為負載均衡器。
方案採用Windows原生container、docker swarmkit、負載均衡器採用Haproxy+Etcd+Confd
流程說明:
1.
開發及運維修改dockerfile及程式碼提交至SVN伺服器,同時觸發SVN鉤子進行映象構建(Windows專案在Windows構建、Linux專案在Linux構建),並push至我們的Docker私有倉庫
2.
3.
4.
推送映象之後,鉤子同時觸發Docker Swarmkit叢集的leader伺服器進行服務建立或者更新
5.
6.
7.
啟動IIS容器,需要提前啟動haproxy+etcd+confd容器,以便服務註冊
8.
Windows Docker Swarm初始化叢集叢集,不可以只使用docker swarm init,而不指定IP及埠,否則就會一直卡在初始化的程式下,正確的姿勢如下:
docker swarm init --advertise-addr 192.168.2.20:2377 --listen-addr 192.168.2.20:2377
新建overlay網路用於容器之間互聯
docker network create -d overlay myspace
如果存在測試環境/正式環境,就需要在不同的環境使用不同的overlay網路,同時指定DNS
說明事項:
1.docker swarm的endpoint-mode必須為dnsrr(--endpoint-mode=dnsrr),主要為Windows暫時不支援路由VIP模式
docker service create --name = iis --replicas = 1 --network = myspace --endpoint-mode = dnsrr --constraint "Node.Platform.OS==windows" microsoft/iis
2.啟動IIS服務時必須要指定伺服器的OS為windows(--constraint "Node.Platform.OS==windows"),而Linux服務指向Linux
3.服務名稱不能包含點(.),否則可能報Error response from daemon: rpc error: code = 3 desc = name must be valid as a DNS name component
4.Windows Docker機器一定要開啟相關防火牆介面
netsh advfirewall firewall add rule name ="swm 2377" dir = in action = allow protocol = TCP localport = 2377
netsh advfirewall firewall add rule name ="swm 7946" dir = in action = allow protocol = TCP localport = 7946
netsh advfirewall firewall add rule name ="swm 7946udp" dir = in action = allow protocol = UDP localport = 7946
netsh advfirewall firewall add rule name ="swm 4789" dir = in action = allow protocol = TCP localport = 4789
netsh advfirewall firewall add rule name ="swm 4789udp" dir = in action = allow protocol = UDP localport = 4789
5.Windows退出swarm叢集后再加入swarm叢集,將無法再進行工作,原因是HNS無法載入新叢集的網路資訊,暫未找到處理辦法,找到處理辦法的同學留言回覆下
6.自動註冊: 在機器啟動的時候,透過curl向etcd伺服器新增配置資訊
原版: for /f "tokens=2* delims==:" %%a in ('ipconfig^|find /i "10.0"') do (
curl.exe -XPUT %site_name%/%computername% -d value ="%%a:80")
BUG修復版:主要是解決主機重複 for /f "tokens=2* delims==:" %%a in ('ipconfig^|find /i "10.0"') do ( for /f "tokens=3,4 delims=." %%b in ("%%a") do curl.exe -XPUT %site_name%/%%b%%c -d value ="%%a:80")
7.服務回收: 由於服務註冊是利用容器啟動進行註冊,當容器刪除後服務不自動回收,這裡利用監聽Haproxy狀態對DOWN 5分中後的容器進行自動回收
for a in `echo "show stat" | socat stdio unix-connect:/var/run/haproxy.sock |grep -v "BACKEND"|awk -F, '/DOWN/{if ( $25 >300 ) print $1,$2}'|sed 's#_cluster #/#g'`;do curl -XDELETE $a;done
8.如果採用hyper-v Container,則Windows Server 2016資料中心版支援不限量容器執行,但是Windows Server 2016標準版 只支援2個容器。但是對於上面的作業系統層的容器則無限量支援。
9. IIS Dockerfile
FROM microsoft/iis #install ASP.NET 4.5
RUN dism /online /enable-feature /all /featurename:NetFx4 /featurename:IIS-ApplicationInit /featurename:IIS-ASPNET45 /NoRestart #enable windows eventlog
RUN powershell.exe -command Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\WMI\Autologger\EventLog-Application Start 1
ENTRYPOINT ["C:\\SetHostsAndStartMonitoring.cmd"]
RUN for %s in ( TermService,SessionEnv,iphlpsvc,RemoteRegistry,WinHttpAutoProxySvc,SENS,WinRM,LanmanWorkstation,Winmgmt ) do ( sc config %s start = disabled ) && reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\InetStp\Configuration" /v "MaxWebConfigFileSizeInKB" /t reg_dword -d "0" /f && reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Configuration" /v "MaxWebConfigFileSizeInKB" /t reg_dword -d "0" /f
VOLUME ["c:/inetpub/logs/LogFiles"]
ADD curl.exe /windows/system32/curl.exe
ENV site_version 4
ENV site_name fengwan.blog.51cto.com
RUN /windows/system32/inetsrv/appcmd.exe delete site "Default Web Site/" && /windows/system32/inetsrv/appcmd.exe add apppool /name: "%site_name%" /managedRuntimeVersion: "" /managedPipelineMode:Integrated -queueLength:65535 && /windows/system32/inetsrv/appcmd.exe add site /name: "%site_name%" /physicalPath: "c:\wwwroot\%site_name%" -serverAutoStart:true /bindings:http://%site_name%:80 && /windows/system32/inetsrv/appcmd.exe set site /site.name: "%site_name%" / [ path ='/'] .applicationPool: "%site_name%"
ADD SetHostsAndStartMonitoring.cmd \SetHostsAndStartMonitoring.cmd
ADD webroot C:/wwwroot/fengwan.blog.51cto.com
SetHostsAndStartMonitoring.cmd
::服務註冊 for /f "tokens=2* delims==:" %%a in ('ipconfig^|find /i "10.0"') do ( for /f "tokens=3,4 delims=." %%b in ("%%a") do curl.exe -XPUT %site_name%/%%b%%c -d value ="%%a:80")
::啟動IIS服務
c:\ServiceMonitor.exe w3svc
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989477/viewspace-2752220/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mac 下 利用 docker 構建 MySQL 叢集MacDockerMySql
- Docker構建redis叢集環境DockerRedis
- 使用docker-compose構建elasticsearch叢集DockerElasticsearch
- redis 叢集構建Redis
- RabbitMQ(四):使用Docker構建RabbitMQ高可用負載均衡叢集MQDocker負載
- 基於Docker和Kubernetes構建的部署管理和叢集管理Docker
- 使用Keepalived構建LVS高可用叢集
- redis5.* 手動構建叢集Redis
- ES叢集構建(本人親測有效)
- 構建一機多例項tomcat叢集Tomcat
- 構建Zookeeper叢集(zkcluster) ~一篇文章玩轉zk叢集^.^
- 構建MHA實現MySQL高可用叢集架構MySql架構
- 重頭構建kubernetes叢集v1.81
- solr叢集構建的基本流程介紹Solr
- Docker Swarm 叢集搭建DockerSwarm
- docker搭建consul叢集Docker
- docker部署mysql叢集DockerMySql
- Docker 搭建叢集 MongoDBDockerMongoDB
- docker-redis叢集DockerRedis
- docker搭建mysql叢集DockerMySql
- Docker搭建ELK叢集Docker
- Docker Elasticsearch 叢集配置DockerElasticsearch
- Docker部署ElasticSearch叢集DockerElasticsearch
- Docker搭建Redis叢集DockerRedis
- Docker Swarm叢集初探DockerSwarm
- linux下搭建ZooKeeper叢集(偽叢集)Linux
- RabbitMQ從零到叢集高可用(.NetCore5.0) -高可用叢集構建落地MQNetCore
- Linux 叢集化Linux
- 『高階篇』docker之Mesos叢集架構圖(23)Docker架構
- docker下,極速搭建spark叢集(含hdfs叢集)DockerSpark
- 用Docker搭建RabbitMq的普通叢集和映象叢集DockerMQ
- 使用docker部署hadoop叢集DockerHadoop
- (三)docker-Elasticsearch 叢集DockerElasticsearch
- 使用docker 搭建rabbitmq 叢集DockerMQ
- Docker Swarm 叢集搭建教程DockerSwarm
- Docker swarm叢集搭建教程DockerSwarm
- Docker中建立Consul叢集Docker
- Docker環境下秒建Redis叢集,連SpringBoot也整上了!DockerRedisSpring Boot