開發人員不可不知的
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

開發人員不可不知的 Windows Container 容器技術預覽

  • 1.
    開發人員不可不知的 Windows Container 容器技術預覽 適用 WindowsServer 2016 TP5 版本 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 ) 部落格:http://blog.miniasp.com/
  • 2.
  • 3.
    3 Docker: Build, Ship,Run • 分散式應用程式的開放平台! • 專為開發人員與系統管理人員而生!( DevOps )
  • 4.
  • 5.
    5 虛擬機器 與 容器的比較 參考資料
  • 6.
    6 關於 Windows 容器 •專為 Windows 平台所開發的 Container 技術 – 多個容器執行個體可以在一部主機上同時執行 – 透過命名空間、資源控制和程序隔離技術來提供容器隔離 • 在容器中執行的程式,在 Host 主機看的見在執行! • 容器執行個體會與 容器主機 共用相同的作業系統核心 • 容器管理方式 – PowerShell Cmdlet – Docker 命令 • 參考文章 – 使用 PowerShell 和 Docker 管理 Windows 容器的比較
  • 7.
    7 關於 Hyper-V 容器 •為 Windows Container 技術增加容器的隔離性 – 多個容器執行個體可以在一部主機上同時執行 – 透過虛擬機器來提供容器隔離 • 每個容器皆執行於一個名為 vmwp 的 Hyper-V 虛擬機中 • 每個 Hyper-V 容器 與 容器主機 之間提供核心層級隔離 • 啟動方式 docker run -it --isolation=hyperv windowsservercore cmd • 參考文章 – Hyper-V 容器 / docker run reference
  • 8.
    8 使用容器技術的好處 - 開發人員體驗 •縮短開發人員上手時間 – 省去開發環境的建立與設定 – 不同的專案有不同的設定,都可以事先準備好環境 • 提升開發人員工作效率 – 由於容器技術帶來應用程式隔離,無論你用什麼程式語 言、工具、或任何系統參數設定,都不會造成容器之間 互相影響,省去環境衝突帶來的困擾! • 抹除應用程式執行環境的不一致性 – 容器之間的隔離性可以徹底某除任何潛在的環境設定失 誤,並讓應用程式部署更加容易!
  • 9.
    9 使用容器技術的好處 - 軟體部署方面 •容器技術可以讓你動態改變不同的設定、新增功能、 橫向延展服務,更能迅速的反應需求的變化! • 透過 微服務 (Micro-service) 架構,應用系統中不 同類型的服務都可透過容器技術進行分類與管理, 搭配適合的容器管理工具,就能做到動態資源分配 與分散式軟體部署的目的。
  • 10.
  • 11.
    11 了解微服務架構 (Microservice Architecture) •何謂微服務 – 獨立的服務共同組成整個應用系統 – 個別的服務都可以獨立部署與運作 – 每一個服務都能夠獨立開發與維護 – 分散式的管理 ( 可延展性高 ) • 微服務的目的 – 將應用程式拆分成多個服務 – 實現敏捷開發和部署自動化 為何要用微服務方式建置應用程式?
  • 12.
  • 13.
    在 AZURE 建立虛擬機器 Createa Windows Server 2016 Core on Azure VM
  • 14.
    14 在 Azure Portal搜尋虛擬機器範本
  • 15.
    15 在 Azure Portal建立虛擬機 • https://portal.azure.com/ – 新增資源 – 搜尋關鍵字 • Technical Preview 5 – 建立虛擬機器 • 部署模型:資源管理員 • 名 稱:WS2016TP5 • 使用者名稱:will • 使用者密碼:******** • 資源群組名:WS2016TP5 • 位 置:東亞
  • 16.
  • 17.
    安裝容器功能與 DOCKER 工具 InstallContainers feature and docker tools
  • 18.
    18 安裝 Containers 功能 •開啟 Windows PowerShell • 執行以下命令 – Install-WindowsFeature containers • 重新啟動虛擬機 – Restart-Computer
  • 19.
    19 安裝 ContainerImage 套件提供者 •開啟 Windows PowerShell • 執行以下命令 – Install-PackageProvider ContainerImage -Force • 如果上述命令無法執行,請執行以下命令: – Register-PackageSource -Name PSGallery -Location https://www.powershellgallery.com/api/v2/ -ProviderName PowerShellGet -Trusted -Force
  • 20.
    20 安裝基礎容器影像 • 執行以下命令進行安裝 – Install-ContainerImage-Name NanoServer – Install-ContainerImage -Name WindowsServerCore • 查詢已安裝的容器影像 (Container Image) – Get-ContainerImage
  • 21.
    21 安裝 docker 管理工具 •執行以下命令進行安裝 – Invoke-WebRequest https://aka.ms/tp5/Update-Container-Host -OutFile update-containerhost.ps1 – .update-containerhost.ps1
  • 22.
    22 查詢容器影像與設定 latest 標籤 •執行以下命令 – docker images – docker tag dbfee88ee9fd windowsservercore:latest – docker tag cb48429c84fa nanoserver:latest
  • 23.
  • 24.
    24 從基礎容器影像建立容器 • 執行以下命令  dockerrun --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.
    25 列出已建立的容器 • 列出正在執行中的容器 – dockerps • 列出所有容器 (包含目前沒有執行的容器) – docker ps -a
  • 26.
    26 管理容器的生命週期 • 列出所有容器 – dockerps -a • 啟動指定容器 (註: 1f57d7b20afc 為容器ID ) – docker start 1f57d7b20afc • 在指定容器中執行命令 – docker exec -it 1f57d7b20afc cmd • 停止指定容器 – docker stop 1f57d7b20afc • 刪除指定容器 – docker rm 1f57d7b20afc
  • 27.
  • 28.
    建立 IIS 容器影像 Createan IIS Container Image
  • 29.
    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.
    30 建立一個 IIS 容器影像 •退出容器 (同時也會停止容器執行) – exit • 執行以下命令建立 iisimage 容器影像 – docker commit iisbase iisimage – 注意:建立容器映像前必需停止容器!
  • 31.
    建立 IIS 容器 Createan IIS Container
  • 32.
    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.
  • 37.
    使用 DOCKERFILE 快速建置影像 UsingDockerfile to build container images
  • 38.
    38 建立 Dockerfile 定義檔 •建立工作區與 Dockerfile 定義檔 – New-Item C:buildDockerfile -Force • 編輯 Dockerfile 定義檔內容
  • 39.
    39 建置容器影像 • 執行以下命令  dockerbuild -t iis c:Build • 參數說明  build 建立容器影像  -t iis 指定容器影像的名稱 (t = tag)  c:Build 建置資料夾
  • 40.
    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
  • 41.
    部署網站到 IIS 容器 Deploya Web Site to IIS Container
  • 42.
    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.
    43 解壓縮 ZIP 檔案(方法1) • 執行以下命令  Expand-Archive -Path MyWebSite.zip -DestinationPath c:inetpubwwwroot • 參數說明  -Path 指向要解壓縮的 zip 檔 (可為相對路徑)  -DestinationPath 解壓縮到哪個資料夾 Expand-Archive cmdlet
  • 44.
    44 解壓縮 ZIP 檔案(方法2) • 執行以下命令  Expand-Archive -LiteralPath C:buildcapco.zip -DestinationPath c:inetpubwwwroot • 參數說明  -LiteralPath 指向要解壓縮的 zip 檔 (需為絕對路徑)  -DestinationPath 解壓縮到哪個資料夾 Expand-Archive cmdlet
  • 45.
    45 新增 IIS 站台 •執行以下命令  New-WebSite -Name SecondSite -Port 80 -PhysicalPath "c:inetpubwwwrootSecondSite" • 參數說明  -Name 站台名稱  -Port 站台監聽埠號  -PhysicalPath 站台實體路徑
  • 46.
  • 47.
    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.
    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.
    49 相關連結 • Windows ContainersDocumentation (繁體中文版) – 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.
    50 聯絡資訊 • The WillWill 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