開發人員不可不知的Windows Container
容器技術預覽適用 Windows Server 2016 TP5 版本
多奇數位創意有限公司
技術總監黃保翕 ( Will 保哥 )
部落格:http://blog.miniasp.com/
Basic Concepts
基本觀念
3
Docker: Build, Ship, Run
• 分散式應用程式的開放平台!
• 專為開發人員與系統管理人員而生!( DevOps )
4
作業系統虛擬化
• Docker 實作輕量級的作業系統虛擬化解決方案!
6
關於 Windows 容器
• 專為Windows 平台所開發的 Container 技術
– 多個容器執行個體可以在一部主機上同時執行
– 透過命名空間、資源控制和程序隔離技術來提供容器隔離• 在容器中執行的程式,在Host 主機看的見在執行!
• 容器執行個體會與容器主機共用相同的作業系統核心
• 容器管理方式
– PowerShell Cmdlet
– Docker 命令
• 參考文章
– 使用 PowerShell 和 Docker 管理Windows 容器的比較
7
關於 Hyper-V 容器
• 為Windows Container 技術增加容器的隔離性
– 多個容器執行個體可以在一部主機上同時執行
– 透過虛擬機器來提供容器隔離• 每個容器皆執行於一個名為 vmwp的 Hyper-V 虛擬機中
• 每個Hyper-V 容器與容器主機之間提供核心層級隔離
• 啟動方式docker run -it --isolation=hyperv windowsservercore cmd
• 參考文章
– Hyper-V 容器 / docker run reference
8
使用容器技術的好處 - 開發人員體驗
• 縮短開發人員上手時間
– 省去開發環境的建立與設定
– 不同的專案有不同的設定,都可以事先準備好環境
• 提升開發人員工作效率
– 由於容器技術帶來應用程式隔離,無論你用什麼程式語言、工具、或任何系統參數設定,都不會造成容器之間互相影響,省去環境衝突帶來的困擾!
• 抹除應用程式執行環境的不一致性
– 容器之間的隔離性可以徹底某除任何潛在的環境設定失誤,並讓應用程式部署更加容易!
9
使用容器技術的好處 - 軟體部署方面
• 容器技術可以讓你動態改變不同的設定、新增功能、橫向延展服務,更能迅速的反應需求的變化!
• 透過微服務 (Micro-service)架構,應用系統中不同類型的服務都可透過容器技術進行分類與管理,搭配適合的容器管理工具,就能做到動態資源分配與分散式軟體部署的目的。
10
應用程式開發方法的比較
11
了解微服務架構 (Microservice Architecture)
• 何謂微服務
– 獨立的服務共同組成整個應用系統
– 個別的服務都可以獨立部署與運作
– 每一個服務都能夠獨立開發與維護
– 分散式的管理 ( 可延展性高 )
• 微服務的目的
– 將應用程式拆分成多個服務
– 實現敏捷開發和部署自動化
為何要用微服務方式建置應用程式?
12
應用程式類型之間的狀態儲存比較
在 AZURE 建立虛擬機器
Create a Windows Server 2016 Core on Azure VM
14
在 Azure Portal 搜尋虛擬機器範本
15
在 Azure Portal 建立虛擬機
• https://portal.azure.com/
– 新增資源
– 搜尋關鍵字• Technical Preview 5
– 建立虛擬機器• 部署模型:資源管理員
• 名 稱:WS2016TP5
• 使用者名稱:will
• 使用者密碼:********
• 資源群組名:WS2016TP5
• 位 置:東亞
16
透過遠端桌面連線(RDP)連接虛擬機器
安裝容器功能與 DOCKER 工具
Install Containers feature and docker tools
18
安裝 Containers 功能
• 開啟Windows PowerShell
• 執行以下命令– Install-WindowsFeature containers
• 重新啟動虛擬機
– Restart-Computer
19
安裝 ContainerImage 套件提供者
• 開啟Windows PowerShell
• 執行以下命令– Install-PackageProvider ContainerImage -Force
• 如果上述命令無法執行,請執行以下命令:– Register-PackageSource -Name PSGallery -Location
https://www.powershellgallery.com/api/v2/ -ProviderNamePowerShellGet -Trusted -Force
20
安裝基礎容器影像
• 執行以下命令進行安裝– Install-ContainerImage -Name NanoServer
– Install-ContainerImage -Name WindowsServerCore
• 查詢已安裝的容器影像 (Container Image)– Get-ContainerImage
21
安裝 docker 管理工具
• 執行以下命令進行安裝– Invoke-WebRequest https://aka.ms/tp5/Update-Container-Host
-OutFile update-containerhost.ps1
– .\update-containerhost.ps1
22
查詢容器影像與設定 latest 標籤
• 執行以下命令– docker images
– docker tag dbfee88ee9fd windowsservercore:latest
– docker tag cb48429c84fa nanoserver:latest
容器生命週期
Container Lifecycle
24
從基礎容器影像建立容器
• 執行以下命令 docker run --name iisbase -it windowsservercore cmd
• 參數說明 run 在一個新的容器中執行命令
--name iisbase 指定新建立的容器名稱
-it 進入互動模式 (Interactive) -i Keep STDIN open even if not attached
-t Allocate a pseudo-TTY
windowsservercore 基礎影像名稱
cmd 在容器中執行的命令
• 其他備註– 執行 exit可退出容器執行個體且自動停止容器
25
列出已建立的容器
• 列出正在執行中的容器– docker ps
• 列出所有容器 (包含目前沒有執行的容器)– docker ps -a
26
管理容器的生命週期
• 列出所有容器
– docker ps -a
• 啟動指定容器 (註: 1f57d7b20afc為容器ID )
– docker start 1f57d7b20afc
• 在指定容器中執行命令
– docker exec -it 1f57d7b20afc cmd
• 停止指定容器
– docker stop 1f57d7b20afc
• 刪除指定容器
– docker rm 1f57d7b20afc
列表、啟動、執行、停止、刪除容器
建立 IIS 容器影像
Create an IIS Container Image
29
安裝所需的 Windows 功能
• 建立容器
– docker run --name iisbase -it windowsservercore powershell
• 安裝功能角色 ( 使用 DISM工具 )
– dism /online /enable-feature /all /featurename:IIS-ASPNET45 /featurename:IIS-HttpRedirect /featurename:IIS-RequestMonitor /featurename:IIS-HttpTracing/featurename:IIS-BasicAuthentication /featurename:IIS-WindowsAuthentication /featurename:IIS-IPSecurity/featurename:IIS-URLAuthorization /NoRestart
• 取得所有功能清單
– dism /online /get-features
• 取得容器裡的Windows 功能
– Get-WindowsFeature
• 檢查容器內 IIS 是否正常啟動 (下載網頁 HTML 回來)
– Invoke-WebRequest http://localhost/ -OutFile index.htm
– wget http://localhost/ -OutFile index.htm
30
建立一個 IIS 容器影像
• 退出容器 (同時也會停止容器執行)– exit
• 執行以下命令建立 iisimage容器影像– docker commit iisbase iisimage
– 注意:建立容器映像前必需停止容器!
建立 IIS 容器
Create an IIS Container
32
建立 IIS 容器並設定 NAT 埠號對應
• 執行以下命令 docker run --name iis1 -it -p 8088:80 iisimage cmd
• 參數說明 run 在一個新的容器中執行命令
--name iisbase 指定新建立的容器名稱
-it 進入互動模式 (Interactive)
-p 8088:80 設定主機埠號 8088 對應到容器的 80
iisimage 基礎影像名稱
cmd 在容器中執行的命令
• 其他備註– 執行 exit可退出容器執行個體且自動停止容器
33
設定外網連入安全性規則
34
設定外網連入安全性規則
35
設定外網連入安全性規則
36
確認可以外網連入容器站台
使用 DOCKERFILE 快速建置影像
Using Dockerfile to build container images
38
建立 Dockerfile 定義檔
• 建立工作區與 Dockerfile 定義檔
– New-Item C:\build\Dockerfile -Force
• 編輯 Dockerfile 定義檔內容
39
建置容器影像
• 執行以下命令 docker build -t iis c:\Build
• 參數說明 build 建立容器影像
-t iis 指定容器影像的名稱 (t = tag)
c:\Build 建置資料夾
40
其他 Dockerfile 範例
• 建立 C:\Build 工作區
• 複製網站檔案到 C:\Build\wwwroot 目錄中
• 建立 C:\Build\Dockerfile 定義檔
– FROM windowsservercore
– RUN dism /online /enable-feature /all /featurename:IIS-ASPNET45 /featurename:IIS-HttpRedirect /featurename:IIS-RequestMonitor/featurename:IIS-HttpTracing /featurename:IIS-BasicAuthentication/featurename:IIS-WindowsAuthentication /featurename:IIS-IPSecurity /featurename:IIS-URLAuthorization /NoRestart
– ENV Inetpub C:\\Inetpub\\wwwroot
– WORKDIR ${Inetpub}
– ADD wwwroot $Inetpub
• 建置容器影像
– docker build -t iis c:\Build
• 列出容器影像
– docker images
Dockerfile reference
部署網站到 IIS 容器
Deploy a Web Site to IIS Container
42
設定容器與主機的共用資料夾 (Volume)
• 執行以下命令 docker run -name iis1 -it -p 8088:80
-v C:\build\wwwroot:c:\WebRoot iisimage cmd
• 參數說明 run 在一個新的容器中執行命令
-v VOLUME (shared filesystems) C:\build\wwwroot 容器主機 (container host) 的資料夾
C:\WebRoot 對應到容器實體(container machine)的資料夾注意:容器中不能有 C:\WebRoot 資料夾存在!
iisimage 基礎影像名稱
cmd 在容器中執行的命令
Container Data Volumes
43
解壓縮 ZIP 檔案 (方法1)
• 執行以下命令 Expand-Archive -Path MyWebSite.zip
-DestinationPath c:\inetpub\wwwroot\
• 參數說明 -Path 指向要解壓縮的 zip 檔 (可為相對路徑)
-DestinationPath 解壓縮到哪個資料夾
Expand-Archive cmdlet
44
解壓縮 ZIP 檔案 (方法2)
• 執行以下命令 Expand-Archive -LiteralPath C:\build\capco.zip
-DestinationPath c:\inetpub\wwwroot\
• 參數說明 -LiteralPath 指向要解壓縮的 zip 檔 (需為絕對路徑)
-DestinationPath 解壓縮到哪個資料夾
Expand-Archive cmdlet
45
新增 IIS 站台
• 執行以下命令 New-WebSite -Name SecondSite -Port 80
-PhysicalPath "c:\inetpub\wwwroot\SecondSite"
• 參數說明 -Name 站台名稱
-Port 站台監聽埠號
-PhysicalPath 站台實體路徑
學習資源
Learning Resources
47
常用 docker 命令
• docker ps 列出容器
• docker exec 在容器中執行程式
• docker run 建立容器
• docker commit 從 Container 建立容器影像
• docker build 從 Dockerfile 建立容器影像
• docker rm 刪除容器
• docker images 列出容器影像
• docker rmi 刪除容器影像
• docker save 匯出容器影像成 tar 檔
• docker load 將匯出的容器影像匯入
48
常用 PowerShell 命令
• Web Server (IIS) Administration Cmdlets
– Get-WebSite 列出站台
– New-Website 建立站台
– Start-Website 啟動站台
– Stop-Website 停止站台
• 安裝Windows 功能角色– Get-WindowsFeature
– Install-WindowsFeature
• 其他好用命令– Expand-Archive
– Invoke-WebRequest ( wget )
49
相關連結
• Windows Containers Documentation (繁體中文版)
– Containers Cmdlets
– Windows Containers Quick Start - PowerShell
– Windows Containers Quick Start – Docker
– Application Compatability in Windows Containers
• Containers: Docker, Windows and Trends
– Container:Docker、Windows 以及趨勢
• MSDN Forums - Windows Containers
• What is Docker?
50
聯絡資訊
• The Will Will Web
記載著Will 在網路世界的學習心得與技術分享
– http://blog.miniasp.com/
• Will 保哥的技術交流中心 (臉書粉絲專頁)
– http://www.facebook.com/will.fans
• Will 保哥的噗浪
– http://www.plurk.com/willh/invite
• Will 保哥的推特
– https://twitter.com/Will_Huang
Top Related