開發人員不可不知的
Windows Container
容器技術預覽
適用 Windows Server 2016 TP5 版本
多奇數位創意有限公司
技術總監 黃保翕 ( Will 保哥 )
部落格:http://blog.miniasp.com/
Basic Concepts
基本觀念
3
Docker: Build, Ship, Run
• 分散式應用程式的開放平台!
• 專為開發人員與系統管理人員而生!( DevOps )
4
作業系統虛擬化
• Docker 實作輕量級的作業系統虛擬化解決方案!
5
虛擬機器 與 容器 的比較
參考資料
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/ -ProviderName
PowerShellGet -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:buildDockerfile -Force
• 編輯 Dockerfile 定義檔內容
39
建置容器影像
• 執行以下命令
 docker build -t iis c:Build
• 參數說明
 build 建立容器影像
 -t iis 指定容器影像的名稱 (t = tag)
 c:Build 建置資料夾
40
其他 Dockerfile 範例
• 建立 C:Build 工作區
• 複製網站檔案到 C:Buildwwwroot 目錄中
• 建立 C:BuildDockerfile 定義檔
– 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:Inetpubwwwroot
– 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:buildwwwroot:c:WebRoot iisimage cmd
• 參數說明
 run 在一個新的容器中執行命令
 -v VOLUME (shared filesystems)
 C:buildwwwroot 容器主機 (container host) 的資料夾
 C:WebRoot 對應到容器實體(container machine)的資料夾
注意:容器中不能有 C:WebRoot 資料夾存在!
 iisimage 基礎影像名稱
 cmd 在容器中執行的命令
Container Data Volumes
43
解壓縮 ZIP 檔案 (方法1)
• 執行以下命令
 Expand-Archive -Path MyWebSite.zip
-DestinationPath c:inetpubwwwroot
• 參數說明
 -Path 指向要解壓縮的 zip 檔 (可為相對路徑)
 -DestinationPath 解壓縮到哪個資料夾
Expand-Archive cmdlet
44
解壓縮 ZIP 檔案 (方法2)
• 執行以下命令
 Expand-Archive -LiteralPath C:buildcapco.zip
-DestinationPath c:inetpubwwwroot
• 參數說明
 -LiteralPath 指向要解壓縮的 zip 檔 (需為絕對路徑)
 -DestinationPath 解壓縮到哪個資料夾
Expand-Archive cmdlet
45
新增 IIS 站台
• 執行以下命令
 New-WebSite -Name SecondSite -Port 80
-PhysicalPath "c:inetpubwwwrootSecondSite"
• 參數說明
 -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