Windows Docker Container 安裝

Docker是一個基礎於Container技術,專為開發者與系統管理者設計的平台,以利組織可以藉由這樣的好技術,佈署與運行特定目的程式碼。因為每個映像檔都已經把程式碼、runtime運行環境、函式庫、環境變數、設定檔…以抽象化的方式整合在映像檔中。因為很完整,所以多個Container都不會互相干擾,就像是孫悟空用頭髮吹出分身,雖然系出同源,都是來自孫悟空,但各自獨立,都可以單兵作戰!

由於相關的原理已經在上一篇介紹過了,它可讓你專注於快速開發應用程式及加快上市時間,而不是將寶貴的時間和資源耗費在管理虛擬機器和基礎結構上。此外,你可以使用開放原始碼工具與選擇的平台繼續開發應用程式,並提供企業所需的速度和效率而不需要學習新技能。以下我將會以Azure 上 Win10 VM 完成以下五個安裝相關的議題

  1. 安裝設定於 Windows Client/Server
    **選擇Code base,自從Windows Vista開始微軟的作業系統就採用 Client/Server 源自相容的 Code base。對於現今採用Winodws 容器的使用者來說,首先是你可以在Windows 10上面開發,然後佈署到Windows Server上,反之亦然。其次是自從Windows as a service 不管是Client 還是Server 端都有半年通道的生命周期,細節可以參考官網。換句話說,Kernel 的更新也要考慮在佈署的環節中。
    在環境上,
    我們需要準備1607以上的作業系統,並且要啟用Hyper-V與Container服務,安裝細節可以參考官網的說明
    上圖是我在Windows10執行 winver的結果,已經高過低標1607
    在新增移除程式的管理介面的左上角找到Windows features的開關按鈕(有一個盾牌的icon)
    接下來要去 Docker公司下載 Docker for windows的Server與Cleint端,它的網址是 https://hub.docker.com/editions/community/docker-ce-desktop-windows
    登入後即可下載,若無,請創建一個
    接下來 Double click開始安裝,在選單中它會問你要不要用 Windows 取代 Linux的Container,我先不選待會要示範如何切換回來
    安裝完成
    它就被安裝在Program Files裡面的Docker目錄中
    接下來我們開始驗證相關的功能
    當我們把桌面上新的 Docker捷徑icon點下去,Docker engine就開始在背景中運行著,你可以在右下角的System tray中發現一隻鯨魚
    在右下角對著whale icon按右鍵,便可叫起 pop-up menu,首先我要來切換底層的作業系統,一但好了,選單就會改顯示Switch to Linux Containers...,你可以在Docker環境下同時運行多個Container(視你硬體的CPU/RAM...等資源),而且不限Windows或Linux,唯一的限制就是,一次只能選一邊站,例如 IIS, ASP.Net, SQL server…等N個應用程式在Windows或是Apache, Ngnix, MySQL…M個應用程式在Linux上面。
    當然我可以點選About Docker查看版本資訊
    上圖是 Docker engine的相關資訊,其實安裝後還有許多可以設定的,包含資源授予(CPU/RAM)、HA、資料夾 mapping…後續有時間,再回頭來談這個議題,先讓我們回到主軸,怎麼把Container執行起來…

    接下來我們可以在PowerShell中執行跟剛才pop-up menu一樣的功能。雖然底層的Docker engine已經啟用,但是接下來的全部操作都是 Command line mode,所以我們會需要 Dos command prompt 的下一代工具,號稱無所不能的 PowerShell (強大到連資料庫的安裝設定也在它的範圍內),先以管理員身份把它執行起來,
    若是你的版本資訊,要更明細,指令要改一下
    就可以看到現在是運行 Windows還是Linux Container?另外還有一個 Error 是報錯:連不到官方的Orchestrator Swarm(若不清楚可以參考另一篇的說明)的錯誤訊息。
  2. 下載映像檔與執行容器
    **下載與表列映像檔
    由於在初期我們手上連一個映像檔都沒有,所以在示範表列 image之前應該先要透過 docker pull [url]:[tag] 去 Docker hub下載回來。請注意這個tag必需與你的作業系統的版本是一致!還記得我們一開始在Win10下了一個 Winver得到 1709的版本號嗎?所以我就去下載 Nano Server到我的環境中。

    首先,什麼是 Docker hub?它的概念類似 Git 上傳/下載程式碼,只是內容改成映像檔,
    至於什麼是 Nano Server?它是Windows Server 2016其中一個為雲而生的殺手級功能,受限於傳統的硬體虛擬化技術,每個Windows VM 少則8GB起跳,在雲端發展過程中,一直都是很重且阻礙企業由地端移轉上雲端的拌腳石。所以如何瘦身Windows 作業系統就是當時的一個重要挑戰,基礎於 just enough的 feature與 privilege,Windows沒有必要包山包海很肥大,所以在這個 SA (Software Assurance)授權才能使用的 Nano Server中,是可以小到 470MB,然而現在Windows Server 2019 又讓它突破到 94MB。
    上圖的第二個指令是表列,在CLI的語法中 ls = list 相當是 dos 中的 dir
    接下來我想要到 Docker hub再下載一個 IIS要建置我的網站

    **執行容器
    在開始之前必需先澄清 Container僅適合沒有 UI的應用程式,所以即使是有 UI的 Nano Server,我們也只能透過 Powershell 或是 Dos來存取它。
    在上圖中,我使用 docker run指令,在映像檔(網址)之前有一個 -it 指的是用 console方式,最後再告訴它我要執行哪一支程式?在本例中是 cmd。至於--name則是區別用(不下這個指令也沒關係),待會還會介紹 tag 這個指令也可以用來做別名

    在Dos中對當前的目錄下一個 Dir指令,所以你現在有一個C槽。接下來我還會介紹如何將容器的資料夾與本機的資料夾做 mapping 或是拷貝資料…
    在上圖中,我利用 docker tag指令,把又臭又長的 IIS映像檔,給了它一個很精簡的別名。這個指令很像以前的 Dos Rename 舊名稱 新名稱的用法,若 tag名稱(不是 tag指令)不填入,系統預設會幫你加一個 lastest。
     好了,接下來我就可以把 IIS 網站叫起來了
    這個指令跟剛才不一樣的地方,除了映像檔名稱與別名的使用,值得介紹的是 -d 以detach模式,以及 -p 設定本機的XX埠號去對應 Container中的80埠。
    請注意微軟的 Container從 Dockerfile中可以看的出,它是 Fixed在80埠,所以你的選擇將會是,充許使用80埠號,就去下載IIS的映像檔;若不充許使用80埠,就從Nano Server或是ServerCore下載起,自己再下達 add feature指令,把 IIS裝起來就可以指定任意(0~65535)埠。
    下圖是透過 docker ps -a指令查詢 Container 列表,為何 Dos(cmd.exe)的時間比較短?是因為我剛才 dir 完不小心太順手鍵入 Exit,所以後來又重新再把它啟動起來
    接著
    我們透過 docker stop [Container Name]的指令,若是直接透過 powershell 下指令結束當前的應用程式,例如以 exit 關閉cmd.exe。
    最後再以 rm 結束 Container,所以它的生命週期為 Run => Create / Start / Runing;Stop;RM => Delete
    至於 $(docker ps -a -q) 這個廻圈式的查詢,寫過 powershell 的人應該很熟悉

    **Docker build
    將容器建立成映像檔,就是透過 commit指令,還有建立 Dockerfile 就是透過 build 指令…



    **Docker login
    **Docker tag




    **Docker Push
  3. 開發/佈署/發行映像檔…專案生命週期
  4. 佈署自動化
  5. 其他

李秉錡 Christian Lee
Once worked at Microsoft Taiwan