uncategorized

Windows Server 2016 Containers初體驗

當Windows Server 2016開始有支援Containers後,認為只要把Windows Server 2016內的Container服務啟動後,就可以立馬來使用Docker這項技術,殊不知這是錯誤的,因為,這樣做法只是讓Windows Server 2016有了Container功能,但是,要讓它可以用Docker,還必須額外安裝Docker模組才可以有辦法開始使用Docker的技術,而在Windows Server 2016支援的Containers有分成Windows Server ContainersHyper-V Containers,下面採用的是Windows Server Containers

安裝Docker


建議在安裝Docker之前,要把Windows Server 2016所有更新檔都必須要更新,才不會有問題,然後,用Admin權限啟動PowerShell,而第一個必須先安裝Docker-Microsoft PackageManagement套件,有了這個套件,才能去安裝Docker的Package

安裝Docker-Microsoft PackageManagement

1
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

安裝Docker Package

1
Install-Package -Name docker -ProviderName DockerMsftProvidere

都安裝完畢後,必須重新啟動電腦,讓Docker服務啟動,若是後續想要更新Docker,只要輸入更新指令就可以

1
Install-Package -Name Docker -ProviderName DockerMsftProvider -Update -Force

以上三步驟就可以在Windows Server 2016用Docker功能,若不確定是否可以用,只要輸入docker info能查看Docker相關訊息就沒問題了

安裝Docker-Compose


Docker-Compose是讓你可以快速佈署或是啟動Container的設定檔,如果是透過VS.Code去編輯Docker-Compose的yml檔案,必須先在VS.Code內安裝相關Docker-Compose套件,才可以開始編輯,但按照先前作法,已經可以在Windows Server 2016使用Docker,不過,卻沒有Docker-Compose指令,因為,必須額外安裝Docker-Compose套件,才有辦法使用Docker-Compose指令,安裝套件位置[https://github.com/docker/compose/releases],下載的檔案名稱是會是這樣docker-compose-Windows-x86_64.exe,也可以直接用PowserShell的指令安裝套件

1
Invoke-WebRequest "https://github.com/docker/compose/releases/download/1.14.0/docker-compose-Windows-x86_64.exe" -UseBasicParsing -OutFile $Env:ProgramFiles\docker\docker-compose.exe

不過,若公司防火牆關係無法安裝化,就是必須先把檔案下載下來,並且,透過上面指令取代掉原本URL位置改成docker-compose-Windows-x86_64.exe檔案的路徑,就可以安裝了,或是更改檔名為docker-compose後放自訂一個目錄中,只是必須設定系統的Path指定到這個目錄中

製作自己的Docekr Image


我們會從Docker Store下載自己所需要的image建立Container,不過,從Store下載來的image只是原始的Source,有時候並不能符合我們實際需求,所以,還會額外把設定加入進去,但是,若是每次從Image建立Container,都還要重複設定一次,也很費工。如果這時候想要每次都直接用自己加工過的image,而不是原始的Source,必須花一點小方法來製作屬於自己的image,在原本Docker指令中,是有支援Export功能,但是,在Windows Server 2016 Containers目前沒有辦法用這個指令。所以,我們必須利用Commit方式進行。

以SQL Server Container為例,我們可以先把Containers建立起來後,並放入自己系統的DB

1
docker run -it --name SQLTest -d -p 14331:1433 -e sa_password=XXXXX -e ACCEPT_EULA=Y -v c:\DB\:C:\DB\ microsoft/mssql-server-windows-express:2016-sp1

這時候建立的DB Container就不會是原始的Source,且每次啟動DB Container也不想要再還原一次DB到新的Container,這時候要把這個Container變成自己的image,以後只要啟動自己的image就可以

第一就是要先停掉Container,這個Container已經加入自己的DB

1
docker stop SQLTest

停掉Container後,用Commit方式建立新的image,這步驟通常會一點點時間

1
docker commit Container_ID microsoft/mssql-server-windows-express:SQLTest

如下圖,這樣在image List中,就多出剛剛建立的客製化image source了

如果想要把這image搬到其他地方使用呢?一種就是放入registry中,若現實不允許,就只能自己把image匯出檔案囉

1
docker save -o "c:\image\SQLTest.tar" microsoft/mssql-server-windows-express:SQLTest

通常這一步又要花費更久時間,反之要把檔案匯入,則使用docker load,就可以建立一個自己情境的docker image

讓Remote Container執行Docker-Compose


上面執行Docker方式,都是在Windows Server中下達Docker指令,但是,如果要透過另一台VM或是機器去呼叫遠端的VM的Container,必須先做幾個設定,首先,要更改遠端機器的daemon.json檔案,加入下面參數,並重啟Docker(Restart-Service docker)

1
"hosts": ["tcp://0.0.0.0:2375", "npipe://"]

須注意就是遠端機器的防火牆必須要開啟2375 Port,然後執行docker -H Remote IP:2375 info,就可以確認是否有通了,到了這部表示遠端機器已經開放Port讓你可以遠距執行Docker指令,接下來就是執行.yml檔案去建立Container,這次案例是建立好一個要啟動SQL Container,在yaml的描述檔的內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '2.1'
services:
SQLDB:
container_name: SQLTest2016
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: "XXXX"
image: microsoft/mssql-server-windows-express:SQLTest
ports:
- 14331:1433
volumes:
- C:\DB\:C:\DB\
networks:
default:
external:
name: nat

通常要執行這個yaml檔案會是放在要執行Container機器上,而這次是要透過自己電腦去啟動遠端的Container,所以,必須把yaml檔案放在自己電腦端,然後透過下面指令執行它

1
docker-compose -H Remote_IP -f docker-compose.yml up

就可以讓啟動遠端的Container了

參考來源


https://blog.yowko.com/2017/05/docker-command-in-windows.html
https://philipzheng.gitbooks.io/docker_practice/content/introduction/what.html